XnneHang

XnneHang

github
steam_profiles
douban

[tool.uv.index] にダイブして、uv の Python ミラーソースを設定します。| pypi を除外 | explicit と default パラメータ、および None パラメータ

Refrence:#

前回、私たちはtool.uv.index を使用して Pytorch の CPU または CUDA バージョンの torch と torchaudio を個別に設定する方法について触れました。

その中で、ある方がuv の Python ミラーソースを設定できるかどうかと質問されました。私もそのニーズがありました。なぜなら、時々uv が私のプロキシを利用できないことがあるからです。pip で直接ダウンロードした速度は 6MB/s ですが、uv で 20MB の Numpy をダウンロードするのに 7 分かかります。

その時、私たちの torch が指定しているのはindex-urlであり、実際には pip でソースを変更する際に変更するのもindex-urlです。

例えば:

#清华源
https://pypi.tuna.tsinghua.edu.cn/simple
# 阿里源
https://mirrors.aliyun.com/pypi/simple/
# 腾讯源
http://mirrors.cloud.tencent.com/pypi/simple
# 豆瓣源
http://pypi.douban.com/simple/

これらは実際にはすべて index-url です。そこで、前回の torch の index-url の設定を参考にします:

dependencies = [
    "funasr==1.2.4",
    "pyaml==25.1.0",
    "torch==2.1.0",
    "torchaudio==2.1.0",
]

[[tool.uv.index]]
name = "pytorch-cpu"
url = "https://download.pytorch.org/whl/cpu"
explicit = true

[tool.uv.sources]
torch = [
  { index = "pytorch-cpu" },
]
torchaudio = [
  { index = "pytorch-cpu" },
]

簡単に言えば、私たちはこのようにミラーソースを設定できます:

dependencies = [
     "numpy==1.26.4",
     "matplotlib==3.10.0"
]
[[tool.uv.index]]
name = "tsinghua"
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
explicit = true

[[tool.uv.index]]
name = "aliyun"
url = "https://mirrors.aliyun.com/pypi/simple/"
explicit = true

[tool.uv.sources]
numpy = [
      { index = "tsinghua"},
]

matplotlib = [
      { index = "aliyun"}
]

つまり、私たちは阿里源から matplotlib をダウンロードし、清华源から numpy をダウンロードします。

次に、簡単なスクリプトを書いてテストします。

しかし、こうすると、uv.lockの中で、私たちが指定したパッケージは確かにtsinghuaaliyunに向かっていますが、すべての依存パッケージはミラーソースを使用するようには解析されず、依然としてpypi.orgを使用します。

