WindowsでGPUを使った機械学習をするためにCUDA、Pytorch、TensorFlow環境を整える

# この記事はなにか

せっかく強いPCがあるならGPU使ってこうぜ！ってことでWindowsでPythonのCUDA機械学習環境を整えたので、私自身の備忘録がてら、まとめておきます。

いろいろ試したけど、つまづいた方、これならうまくいってほしい！！ (私自身もめちゃめちゃつまづいたので...)

## 構築するもの

- scoop: Windows向けのパッケージマネージャーで、コマンドラインを通じてソフトウェアを簡単にインストール・管理できるツール
- Python: 俺たちのPython
- CUDA: NVIDIA製GPU向けの並列計算プラットフォームおよびAPI
- cuDNN: NVIDIAが提供するディープラーニング向けのGPUアクセラレーションライブラリで、CUDAと連携して動作
- Pytorch: 機械学習と深層学習のフレームワーク
- TensorFlow: Googleが開発したオープンソースの機械学習と深層学習のフレームワーク

## 前提

ターミナルやコマンドプロンプトが動作する。

# scoopのインストール

 Windows向けのパッケージマネージャーで、コマンドラインを通じてソフトウェアを簡単にインストール・管理できるツールである、scoopをインストールします。

Windowsキーで`powershell`と入力してEnterをしてpowershellを起動してください。

その後以下のコマンドを実行してscoopをインストールします。

```bash
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force
iwr -useb get.scoop.sh | iex
```

使い方や、何が便利かはちゃちゃっと調べるといっぱい出てきます。

# Pythonのインストール

今回、Pythonのインストールからはじめますが、単に、scoop install pythonとやると、最新版がインストールされてしまいます。 (全然インストールしてもよいです。)

しかし、CUDAを用いたTensorFlowは特定のバージョンのPythonでしか安定して動作するものがないので、今回はバージョンを3.10でインストールを進めます。

```bash
scoop install python310
```

また、グローバルに用いるpythonのバージョンを指定するために、以下のコマンドを実行してください。

```bash
scoop reset python310
```

これにて、Pythonのインストールは終了です。（簡単すぎ・・・）

## venvによる仮想環境の構築

venvでPython環境の管理を行います。

mkdirで適当な名前のフォルダを作って、

```bash
mkdir python-cuda-test
cd python-cuda-test
```

その中で以下を実行して、envファイルを作成してください。

```bash
python3 -m venv <env名 (project_env)>
```

次に、作成した仮想環境に入るには、以下を実行して下さい。(一応、macの場合はScript → binらしい)

この中でpip installなどを行います。

```bash
source <project_env>/Scripts/activate
```

抜けるときたい時は以下を実行してください。

# CUDAのインストール

CUDAのバージョンがめんどくさくてですね、最新版をいれるとTensorFlowとの互換性がなくて動かないことがほとんどです。現状、11.8が[互換性の情報](https://www.tensorflow.org/install/source?hl=ja#tested_build_configurations)もあり、良さそうとのことで、このバージョンをインストールします。

以下のサイトから、11.8を選択してください。

https://developer.nvidia.com/cuda-toolkit-archive

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1224463/d5530159-dcbd-3ad1-491a-9ecf8ebdf87b.png)


このようにして、無事インストールできたら成功です。

# cuDNNのインストール

CUDAと連携して動作するディープラーニング向けのライブラリである、cuDNNをインストールします。

以下のサイトからCUDA11.X系にあうcuDNNをインストールしてください。

https://developer.nvidia.com/rdp/cudnn-archive

zipを解凍すると、bin, include, libの３つのフォルダがある。

今回、CUDAの起動と同時にそれらを読み込んでほしいので、その中身を先ほどインストールした

`C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8` のbin, include, lib中にコピペをします。

これらを踏まえたうえで、以下を実行して問題なく表示されればOK。
```
where cudnn64_8.dll
```

# TensorFlowのインストール

先ほどPython3.10を入れた理由はここにある。今回、CUDAが安定動作するTensorFlowのバージョンは2.10系である。このTensorFlowはPython3.11以上ではインストールできない。

https://www.tensorflow.org/install?hl=ja&_gl=1*u5d167*_up*MQ..*_ga*MzU2Nzg2ODg4LjE3MzE1MTQwMzE.*_ga_W0YLR4190T*MTczMTUxNDAzMS4xLjAuMTczMTUxNDAzMS4wLjAuMA..

仮想環境の中に入ってTensorFlowをインストールします。

```bash
source <project_env>/Scripts/activate
```

https://developer.nvidia.com/rdp/cudnn-archive

大体必要なものをインストールしておきます。

```bash
python -m pip install tensorflow==2.10.1
python -m pip install tf_slim
python -m pip install tensorflow_datasets
python -m pip install tensorflow-hub
python -m pip install keras
python -m pip install keras-tuner
python -m pip install keras-visualizer
python -m pip install git+https://github.com/tensorflow/docs
python -m pip install git+https://github.com/tensorflow/examples.git
python -m pip install git+https://www.github.com/keras-team/keras-contrib.git
```

また、numpyも2系だと、うまく動作しないため、以下のように、バージョンを指定してインストールしてください。

```bash
pip install numpy==1.24.4
```

PytorchについてもCUDAのバージョンに沿ったものを入れなければならないため、以下をベースにインストールをしてください。

https://pytorch.org/
![image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1224463/a1790f43-4cb2-3adb-f3a9-4cc2a98c8cb4.png)


```bash
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
```

# 動作確認
以下のようにPythonを起動して、GPUが認識されていれば俺たちの勝利です。

```bash
$ python
Python 3.10.11 (tags/v3.10.11:7d4cc5a, Apr  5 2023, 00:38:17) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> tf.config.list_physical_devices('GPU')
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
>>> for gpu in tf.config.list_physical_devices('GPU'):
...     details = tf.config.experimental.get_device_details(gpu)
...     print(details)
...
{'device_name': 'NVIDIA GeForce RTX 4090', 'compute_capability': (8, 9)}
```

# その他

管理者権限でコマンドプロンプトを起動して、TensorflowがGPUメモリの割り当てを動的に拡張できるように設定しておくとよいことがあるかもしれません。

```bash
powershell -command "[System.Environment]::SetEnvironmentVariable(\"TF_FORCE_GPU_ALLOW_GROWTH\", \"true\", \"Machine\")"
```