11
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GPU マシンに直接 PyTorch 環境を構築するときの手順と注意点

Posted at

手元の古い GPU マシンに PyTorch 環境を構築しようとして、昔やったように構築したら動きませんでした (PyTorch と GPU の不整合で)。エラーメッセージから原因はわかるし解決も難しくないですが、そもそも最初から失敗しない手順を記します。

先に注意点のまとめ

手元の GPU マシンに直接 PyTorch 環境を構築するとき、(昔に環境構築が上手くいった経験がある人ほど) 以下の点に注意が要ると思います。

  • 近年の PyTorch には CUDA ランタイムが同梱されているため [1]、別途 CUDA をインストールしておく必要はありません (PyTorch をカスタムビルドする場合を除き)。ドライバさえインストールされていればよいです。
  • ドライバのコマンド nvidia-smi で CUDA Version が表示されますが、これはドライバがその CUDA Version の命令にまで対応できるだけであり、手元の GPU も対応できるとは限りません (特に手元の GPU が古い場合は)。どの CUDA バージョン向けの PyTorch をインストールすればよいかは、torch/cuda/__init__.py:317-322 から手元の GPU の Compute Capability が含まれる CUDA バージョン向けの PyTorch を選ぶ必要があります (このような情報はドキュメントにあるべきだと思いますが私が見つけられていません)。
  • よく torch.cuda.is_available() によって PyTorch が CUDA を利用できるか確認しますが、これは「この PyTorch が CUDA サポート付きでコンパイルされていること」「PyTorch から GPU が 1 つ以上みえること」を確認するだけで、「PyTorch 内のビルド成果物と手元の GPU が整合的であること」ことまでは確認しません。torch.cuda.get_device_name(0) まで実行すると整合的でないときに警告メッセージが出ます (手元では)。本当に利用できるか確認するには、実際に GPU を利用した学習まで回してみるのが安全です。

間違った PyTorch 環境構築手順

手元のマシンは Windows 11 で GeForce GTX 1060 が搭載されています。このマシンに直接 PyTorch 環境を構築するとき、以下の手順を踏むと、失敗します。

  1. まずはドライバをインストールするため、ドライバーの手動検索 で Windows 11 + GeForce GTX 1060 の場合のドライバを検索したところ、NVIDIA Studio ドライバー バージョン 581.57 がヒットしたのでこれをインストールしました。ドライバのインストール後にコマンド nvidia-smi を打つと、Driver Version: 581.57 CUDA Version: 13.0 と表示されました。
  2. そのように表示されたので、CUDA ダウンロードサイト から Windows 11 用の CUDA 13.0 をインストールしました。
  3. PyTorch も CUDA 13.0 対応版をインストールしました。torch.cuda.is_available() を実行した結果は無事に True となりました。

しかし、いざ PyTorch でテンソルを GPU に送ると「あなたの GPU の Capability は 6.1 だが、この PyTorch がサポートする範囲 7.5-12.0 なので CUDA 12.6 向けの PyTorch を入れ直しなさい」という UserWarning が出力されました。そうはいっても実は学習できないか試すと、 RuntimeError が出てやはりだめでした。

      Found GPU0 NVIDIA GeForce GTX 1060 which is of cuda capability 6.1.
      Minimum and Maximum cuda capability supported by this version of PyTorch is
      (7.5) - (12.0)

      Please install PyTorch with a following CUDA
      configurations:  12.6 following instructions at
      https://pytorch.org/get-started/locally/
RuntimeError: CUDA error: CUBLAS_STATUS_ARCH_MISMATCH when calling `cublasCreate(handle)`

間違っていた点

先の手順には全ての手順に間違っている (望ましくない) 点があります。

  • 手順 1. で促されるままにバージョン 581.57 のドライバをインストールしましたが、CUDA とドライバのバージョン対応表をみると、CUDA 12.X 系に対応するドライバのバージョンは「525 以上 580 未満」のようです。といっても、後方互換性はあるようなので、バージョン 580 以上のドライバを既に入れたなら入れ直す必要まではないと思います。
  • 手順 2. で CUDA をインストールしていますが、近年の PyTorch には GPU を動かすための CUDA ランタイムが同梱されているため [1]、PyTorch を手元でカスタムビルドしたいのでない限りは CUDA を別途インストールする必要はありません
  • 手順 3. でドライバのコマンド nvidia-smi で表示された CUDA Version: 13.0 に対応するPyTorch をインストールしていますが、これは「このドライバはこのバージョンの CUDA の指示まで GPU に伝えられます」という意味であり、「この GPU はこのバージョンの CUDA から指示できます」という意味ではありません。ではどの CUDA バージョンに対応する PyTorch を選ぶべきかというと、