[[package]]
name = "matplotlib"
version = "3.10.0"
source = { registry = "https://mirrors.aliyun.com/pypi/simple/" }
dependencies = [
    { name = "contourpy" },
    { name = "cycler" },
    { name = "fonttools" },
    { name = "kiwisolver" },
    { name = "numpy" },
    { name = "packaging" },
    { name = "pillow" },
    { name = "pyparsing" },
    { name = "python-dateutil" },
]
sdist = { url = "https://mirrors.aliyun.com/pypi/packages/68/dd/fa2e1a45fce2d09f4aea3cee169760e672c8262325aa5796c49d543dc7e6/matplotlib-3.10.0.tar.gz", hash = "sha256:b886d02a581b96704c9d1ffe55709e49b4d2d52709ccebc4be42db856e511278" }
wheels = [
    { url = "https://mirrors.aliyun.com/pypi/packages/09/ec/3cdff7b5239adaaacefcc4f77c316dfbbdf853c4ed2beec467e0fec31b9f/matplotlib-3.10.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2c5829a5a1dd5a71f0e31e6e8bb449bc0ee9dbfb05ad28fc0c6b55101b3a4be6" },
    ...

[[package]]
name = "numpy"
version = "1.26.4"
source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }
sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/65/6e/09db70a523a96d25e115e71cc56a6f9031e7b8cd166c1ac8438307c14058/numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010", size = 15786129 }
wheels = [
    { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a7/94/ace0fdea5241a27d13543ee117cbc65868e82213fb31a8eb7fe9ff23f313/numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0", size = 20631468 },
    ...

[[package]]
name = "packaging"
version = "24.2"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 }
wheels = [
    { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 },
]

これはなぜでしょうか?私は、英語が苦手だからだと気づきました。

explicit = trueは除外の意味です。

An index can be marked as explicit = true to prevent packages from being installed from that index unless explicitly pinned to it. For example, to ensure that torch is installed from the pytorch index, but all other packages are installed from PyPI, add the following to your pyproject.toml:
インデックスはexplicit = trueとしてマークされ、明示的にそのインデックスに固定されない限り、そのインデックスからパッケージがインストールされないようにすることができます。たとえば、torchがpytorchインデックスからインストールされ、他のすべてのパッケージがPyPIからインストールされることを確認するには、次のようにpyproject.tomlに追加します:

したがって、私たちが時々指定したい場合、explicit = trueパラメータを使用します。通常の時は、私たちのpypiを使用します。

また、defualtパラメータも提供されています。

By default, uv includes the Python Package Index (PyPI) as the "default" index, i.e., the index used when a package is not found on any other index. To exclude PyPI from the list of indexes, set default = true on another index entry (or use the --default-index command-line option):
デフォルトでは、uvはPythonパッケージインデックス(PyPI)を「デフォルト」インデックスとして含めます。つまり、他のインデックスでパッケージが見つからない場合に使用されるインデックスです。PyPIをインデックスのリストから除外するには、別のインデックスエントリでdefault = trueを設定します(または--default-indexコマンドラインオプションを使用します):

defualt パラメータはpypiソースを直接置き換え、排除します。指定したミラーソースにパッケージが見つからない場合でも、pypiを検索しません。

defualtのみを設定した場合、実際にはいくつかの問題があります。なぜなら、時々パッケージが適時にメンテナンスされていなかったり、ミラーサイトが時折不安定になると、正常に動作しなくなるからです。

[tool.uv.index]** にはパラメータなしのオプションもあります。** つまり、次のように書きます:

[[tool.uv.index]]
# インデックスのオプション名。
name = "pytorch"
# インデックスの必須URL。
url = "https://download.pytorch.org/whl/cpu"

インデックスは定義された順序で優先され、依存関係を解決する際に、設定ファイルにリストされた最初のインデックスが最初に参照され、コマンドラインを介して提供されたインデックスが設定ファイル内のインデックスよりも優先されます。
インデックスはその定義順序で優先され、依存関係を解決する際に、設定ファイルにリストされた最初のインデックスが最初に参照され、コマンドラインを介して提供されたインデックスが設定ファイル内のインデックスよりも優先されます。

デフォルトでは、uv は Python パッケージインデックス(PyPI)を「デフォルト」インデックスとして含めます。つまり、他のインデックスでパッケージが見つからない場合に使用されるインデックスです。PyPI をインデックスのリストから除外するには、別のインデックスエントリで default = true を設定します(または --default-index コマンドラインオプションを使用します):


つまり、`default`や`explicit`パラメータなしで、まるで`conda channels`のようです:<br>

```shell
channel URLs : https://repo.anaconda.com/pkgs/main/linux-64
              https://repo.anaconda.com/pkgs/main/noarch
              https://repo.anaconda.com/pkgs/r/linux-64
              https://repo.anaconda.com/pkgs/r/noarch

それは、あなたが定義した順序に基づいて優先順位を持ち、最上位が最優先され、すべて見つからない場合はdefaultを使用します。デフォルトはpypiで、自由に設定できます。特定のパッケージに対して index を指定するためにexplicitを使用することもできますが、source を指定する必要があります。次のように:

[tool.uv.sources]
torch = [
  { index = "pytorch-cpu" },
]
torchaudio = [
  { index = "pytorch-cpu" },
]

非常に完璧でシンプルな設計です。

最終的に私たちが決定した設定は次のようになります:

[[tool.uv.index]]
# インデックスのオプション名。この部分は書かなくても良い
name = "tsinghua"
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
default = true

[[tool.uv.index]]
name = "aliyun"
url = "https://mirrors.aliyun.com/pypi/simple/"

私たちは清华源を pypi の代わりに使用し、pypi を排除し、次に aliyun をバックアップとして設定しました。清华源(aliyun の上に定義されているため、優先順位が高い)が見つからない場合、阿里源で検索を試みます。

https://github.com/MrXnneHang/test-uv-index/blob/master/uv.lockを見てみると、

今回は uv.lock の中で、清华源が私たちの主役です。=-=

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。