⚠️

【uv】torchインストール後に古いライブラリが入る原因と対策

に公開

執筆背景

uv を利用して torch を利用するプロジェクトのライブラリ管理をしていたところ、uv の index 設定に気をつけないとある条件下で特定ライブラリのかなり古いバージョン(今回の場合は約2年前)がインストールされてしまうことに気づいた。

原因が分かりにくかったかつ uv の index 設定に注意する必要があることを思い出せるようにするために執筆した。

TL;DR(要約)

uv add torch --index <pytorch-index> を実行すると、pytorch index が PyPI より優先されるようになり( uv のドキュメント参照)、その後の uv add で古いバージョンのライブラリがインストールされる可能性がある。

解決策: pyproject.tomltorch 関連ライブラリのみ pytorch index を使用するよう明示する。

前提

uv で利用された Python バージョンは以下である。

Using CPython 3.11.13

また、 torchtorchvision のバージョンは記事執筆時点(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 後に torchtorchvision のインストールに利用する index を pyproject.tomltool.uv.index セクションで指定する。

pyproject.toml
[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.tomltool.uv.index セクションに以下のような設定が追加される。

[[tool.uv.index]]
url = "https://download.pytorch.org/whl/cu124"

これにより、ライブラリインストール時にこの pytorch index が PyPI よりも優先して参照されるようになる。ここで、 datasetsrequests に依存しており、 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.0requests>=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.1fsspec==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 を使用するようにできる

補足:この問題による transformersTrainer クラスのインポートエラー

私の場合はこれが原因で transformersTrainer クラスのインポートに失敗する問題も発生した。実際のところ、このインポートエラーがきっかけで datasets のバージョンが古いことに気づいた。

main.py
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 のバージョンが古いと transformersTrainer クラスのインポートに失敗するかというと、 このとき既に 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

以下のようなコードを実行するとこのことが確認できる。

main.py
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 であり、 PyExtensionType21.0.0 で削除されていた。そのため、 datasets のインポートに失敗し、結果として Trainer クラスのインポートに失敗していた。

Discussion