# TORCH_CUDA_ARCH_LIST for PyTorch releases
PYTORCH_RELEASES_CODE_CC: dict[str, set[int]] = {
    "12.6": {50, 60, 70, 80, 86, 90},
    "12.8": {70, 80, 86, 90, 100, 120},
    "13.0": {75, 80, 86, 90, 100, 110, 120},
}
  • また、手順 3. で torch.cuda.is_available() によって PyTorch が CUDA を利用できるかを確認していますが、これは「この PyTorch が CUDA サポート付きでコンパイルされていること」「PyTorch から GPU が 1 つ以上みえること」を確認するだけで、「PyTorch 内のビルド成果物と手元の GPU が整合的であること」ことまでは確認しません。torch.cuda.get_device_name(0) まで実行すると整合的でないときに警告メッセージが出ます (手元では)。
torch.cuda.is_available()  # True
torch.cuda.device_count()  # 1
torch.cuda.current_device()  # 0
torch.cuda.get_device_name(0)  # ここで初めて警告メッセージ

正しい PyTorch 環境構築手順

反省を踏まえると、手元の GPU マシンに直接 PyTorch 環境を構築するには以下の手順を踏むとよいのではないかと思います。

  1. まずは手元の GPU の Compute Capability (新しい GPU / 古い GPU) を確認します。
    • 手元の GeForce GTX 1060 の Compute Capability は 6.1 です。
  2. torch/cuda/__init__.py:317-322 のうち手元の GPU の Compute Capability が含まれる行を確認し、「CUDA X.X 向けの PyTorch を入れるべきか」を決定します。
    • 例えば、Compute Capability が 6.x なら、この中で 60 が含まれるのは 12.6 だけなので、CUDA 12.6 向け PyTorch しか選べません (より古いリビジョンならより古い CUDA 向けもあるはずだが、PyTorch のバージョンも古くなることに留意)。
  3. ここまで確認の上でドライバをインストールします。ドライバーの手動検索 で Windows 11 + GeForce GTX 1060 の場合のドライバを検索したところ、NVIDIA Studio ドライバー バージョン 581.57 がヒットします。ただし、CUDA とドライバのバージョン対応表をみると、CUDA 12.X 系に対応するドライバのバージョンは「525 以上 580 未満」なので、気になる場合は 580 未満のドライバを探してインストールします。ただ後方互換性はあるので、今回は気にせず最新版をインストールします (というか既に入れてしまった)。
  4. 次に、PyTorch for CUDA 12.6 をインストールします。torch.cuda.is_available() を実行した結果は True となり、torch.cuda.get_device_name(0) を実行した結果は何の警告もなく 'NVIDIA GeForce GTX 1060' となりました。

これで GPU を用いた学習をしたところ、問題なく動くことが確認できました。

備考

私たちの指示が GPU に伝わるまでのメモです。これを踏まえると正しい環境構築手順が踏めるかもしれないし踏めないかもしれません。

  • 私たちは Python 言語で PyTorch に計算指示を出します。
  • PyTorch は指示にしたがって、同梱のビルド成果物 (fatbin) のうち実行する GPU 向けの機械語 (cubin) のセクションを呼び出します。
  • ビルド成果物は同梱の CUDA ランタイムに指示を出します。
  • CUDA ランタイムは指示と指示を達成するメモリ利用計画も立ててドライバに伝えます。
  • ドライバは指示にしたがって GPU を動かします。

参考文献

  1. Is it required to set-up CUDA on PC before installing CUDA enabled pytorch? - #19 by ptrblck - PyTorch Forums
  2. [CUDA] NVIDIA GPUやCUDA周りの互換性を理解したかった
11
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?