MacでPyTorchを使ったプログラムを実行したところ、No module named 'torch'で止まりました。

原因は、PyTorchを入れた.venvではなく、仮想環境の外側にあるPythonを使っていたことでした。

発生したエラー

小さな日本語LLMを作るtiny-jp-llmで、PyTorchのEmbeddingを確認するプログラムを実行しました。

cd scripts
python3 inspect_embedding.py

すると、import torchで止まりました。

Traceback (most recent call last):
  File "/Users/tako/developer-blog/experiments/tiny-jp-llm/scripts/inspect_embedding.py", line 7, in <module>
    import torch
ModuleNotFoundError: No module named 'torch'

エラーだけを見ると、PyTorchがインストールされていないように見えます。

ただ、このプロジェクトでは、すでに次の手順を実行していました。

python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install -e .

pyproject.tomlにも、PyTorchを依存ライブラリとして書いています。

dependencies = [
    "numpy>=1.26,<3",
    "torch>=2.2,<3",
]

ということは、PyTorchがないのではなく、別の場所へ入っているのかもしれません。

実行しているPythonを確認する

まず、エラーが出た状態で、python3の場所を確認しました。

python3 -c "import sys; print(sys.executable)"

表示されたのは、プロジェクトにある.venv/bin/pythonではありませんでした。

続けて、そのPythonからPyTorchが見えるか確認します。

python3 -m pip show torch
WARNING: Package(s) not found: torch

このPythonには、PyTorchが入っていませんでした。

では、プロジェクトの.venvには入っているのでしょうか。

リポジトリのルートへ戻り、.venvにあるPythonを直接指定しました。

cd ..
.venv/bin/python -c "import sys, torch; print(sys.executable); print(torch.__version__)"

自分の環境では、.venvのPythonのパスとPyTorchのバージョンが表示されました。

/path/to/tiny-jp-llm/.venv/bin/python
2.14.0

PyTorchは消えていませんでした。.venvの中にきちんと入っています。

.venvとは?

今回使っていた.venvは、Pythonの仮想環境です。

Pythonの公式ドキュメントを読むと、仮想環境は、それぞれが別々にPythonパッケージを持つ仕組みのようです。

今回の状態を並べると、次のようになっていました。

仮想環境の外側にあるPython
└── torchなし

tiny-jp-llm/.venvのPython
└── torchあり

エラーが出たときは、上にある仮想環境の外側のPythonでプログラムを実行していました。

source .venv/bin/activateを実行すると、ターミナルでpython3と入力したときに、.venv側のPythonが選ばれるようです。

.venvを有効にする

リポジトリのルートで、.venvを有効にしました。

source .venv/bin/activate

念のため、もう一度Pythonの場所とPyTorchを確認します。

python3 -c "import sys, torch; print(sys.executable); print(torch.__version__)"

今度は、.venv/bin/pythonとPyTorchのバージョンが表示されました。

/path/to/tiny-jp-llm/.venv/bin/python
2.14.0

この状態で、最初に失敗したプログラムを実行します。

python3 scripts/inspect_embedding.py

今度はエラーにならず、Embeddingの配列と、トークンIDに対応する行が表示されました。

{
  "token_ids": [0, 2],
  "output": [
    [0.3367, 0.1288, 0.2345],
    [2.2082, -0.638, 0.4617]
  ]
}

これで解決です。

有効にせず実行する方法

.venvは、必ず有効にしなければ使えないわけではないようです。

Pythonの公式ドキュメントにも、仮想環境にあるPythonを直接指定すれば実行できると書かれています。

今回のプログラムなら、次のコマンドでも動きました。

.venv/bin/python scripts/inspect_embedding.py

どのPythonを使っているのかがコマンドから分かるため、シェルスクリプトなどではこちらも使えそうです。

.venvがまだない場合

.venv自体がない場合は、リポジトリのルートで作成します。

python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install -e .

最後のpython3 -m pip install -e .で、pyproject.tomlに書かれたPyTorchもインストールされます。

今回はpipだけで実行せず、python3 -m pipを使いました。いま選ばれているpython3と同じ環境へインストールしていることを確認しやすいためです。

解決してみて

今回はPyTorchを入れ直す必要はありませんでした。

同じpython3というコマンドでも、.venvを有効にしているかどうかで、使われるPythonとインストール済みのライブラリが変わります。

No module named 'torch'が出たら、すぐにインストールし直す前に、まず次のコマンドでPythonの場所を確認するのがよさそうです。

python3 -c "import sys; print(sys.executable)"

地味ですが、原因が分かるまで少し混乱したのでメモしておきます。

参考

ここまで読んでいただき、ありがとうございます。もしこの記事の技術や考え方に少しでも興味を持っていただけたら、ネクストのエンジニアと気軽に話してみませんか。

  • 選考ではありません
  • 履歴書不要
  • 技術の話が中心
  • 所要時間30分程度
  • オンラインOK

エンジニアと話してみる

関連リンク

AI・クラウド・データ分析のご相談はネクスト株式会社までお問い合わせください。