雑記: Windows 11 上の CUDA と PyTorch のアップグレード

アップグレードをしたメモです。
OS は Windows 11、Python は 3.10.4、コマンドはすべて Git Bash 上で実行しています。
関連記事は Anaconda を利用していますが今回は別のマシンで直接システム環境にインストールしています。

目標とする CUDA のバージョンを確認する

  • PyTorch のウェブサイトから目標とする CUDA のバージョンを確認する。
    • この記事を書いている現在の PyTorch の Stable 版 (2.0.1) は CUDA 11.7 か 11.8 に対応している。念のため以下をみても torch-2.0.1 でそれ例外の CUDA バージョンに対応する wheel はない。

現在の GPU の型番、ドライバのバージョン、CUDA のバージョンを確認する

  • コマンド nvidia-smi でドライバのバージョンと GPU の型番が表示されるが GPU の型番は NVIDIA GeForce ... と見切れている。ドライバのバージョンは 512.15 である。
    なお、これをみると CUDA Version: 11.6 とあるがこれは CUDA ドライバ API のバージョンであり、今回あげたい CUDA ランタイム API のバージョンではない [2]。しかし、CUDA ランタイム API と同じかもっと高くあってもらわなければならないのでドライバのバージョンアップが必要であることがわかる。
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 512.15 Driver Version: 512.15 CUDA Version: 11.6 |
    |-------------------------------+----------------------+----------------------+
    | GPU Name TCC/WDDM | Bus-Id Disp.A | Volatile Uncorr. ECC |
    | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
    | | | MIG M. |
    |===============================+======================+======================|
    | 0 NVIDIA GeForce ... WDDM | 00000000:01:00.0 On | N/A |
    | N/A 57C P8 9W / N/A | 1166MiB / 6144MiB | 17% Default |
    | | | N/A |
    +-------------------------------+----------------------+----------------------+
  • 改めてコマンド nvidia-smi -LGPU の型番を確認する。NVIDIA GeForce GTX 1060 である。
    GPU 0: NVIDIA GeForce GTX 1060 (ry
  • コマンド nvcc -V で CUDA Toolkit のバージョンを確認する。11.3 である。
    Cuda compilation tools, release 11.3, V11.3.58
  • GPU の型番とドライバのバージョンは以下の方法でも確認できるが、コマンドで確認すればよい。
    • 「タスク マネージャー > パフォーマンス タブ > GPU」に GPU の型番が表示されている。
    • 「コントロール パネル > プログラム > プログラムと機能」から「NVIDIA グラフィックス ドライバー」のバージョンを確認する。

ドライバのバージョンとCUDA のバージョンを決めてインストールする

  • 今回、CUDA 11.7 か 11.8、およびそれ以上のドライバがほしい。
  • が、それらが GeForce GTX 1060 をサポートしていなかったらだめなので確認する。
  • ドライバダウンロードページにいって手元の GPU の型番と OS を入力する (下図)。
    「ダウンロード タイプ」が何か忘れてしまったがどちらでもいいはずである。
  • するとバージョン 536.67 のドライバ (下記リンク) が示唆されるが、
    https://www.nvidia.co.jp/download/driverResults.aspx/209432/jp
    追加情報タブからリンクがあるリリースノートを CUDA で検索すると CUDA ドライバ API のバージョンは 12.2 なのでちゃんと 11.8 以上である。なのでダウンロードしておく。
  • CUDA 11.8 もダウンロードしておく。
    https://developer.nvidia.com/cuda-toolkit-archive
  • ドライバ、CUDA の順にインストールする。画面の指示にしたがうだけである。
    再起動を促されたら再起動する。
  • インストールすると nvidia-smi nvcc -V の結果がちゃんと変わる。
    あと GPU の型番も見切れなくなっている。
    +---------------------------------------------------------------------------------------+
    | NVIDIA-SMI 536.67 Driver Version: 536.67 CUDA Version: 12.2 |
    |-----------------------------------------+----------------------+----------------------+
    | GPU Name TCC/WDDM | Bus-Id Disp.A | Volatile Uncorr. ECC |
    | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
    | | | MIG M. |
    |=========================================+======================+======================|
    | 0 NVIDIA GeForce GTX 1060 WDDM | 00000000:01:00.0 On | N/A |
    | N/A 50C P0 24W / 78W | 736MiB / 6144MiB | 1% Default |
    | | | N/A|
    +-----------------------------------------+----------------------+----------------------+
    Cuda compilation tools, release 11.8, V11.8.89

cuDNN をダウンロードして配置する

関連記事のときは cuDNN をダウンロードして配置していた。
which nvcc でバイナリが配置されているフォルダ bin の場所がわかる。
/c/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.8/bin/nvcc
ちなみに echo $PATH で PATH を表示すると上記の bin までのパスが勝手に追加されていた(それも過去のバージョンの CUDA より先になるように追加されていた)。

それで bin の横並びに include があるが過去のバージョンの CUDA と違い確かに cudnn.h が入っていない。
/c/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.8/include
cuDNN のダウンロードはどのような条件下で必要なのかわからないがダウンロードして配置しておく。

以下から for CUDA 11.x 系の最新の cuDNN をダウンロードする。
ダウンロードにはメールアドレスの登録が必要だが以前にもダウンロードしているので登録されていた。
cuDNN Archive | NVIDIA Developer
ダウンロードしたら解凍してファイル一式を対応するフォルダに移動する [3]。

PyTorch をインストールする
PyTorch のウェブサイトに戻って CUDA 11.8 を選択して実行すべきコマンドを取得する。なくてもいいのかもしれないが -U を入れておく。
pip install -U torch torchvision torchaudio \
--index-url https://download.pytorch.org/whl/cu118

PyTorch を動作確認する
そもそもバージョンを確認する。

import torch
print(torch.__version__)
print(torch.cuda.is_available())
2.0.1+cu118
True