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 コマンドラインオプションを使用します):

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