RTX 3060 Tiが乗ったWin11 PCに、できるだけ簡単にTensorFlowとPyTorchのGPU版をいれてみた


# 理由
世間には「DeepLearningを勉強しよう」的な入門書がいくつも出ています。
これらたいてい、プログラミング言語としてはpythonを使っているようです。
ほぼ素のpythonを使ってほぼゼロから構築しよう([ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装　斎藤 康毅 著](https://www.oreilly.co.jp/books/9784873117584))なんてのもあるのですが、よりアプリケーション層(実用層?)に近いもの([ 生成 Deep Learning 第2版―絵を描き、物語や音楽を作り、ゲームをプレイする　David Foster 著、松田 晃一、小沼 千絵 訳](https://www.oreilly.co.jp/books/9784814400751/))なんかだと、高レベルのライブラリを使用していて、かつそれらを快適に学習動作するにはGPUの力を借りて計算させたほうが楽そうです。
自分も、最初は大昔のIntel Mac Book Proにpythonを入れてちまちまやっていたのですが、あまりに遅いのでイライラしてきて、結局手持ちの**Win11 PCにGPU版の機械学習ライブラリを入れてみました**。
そのときに気がついてことや、つまずいたことを簡単にメモっておきます。

# 主要ポイント
今回自分は初めてpythonの環境というものを作ってみたのですが、いろいろ細かいお決まりがあるみたいです。
色々、失敗してしまいましたが、最悪それらは消去して巻き戻せるようにしておいて作業は進めていくべきでしょう。
誰にも失敗はあります。

この作業のために、主に
「福山大工学部情報工学科金子邦彦研究室」の「GPU環境でのTensorFlow 2.10.1のインストールと活用（Windows 上）」

https://www.kkaneko.jp/tools/win/tensorflow2.html

のサイトを参照しました。
こちらは、大学の授業かなにかのためにいれる、という話のようで、単にTensorFlowのためというには環境が多すぎる気もしますが、大変参考にさせていただきました。
ありがとうございます。
結論としては、自分もまったく同じバージョンの**CUDA Toolkit(バージョン11.8.0)** と**cuDNN Sdk(バージョン8.9.7)** を入れています。
現状、TensorFlowとPyTorchのCuda(GPU)版をWindowsで使うには、このあたりが鉄板かなと思います。

またほかにも色々参考になるサイトはありましたので、それらにも感謝したいと思います。


# なぜ意外と難しいのか
最終的に構築する環境に至るまでに、各ハードウエアやドライバー、ライブラリのバージョン等に軽い依存関係があるためだと思われます。
今回は、以下のような主に階層的な依存関係があると思いました。
ただ、これらの中には、ありそうな雰囲気だけで実際には依存関係が無い(または薄い)ものや、逆に依存関係が無いと思っているけれど、実際にはあって、自分が気がついていないだけってのもあるかもしれません。

ビデオカード(RTX-3060Ti)
　　　↓
ビデオカードドライバ(バージョン560.76)
　　　↓
CUDA Toolkit(バージョン11.8.0)
　　　↓
cuDNN Sdk(バージョン8.9.7)
　　　↓
Python(バージョン3.10.16)　→　PyTorch(バージョン2.6.0)
　　　↓
TensorFlow-GPU(バージョン2.10.0)
　　　↓
NumPy(バージョン1.26.4)

ここではビデオカードは唯一のハードウエア層です。
ビデオカードドライバとCUDAは、ドライバー層です。ハードウエアと密接な関係があるので融通はききませんが、逆にしっかり管理されていて依存関係は明確です。
cuDNN、Python、TensorFlow-GPU、NumPyはライブラリ層です。
このへんになるとハードウエアとの関係性は希薄になってきますし、依存関係にあやふやなところも出てきます。
ハードウエアであるビデオカードというのは、各パソコンによって固定で変えられないものです。
ビデオカードドライバとCUDA Toolkitのバージョンはビデオカードによって、ほぼ決定します。サポートが続いていれば、このへんはコンスタントにバージョンアップされていきます。
cuDNNはライブラリ層の中では最もハードウエアに近くCUDA Toolkitのバージョンの影響をうけています。

## TensorFlow-GPUの問題
少しだけ状況を難しくしているのがWindows用のTensorFlowがCUDAサポートを終了しているということです。
Win版のTensorFlow-GPUの新しいバージョンが作られていないということです。
このため最新の環境をいれてやれば動くというわけにはいかなくなっています。しかし逆にあまりにも古い環境でやってしまうとそれは別の意味でリスクがありそうです。
それらを調整しながらやったとしても、実際の動作が保証されているわけでもありませんので、いろいろ様子をみながらということになります。
WindowsのCUDA上で動く、**TensorFlow-GPUの最終バージョンは2.10.0**になっているので、ドライバー層はそれにあわせます。
公ではありませんがCUDA Toolkit 11.x、cuDNN 8.x.xであれば動くようです。
Python環境は(NumPyも)TensorFlowのこのバージョンで動くものにあわせます。
PyTorchはWindows用のCUDAサポートがおこなわれているので、こちらは新しい環境のほうが、より良いでしょう。
各バージョンはこのへんの綱引きになります。

# インストールできるCUDA Toolkitのバージョンを確認しよう
使っているビデオカードによって、インストールできるCUDA Toolkitのバージョンが違ってきます。
以下のページのYour GPU Compute Capabilityというところで自分のビデオカードの内部的な型番を調べます(もしくは下記のWikipediaのCompute capability, 「GPU semiconductors and Nvidia GPU board products」の項でもわかります)。
![GFCudaVer.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80418/76cf42b8-d697-4f48-aee6-4651aa3c6ee3.jpeg)

https://developer.nvidia.com/cuda-gpus

「GeForce and TITAN Products」と「GeForce Notebook Products」があるんで、GeForce and TITAN Productsの、今回インストールしたい**Geforce RTX 3060 Ti**の項を見ましょう。
**「8.6」** ですね。
なんか、Wikipediaのほうになってしまって申し訳ないんですが、この番号から

![CudaSDKSupportVer.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80418/0f3fdcaa-ce75-48cc-9b0a-2d84f6391408.jpeg)

https://en.wikipedia.org/wiki/CUDA#GPUs_supported

の表を見ると入れられるCUDA Toolkitのバージョンがわかります。
CUDA Toolkitのverision 11.1~12.8が使用可能です。
今回はCUDA Toolkit 11.8をインストールすることにしました。

# 必要なビデオドライバーバージョンを確認しよう!
Cuda SDKが必要とするビデオドライバーのバージョンを確認します。
ドライバーのバージョンは、コマンドラインでやったり、デバイスマネージャーのディスプレイアダプターの該当ビデオカードを開いて、ドライバーの項のバージョン番号の下5桁を確認したりすればわかります。
あとはNvidiaのGUIで、ドライバーを表示したりすれば出てきます(ここでは560.70)。

![GFVer.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80418/92ccd3b3-93d3-4396-b6e0-1a7e434dcac2.jpeg)

https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html

の「Table 3 CUDA Toolkit and Corresponding Driver Versions」を確認すると必要最低限なドライバーのバージョンが書いてありますので、それビデオドライバーがそれ以上なことを確認します(今回は 520.06以上でした)。
ただし実は、** これはそんなに気にしなくても大丈夫なようです**。
後述する**CUDA Toolkitインストール時に、最低限必要なバージョンのドライバーはインストールされる**ためです。

# CUDA Toolkitをインストールしよう
**CUDA Toolkitのインストールは比較的難易度が高いです**。
色々失敗してしまうことも多いので、この項についてはいろいろ詳しく書いてあるページもあるので、自分はそれらも参考にしました。
経験から言うと(色々失敗した)

1. VisualStudio関係のインストールが多いが、Pythonで機械学習をやるのとは**無関係なのでインストールしなくてもOK**
2. 1回インストールに失敗すると、ゴミが残ってしまうので再トライの難易度が上がる。丁寧に**アンインストールしてから再インストール**する
3. CUDA Toolkit自体に、必要とする最低限のビデオドライバーは入っているので、古いドライバーなら上書いてくれる。逆に**新しいバージョンから古いのにしようとすると怒られることがある**

といったかんじです。
うまくいかない場合はカスタムインストールオプションにして、Visual Studio Integrationや、Nsight関係は全部切ってしまっても大丈夫なようです。
これらは主にCudaを直接使ってプログラミングするための機能だから、機械学習ライブラリとは関係ありません。

![CudaInstall.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80418/cf490bf4-355f-41e2-82a9-844b2a360c6a.jpeg)


# 必要なcuDNNのバージョンを確認しよう
cuDNNのホームページへ行って

https://developer.nvidia.com/cudnn-downloads

Resourcesの「・Archive of Previous Releases」へ行きます。
さらに「cuDNN 8.x - 1.x (December 2023 - August 2014)」を選択して、
cuDNN 8.x以前のCuDNNのダウンロードページへ行きます。
TensorFlow GPU版とPyTorch GPU版が対応しているのは、cuDNN 8.xです。
使用したCUDA Toolkitが11.8なので、**cuDNN v8.9.7 for CUDA 11.x**をダウンロードします。

![CuDNNVer.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80418/d0f37137-8469-46ba-8489-f8248955aaf0.jpeg)

Windows Zip版をダウンロードしようとしましたが、Nvidiaに登録しないとダウンロードできないようなのでメールアドレスを入れて登録してからダウンロードしました。

# cuDNNをインストールしよう
Archiveにはいっている古いバージョンのcuDNNは、ヘッダやスタティックライブラリ、ダイナミックライブラリを圧縮(Zip)して固めてあるだけなので、展開してから自分で配置してやるだけでOKです(新しいバージョンにはインストーラがある)。
自分は、**CUDA Toolkit**ディレクトリがある**C:\Program Files\NVIDIA GPU Computing Toolkit**に**CUDNN**というディレクトリを作って、そこに中身を全部移しました。
古いバージョンをインストーラを使わずにいれたときには、環境変数を自分で設定しなければなりません。
「システム環境変数」のウインドウを開いて、自分で
環境変数**CUDNN_PATH**を作成して **"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDNN"** を追加。
また **Path**に **"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDNN\bin"** を追加しました。

# CUDA ToolkitとcuDNNのバージョンについて

TensorFlowのホームページで「GPU サポート」のページの「ソフトウェア要件」ではTensorFlow-GPU 2.10.0は、
![TensorFlowSupportVer.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80418/265efb99-41ed-4b1f-a581-88ec8cb55fd1.jpeg)

CUDA Toolkit 11.2、cuDNN 8.1.0に対応していることになっていますが、自分は後述する理由によって**CUDA Toolkit 11.8、cuDNN 8.9.7という要件とは違う新しいバージョンをいれています**。
なぜかというと、TensorFlowと一緒に入れようと考えているPyTorchにそもそもCUDA Toolkit 11.2に対応したバージョンがありません。
それで新し目のバージョンをいれることにしました。
上述の「GPU環境でのTensorFlow 2.10.1のインストールと活用（Windows 上）」でも、同じようにCUDA Toolkit 11.8.0、cuDNN Sdk 8.9.7で入れているので、そこそこ実績もあるといえるでしょう。
また、そちらでも触れられているように、よりバージョンを上げて、 **CUDA Toolkit 12.0.0以上(バージョン12)、cuDNN Sdk 9.0.0以上(バージョン9)にまでしてしまうと、TensorFlow-GPUはまったく動かなくなってしまいます**。
これはインストールされるdll名等まで変わってしまうのでライブラリをまったく認識できなくなるからです。
例えばcuDNNはバージョンの9.x.xと8.x.xではdll名がcudnn64_9.dllとcudnn64_8.dllといったふうに明らかに違っていて互換性がありません、同じバージョン8.x.x内であれば特に問題は発生していません。

あまり新しすぎるとTensorFlow-GPUが対応していないし、古すぎるとPyTorchのサポートのほうが怪しくなってくるので、両方でGPU(Cuda)を使う場合、現状は「GPU環境でのTensorFlow 2.10.1のインストールと活用（Windows 上）」と同じように、

    CUDA Toolkit=11.8.0
    cuDNN Sdk=8.9.7
という選択がいいかもしれません。

# Anacondaをインストールしよう
楽にやりたかったのでAnacondaを使ってみました。
Anacondaは、多くのパッケージと仮想環境マネージャーが付属しているということで便利そうです。
コマンドラインでちまちまやるのも面倒なので「Anaconda Navigator」というGUI環境をつかいました。
まずはAnaconda Navigatorを落としてきてインストールしましよう。
ただしAnacondaには気をつける点があります。
Anacondaは簡単にパッケージを入れられますが、それらは最終的に必要な全パッケージということでは無さそうです。
結局、追加でpipコマンドを使ってパッケージを入れる必要がでてきます。
この場合問題なのはAnacondaとpipのパッケージ管理が全部に互換性があるわけではないので、色々パッケージのバージョンとかを操作しているとpythonの環境が修復不可能な感じに壊れてしまうことがあることです。
これは結構おこりがちなので、今回はこれを避けるために、python環境の基本と仮想環境はAnaconda NavigatorのGUIでやるけれど、以降のコマンドラインベースの操作はすべてpipでおこないました。
今のところTensorflowとPytorchでGPUが使えるひとつの環境しかいれていないのでわかっていませんが、今後、色々な環境を入れた場合、この切り分けでもうまくいかなくなってくる可能性もあるので、その場合は再度、Anacondaをやめる等、環境を変えてやってみるつもりです。

# Pythonをインストールしよう
![AnacondaNavigator.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80418/6fa38243-60f9-4e61-889f-f18463b98fbc.jpeg)

Anaconda Navigatorを起動し、左のバーで"Environments"を選択して"Create"を押し、仮想環境を作ります。

![CreateNewEnvironment.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80418/4c2c127b-75e5-40de-8f68-e71c04c5a688.jpeg)

仮想環境の名前を入れて(今回は"PythonGpu")、インストールするPythonのバージョンを入れます。
今回はバージョンはTensorFlowのホームページ


![TensorFlowVer.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80418/b6a2d212-2e8b-4bf1-bd6b-0bc6f8e6b609.jpeg)

https://www.tensorflow.org/install/source_windows?hl=ja

で確認したところWindows版"tensorflow_gpu-2.10.0"の動作環境はpythonバージョン3.7~3.10ってことで一番高い、**3.10.16にしました**。
環境を作って起動します。

# TensorFlowをインストールする
Anaconda Navigatorで環境を選択してWindowsのターミナルモードを起動、以下のように入力してインストールしました。

```
pip install tensorflow-gpu==2.10.0
```
動作確認のためプログラムを作成

```python
import tensorflow as tf
print("TensorFlow Version:", tf.__version__)
print("Num GPUs Available: ", len(tf.config.list_physical_devices('GPU')))
```
実行すると**エラーが出てうまくいきません!!**
まったく動きません。。
エラーの頭のところを見ると
```
A module that was compiled using NumPy 1.x cannot be run in
NumPy 2.0.0 as it may crash. To support both 1.x and 2.x
versions of NumPy, modules must be compiled with NumPy 2.0.
Some module may need to rebuild instead e.g. with 'pybind11>=2.12'.
   
If you are a user of the module, the easiest solution will be to
downgrade to 'numpy<2' or try to upgrade the affected module.
We expect that some modules will need time to support NumPy 2.
```

どうやらnumpyが2.0以上だと動かないらしい。
numpyは1.xと2.xのバージョン間に非互換性があって、昔に作られたTensorFlow 2.10.0は、ライブラリをビルドしなおすかnumpyのバージョンを下げないと動かないらしいです。
```
pip uninstall numpy
```
でnumpyを一旦削除して
```
pip install numpy==1.26.4
```
1.x系numpyの最終バージョンの1.26.4をインストールしました。
そして先ほどのプログラムを実行

```
TensorFlow Version: 2.10.0
Num GPUs Available:  1
```
無事動きました。

# PyTorchのインストール
Pytorchホームページでチェックすると、

![PytorchInstall.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80418/5eb6f7e1-fc0e-4be4-8ca4-c5cb570fc262.jpeg)

CUDA Toolkit(11.8.0)の場合は
```
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
```
でインストールしろって書いてあるのでこれを実行します。
確認プログラムを作成
```python
import torch
print("PyTorch Version:", torch.__version__)
print("CUDA Available:", torch.cuda.is_available())
print("GPU Name:", torch.cuda.get_device_name(0))
```
実行します
```
PyTorch Version: 1.12.1+cu113
CUDA Available: True
GPU Name: NVIDIA GeForce RTX 3060 Ti
```
成功しました。

# 結論、その他(RTX 3060 Ti以外もOK!!)
一応、ここまで自分のRTX 3060 TiでTensorFlowとPyTorchを使うことを前提にして書いてきましたが、特定のビデオカードに限定せずに再度見直すと、CUDA Toolkitの古いGPUへのサポートの範囲は広く、バージョン11.8.0が使えるのは「GPU Compute Capability」が3.5以上あれば大丈夫なようです。

![CudaSDKSupportVer 2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80418/16ae5f1e-e31e-4df5-b099-cdd73fd882ed.jpeg)

これはGPUとしてはかなり古くても大丈夫で、

![GFCudaVer2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80418/69e1dc12-6669-4241-97df-5161eb0c785a.jpeg)

**GforceGT640** の一部まで入ってきますし。
表全体としては**GeForceGTX780** 以降であればほぼ大丈夫なよう。
これらは10年以上前の製品のようです。
そのまま

    CUDA Toolkit=11.8.0
    cuDNN Sdk=8.9.7
でいけるはず。
もちろんメモリー量とかの問題があるので実用的には微妙ですが、とりあえず動かすだけというなら古いビデオカードから、もちろん新しい**RTX4000(Ada Lovelace)系**までいけるなって感じです。
逆に厳しいのが最新の製品で、**RTX5000(Blackwell)系** はCUDA Toolkit 12.8にしか対応していないので、今回の方法ではTensorFlowはきびしいでしょう。
TensorFlowのCuda版はWSL2でDockerでやれって話なんで、それはそれで、お手軽感はなくなる気がしますね。