俵言

しがない社会人が書く、勉強とかのこと。最近は機械学習や kaggle 関連がメイン。

poetry で直接指定する wheel file を url ではなく local path にすることで依存関係解決の度に download されるのを防げた件

背景

前回の記事では、poetry でライブラリの wheel file を直接 URL で指定することで依存関係の解決が長すぎる 問題*1を解消し、同一の poetry 環境に PyTorch と RAPIDs を共存させました。

tawara.hatenablog.com

これ自体は大成功だったのですが、wheel file の URL を指定すると依存関係の解決が走るたびに file が donwload されてしまいます。おそらく多くの poetry + PyTorch ユーザが同じ経験をしているのではないでしょうか。

「ローカルにあるファイルさえ指定できれば...!」と思っていた方も多かったと思います、というか僕が思っていました。

解決策

なんと、普通に公式に解決策が載っていました。シラナカッタ...

python-poetry.org

[tool.poetry.dependencies]
# directory
my-package = { path = "../my-package/", develop = false }

# file
my-package = { path = "../my-package/dist/my-package-0.1.0.tar.gz" }]

pyproject.toml において、path 引数によって local においた file (またはディレクトリ) を指定できます。

僕の場合は home directory 下にある chache ディレクトリ (/home/tawara/.cache) にとりあえず poetry_wheels というディレクトリを作り、そこに PyTorch と RAPIDs のファイルを wget で全てぶち込んで*2 path を指定しました。以下のような感じです。

torch = { path = "/home/tawara/.cache/poetry_wheels/torch-1.13.0+cu117-cp39-cp39-linux_x86_64.whl"}
torchaudio = { path = "/home/tawara/.cache/poetry_wheels/torchaudio-0.13.0+cu117-cp39-cp39-linux_x86_64.whl"}
torchvision = { path = "/home/tawara/.cache/poetry_wheels/torchvision-0.14.0+cu117-cp39-cp39-linux_x86_64.whl"}
rmm-cu11 = { path = "/home/tawara/.cache/poetry_wheels/rmm_cu11-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"}
ptxcompiler-cu11 = { path = "/home/tawara/.cache/poetry_wheels/ptxcompiler_cu11-0.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"}
cubinlinker-cu11 = { path = "/home/tawara/.cache/poetry_wheels/cubinlinker_cu11-0.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"}
cudf-cu11 = { path = "/home/tawara/.cache/poetry_wheels/cudf_cu11-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"}
dask-cudf-cu11 = { path = "/home/tawara/.cache/poetry_wheels/dask_cudf_cu11-22.10.0-py3-none-any.whl"}
pylibraft-cu11 = { path = "/home/tawara/.cache/poetry_wheels/pylibraft_cu11-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"}
ucx-py-cu11 = { path = "/home/tawara/.cache/poetry_wheels/ucx_py_cu11-0.28.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"}
raft-dask-cu11 = { path = "/home/tawara/.cache/poetry_wheels/raft_dask_cu11-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"}
cuml-cu11 = { path = "/home/tawara/.cache/poetry_wheels/cuml_cu11-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"}
pylibcugraph-cu11 = { path = "/home/tawara/.cache/poetry_wheels/pylibcugraph_cu11-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"}
cugraph-cu11 = { path = "/home/tawara/.cache/poetry_wheels/cugraph_cu11-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"}

結果として、例えば新しいライブラリを add とかした際にいちいち download されることがなくなりました。やったね!

因みに、local の path を指定すると、insall したライブラリを poetry show で確認した際にその path が表示されるようになりました*3。おそらくは同じライブラリ名でも違う local wheel file を使い場合を想定してるのかなって思いました。

おわりに

poetry に PyTorch を wheel の URL 直接指定で入れるようになってからずっと「いちいち download 待つの面倒だなぁ」と思っていたのですが、普通に解決方法があってリサーチ不足を思い知らされました。やっぱドキュメントはちゃんと読まなきゃですね。

調べるきっかけを下さった @colum2131 さん、@ryomak333 さん、ありがとうございました!

*1:正確には余計なものまで download して時間が大幅にかかる問題

*2:ダウンロードするURL の特定方法については前回の記事をご覧ください

*3:url 指定のときも表示されてたっけ...?