【uv】torchインストール後に古いライブラリが入る原因と対策
執筆背景
uv を利用して torch を利用するプロジェクトのライブラリ管理をしていたところ、uv の index 設定に気をつけないとある条件下で特定ライブラリのかなり古いバージョン(今回の場合は約2年前)がインストールされてしまうことに気づいた。
原因が分かりにくかったかつ uv の index 設定に注意する必要があることを思い出せるようにするために執筆した。
TL;DR(要約)
uv add torch --index <pytorch-index> を実行すると、pytorch index が PyPI より優先されるようになり( uv のドキュメント参照)、その後の uv add で古いバージョンのライブラリがインストールされる可能性がある。
解決策: pyproject.toml で torch 関連ライブラリのみ pytorch index を使用するよう明示する。
前提
uv で利用された Python バージョンは以下である。
Using CPython 3.11.13
また、 torch 、 torchvision のバージョンは記事執筆時点(2025年10月)での Kaggle ノートブックで利用されているバージョンに合わせている。
問題の概要
以下のコマンドを実行すると、
uv init --python "~=3.11.0"
uv add torch==2.6.0 torchvision==0.21.0 --index https://download.pytorch.org/whl/cu124
uv add evaluate
最後の uv add evaluate の実行時に datasets==2.14.4 というかなり古いバージョンのライブラリがインストールされてしまう。この記事を執筆した 2025-10-21 時点での最新バージョンは 4.2.0 であり、 2.14.4 は 2023-08-09 にリリースされたバージョンである。
+ datasets==2.14.4 # <- 古いバージョンがインストールされてしまう
解決方法
uv init 後に torch と torchvision のインストールに利用する index を pyproject.toml の tool.uv.index セクションで指定する。
[tool.uv.sources]
torch = { index = "pytorch" }
torchvision = { index = "pytorch" }
[[tool.uv.index]]
name = "pytorch"
url = "https://download.pytorch.org/whl/cu124"
explicit = true
これは、name = "pytorch" の index は明示的に指定されたライブラリのみに使用されるということを意味する(詳細は uv のドキュメント参照)。その後 --index オプションを付けずに一連のコマンドを実行する。
uv add torch==2.6.0 torchvision==0.21.0
uv add evaluate
すると、 uv add evaluate 実行時に datasets の最新バージョンがインストールされるようになる。
+ datasets==4.2.0 # <- 最新バージョンがインストールされるようになる
なぜこの問題が起きるのか
uv add torch==2.6.0 torchvision==0.21.0 --index https://download.pytorch.org/whl/cu124 を実行すると、 pyproject.toml の tool.uv.index セクションに以下のような設定が追加される。
[[tool.uv.index]]
url = "https://download.pytorch.org/whl/cu124"
これにより、ライブラリインストール時にこの pytorch index が PyPI よりも優先して参照されるようになる。ここで、 datasets は requests に依存しており、 pytorch index に存在する requests のバージョンは 2.28.1 である。
uvx pip index versions requests --index-url https://download.pytorch.org/whl/cu124
requests (2.28.1)
Available versions: 2.28.1
datasets==4.2.0 は requests>=2.32.2 を要求するため、 requests==2.28.1 で問題ない datasets のバージョンまで遡ってしまう。また、 pytorch index に存在する fsspec の最新バージョンが 2025.9.0 であり、これでも問題ない datasets のバージョンまで遡ってしまう。
uvx pip index versions fsspec --index-url https://download.pytorch.org/whl/cu124
fsspec (2025.9.0)
Available versions: 2025.9.0, 2024.6.1, 2024.2.0, 2023.4.0
その結果として、 datasets==2.14.4 がインストールされてしまう。
この事象は以下のコマンドで取得できるログで確認できる。
uv add evaluate --verbose > uv_debug.log 2>&1
このログを辿ると、まず datasets==4.2.0 のインストールが試みられ、このときに requests>=2.32.2 が要求されていることが分かる。
DEBUG Adding transitive dependency for datasets==4.2.0: requests>=2.32.2
しかし、優先される pytorch index に存在する requests のバージョンは 2.28.1 であるため、 datasets==4.2.0 のインストールが失敗し、 datasets のバージョンを下げていくことになる。
DEBUG Recording unit propagation conflict of datasets from incompatibility of (datasets, requests)
...
DEBUG Adding transitive dependency for datasets==4.1.1: requests>=2.32.2
...
DEBUG Adding transitive dependency for datasets==4.1.0: requests>=2.32.2
...
そして途中から fsspec に関する問題も発生する。pytorch index に存在する fsspec の最新バージョンは 2025.9.0 であり、これを優先しようとすると datasets にとってこれが新しすぎるバージョンになってしまう。
DEBUG Selecting: fsspec==2025.9.0 [preference]
...
DEBUG Adding transitive dependency for datasets==4.0.0: fsspec[http]>=2023.1.0, <=2025.3.0+
...
DEBUG Recording dependency conflict of datasets==4.0.0 from incompatibility of (datasets, fsspec[http])
そのため、 requests==2.28.1 と fsspec==2025.9.0 の両方と矛盾しない datasets のバージョンまで遡っていき、最終的に datasets==2.14.4 がインストールされることになる。
DEBUG Adding transitive dependency for datasets==2.14.4: fsspec[http]>=2021.11.1
...
DEBUG Adding transitive dependency for datasets==2.14.4: requests>=2.19.0
まとめ
-
--indexオプションで追加したindexはPyPIより優先される - pytorch indexには限られたバージョンのライブラリしか存在しない
- 結果として、意図せず古いバージョンがインストールされる可能性がある
-
pyproject.tomlで適切な index 設定をすることで、特定ライブラリのみに pytorch index を使用するようにできる
補足:この問題による transformers の Trainer クラスのインポートエラー
私の場合はこれが原因で transformers の Trainer クラスのインポートに失敗する問題も発生した。実際のところ、このインポートエラーがきっかけで datasets のバージョンが古いことに気づいた。
from transformers import Trainer
uv run main.py
ImportError: cannot import name 'Trainer' from 'transformers' (.venv/lib/python3.11/site-packages/transformers/__init__.py)
なぜ datasets のバージョンが古いと transformers の Trainer クラスのインポートに失敗するかというと、 このとき既に uv add pyarrow を実行しており、 datasets==2.14.4 にとって pyarrow のバージョンが新しすぎて datasets がインポートエラーを起こしたためであった。
実際に実行したコマンドは以下である。
uv add pyarrow
uv add transformers==4.52.4
uv add torch==2.6.0 torchvision==0.21.0 --index https://download.pytorch.org/whl/cu124
uv add evaluate
以下のようなコードを実行するとこのことが確認できる。
import traceback
print("Attempting to import Trainer...")
try:
from transformers import Trainer
print("✓ Success: Trainer imported")
except ImportError as e:
print(f"✗ Import failed with error:")
print(f" {e}")
print()
print("Attempting direct import to see actual error...")
try:
from transformers.trainer import Trainer
except Exception as e2:
print(f"✗ Actual error:")
traceback.print_exc()
uv run main.py
Attempting to import Trainer...
✗ Import failed with error:
cannot import name 'Trainer' from 'transformers' (/home/shutotakahashi/projects/reproduce-trainer-import-error/.venv/lib/python3.11/site-packages/transformers/__init__.py)
Attempting direct import to see actual error...
✗ Actual error:
Traceback (most recent call last):
File "/home/shutotakahashi/projects/reproduce-trainer-import-error/test.py", line 6, in <module>
from transformers import Trainer
ImportError: cannot import name 'Trainer' from 'transformers' (/home/shutotakahashi/projects/reproduce-trainer-import-error/.venv/lib/python3.11/site-packages/transformers/__init__.py)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/shutotakahashi/projects/reproduce-trainer-import-error/test.py", line 15, in <module>
from transformers.trainer import Trainer
File "/home/shutotakahashi/projects/reproduce-trainer-import-error/.venv/lib/python3.11/site-packages/transformers/trainer.py", line 198, in <module>
import datasets
File "/home/shutotakahashi/projects/reproduce-trainer-import-error/.venv/lib/python3.11/site-packages/datasets/__init__.py", line 22, in <module>
from .arrow_dataset import Dataset
File "/home/shutotakahashi/projects/reproduce-trainer-import-error/.venv/lib/python3.11/site-packages/datasets/arrow_dataset.py", line 67, in <module>
from .arrow_writer import ArrowWriter, OptimizedTypedSequence
File "/home/shutotakahashi/projects/reproduce-trainer-import-error/.venv/lib/python3.11/site-packages/datasets/arrow_writer.py", line 27, in <module>
from .features import Features, Image, Value
File "/home/shutotakahashi/projects/reproduce-trainer-import-error/.venv/lib/python3.11/site-packages/datasets/features/__init__.py", line 18, in <module>
from .features import Array2D, Array3D, Array4D, Array5D, ClassLabel, Features, Sequence, Value
File "/home/shutotakahashi/projects/reproduce-trainer-import-error/.venv/lib/python3.11/site-packages/datasets/features/features.py", line 634, in <module>
class _ArrayXDExtensionType(pa.PyExtensionType):
^^^^^^^^^^^^^^^^^^
AttributeError: module 'pyarrow' has no attribute 'PyExtensionType'
この時 pyarrow==22.0.0 であり、 PyExtensionType は 21.0.0 で削除されていた。そのため、 datasets のインポートに失敗し、結果として Trainer クラスのインポートに失敗していた。
Discussion