poetry で直接指定する wheel file を url ではなく local path にすることで依存関係解決の度に download されるのを防げた件
背景
前回の記事では、poetry でライブラリの wheel file を直接 URL で指定することで依存関係の解決が長すぎる 問題*1を解消し、同一の poetry 環境に PyTorch と RAPIDs を共存させました。
これ自体は大成功だったのですが、wheel file の URL を指定すると依存関係の解決が走るたびに file が donwload されてしまいます。おそらく多くの poetry + PyTorch ユーザが同じ経験をしているのではないでしょうか。
「ローカルにあるファイルさえ指定できれば...!」と思っていた方も多かったと思います、というか僕が思っていました。
解決策
なんと、普通に公式に解決策が載っていました。シラナカッタ...
[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 さん、ありがとうございました!
wheelから依存関係読み取れるぽいので、見てくれてるんでしょうかね...?ベストプラクティス知りたいですね笑
— Ryoma.K (@ryomak333) December 1, 2022