PythonをGPUでぶん回すための環境構築できちゃった。

## 1. はじめに
どうも、趣味でデータ分析している猫背な組み込みエンジニアです。

今回はGPUでPython環境を動かしたいと思って、１か月間試行錯誤して構築完了したので手順をまとめていきたいと思います。目標はVSCodeにも対応してて、PythonをGPUでぶん回せる環境構築です。
余談ですが、大学時代から全然触っておらず、最近知ったのですがtensorflow-gpuが廃止されて、tensorflow2が主流になっているんですね。

## 2. GPUとは？
GPU（Graphics Processing Unit）は、コンピュータのグラフィック処理を担当するプロセッサです。従来、GPUは主にゲームやビデオ再生などのグラフィック処理に使用されてきましたが、近年では演算にも利用されるようになっています。
GPUを利用するメリットとしては、高速な並列処理、浮動小数点演算性能の向上、大規模なデータ処理能力、エネルギー効率の向上があります。私もこの環境で大規模データ処理を計画していますので、ぜひとも構築したいと思っていました。

## 2. PC環境
別記事に投稿予定ですので、簡単に記載致します。
実は初めて作ったPCにしては満足しています。以下に簡単にパーツを紹介いたします。

| パーツ名 | 名称 |
|:-:|:-:|
| GPU | Palit GeForce RTX 4060Ti Dual 8GB |
| CPU | AMD Ryzen 7 7700X 8-Core |
| メモリA | Team Vulcanシリーズ DDR5-5600MHz 16GB x2 |
| メモリB | CORSAIR VENGEANCEシリーズ DDR5-6000MHz 16GB x2 |
| マザーボード | ASUS B650M-PLUS |
| ストレージA | Lexar m.2SSD 2TB |
| ストレージB | fanxiang SSD 1TB |
| LANボード | LGY-PCIE-MG2 |
| OS | Windows11 Pro |

## 3. 環境構築の準備（CUDA関係）
まずはじめにTensorflowをGPU上で高速演算させるためにCUDAとcuDNNのバージョンを設定します。こちらも別記事で詳細を紹介する予定です。
では早速構築していきましょう。ちなみに私が現在使っているNVIDIAハードウェアのドライババージョンは551.23でした。

### 3.1 CUDA toolkit
CUDA toolkitは互換性の観点を考えて、バージョン11.8を選択しました。選択項目は写真のように選択しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528290/8f37fe8f-aaa1-75b0-eb57-23d3862ddaad.png)

https://developer.nvidia.com/cuda-11-8-0-download-archive

ダウンロード後にexeを起動して、「使用許諾契約書」「オプション」「インストール」を実施します。私は高速設定ですべてNEXTしました。

インストール完了確認として、以下のコマンドを「コマンドプロンプト」で実行してみてください。

```cmd:cmd
> where nvcc
```

:::note info
期待値
```cmd:cmd
> NVIDIA GPU Computing Toolkit\CUDA\v11.8\bin\nvcc.exe
```
:::

### 3.2 cuDNN
次にcuDNNをインストールします。cuDNNはNvidia Developerのユーザー登録と興味があるものを選択しなくちゃいけないみたいでした。

登録が完了しましたら、cuDNNのzipファイルをインストールします。他の記事ではcuDNN9未満で実施している方がいたのですが、cuDNN9しか見つけれなかったので、こちらをインストールしました。選択項目は写真のように選択しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528290/315c9dfa-79f5-3aaa-5ff2-4dfab000a835.png)

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

zipを解凍して、bin, include, libの３つのファイルを先ほどインストールしたNVIDIA GPU Computing Toolkit\CUDA\v11.8のなかに上書きしましょう。

インストール完了確認として、以下のコマンドを「コマンドプロンプト」で実行してみてください。

```cmd:cmd
> where cudnn64_8.dll
```

:::note info
期待値
```cmd:cmd
> NVIDIA GPU Computing Toolkit\CUDA\v11.8\bin\cudnn64_8.dll
```
:::

### 3.if 環境変数の確認
もし3.1/3.2のコマンドで何も表示されていない場合は、path設定が通ってない可能性があります。
「システム環境変数の編集」を確認しましょう。
検索からシステム環境変数の編集を探して、開いてください。
写真のように環境変数の中のシステム環境変数、特にCUDAに関係するPATHを確認してください。
※基本的に自動で設定されるようになっています。ここがあってないとTensorflowがインストールされません。

![スクリーンショット 2024-02-17 160803.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528290/c7e8b291-9071-05cf-e960-6655b2b600a6.png)

## 4. 環境構築の準備（仮想環境）
CUDAの準備が整ったら7割終わりです。
ここでは仮想環境を作ります。仮想環境を作る理由はたくさんありますが、特に依存関係の管理ができ、環境の整合性を確保できます。
今回はAnacondaを利用して、以下の手順で環境構築を実施しました。以下からインストールできます。

https://www.anaconda.com/download

インストール後に「Environments」を選択し、下の「Create」ボタンから仮想環境を追加して下さい。名前は自由に決めてください。私はPythonのバージョンがわかるようにgpu310にしました。

Pythonのバージョンを選択できますが、ここではTensorFlowに対応している3.10を選択します。

![anaconda_photo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528290/93456fb3-c2e3-cf49-f2fb-bb3573a7bafe.png)

先ほど作成した仮想環境(▶)を選択して、OpenTerminalを押します。
ターミナルが立ち上がったら成功です。

:::note info
期待値
cmd上で(gpu310)のように仮想環境名が表示されます。
```cmd:cmd
(gpu310) >
```
:::

## 5. Tensorflow2環境を構築する。
* 残りはTensorflowのパッケージを入れるのみです。まずはじめに以下のコマンドでPythonのバージョンを確認します。
```cmd:cmd
(gpu310)> python --version
```
:::note info
期待値
Versionは3.10であるかの確認。
```cmd:cmd
(gpu310) > 3.10.13
```
:::

* pipとsetuptoolsの更新を実施します。
```cmd:cmd
(gpu310)> python -m pip install -U pip setuptools
```

* Jupyter Qt Console(Pythonコンソール), Jupyter Notebook, Jupyter Lab, Nteract spyderをインストールします。
※エディタ系は好きなものだけでも大丈夫だと思います。私は全部入れました。
```cmd:cmd
(gpu310)> python -m pip install -U pip setuptools jupyterlabjupyter jupyter-console jupytext PyQt5 nteract_on_jupyter spyder
```

* TensorFlow2をインストールする前に以前のパッケージやtensorflowに関連するパッケージをクリーンアップします。これを実行しないと依存関係うんぬんでエラーを吐くので注意。
```cmd:cmd
(gpu310)> python -m pip uninstall -y tensorflow tensorflow-cpu tensorflow-gpu tensorflow-intel tensorflow-text tensorflow-estimator tf-models-official tf_slim tensorflow_datasets tensorflow-hub keras keras-tuner keras-visualizer
```

* TensorFlow2.10 GPU版とkeras,関連するパッケージを再インストールします。合わせて4つほどインストールしました。
```cmd:cmd
(gpu310)> python -m pip install -U tensorflow==2.10.1 tf_slim tensorflow_datasets tensorflow-hub keras keras-tuner keras-visualizer
(gpu310)> python -m pip install git+https://github.com/tensorflow/docs
(gpu310)> python -m pip install git+https://github.com/tensorflow/examples.git
(gpu310)> python -m pip install git+https://www.github.com/keras-team/keras-contrib.git
```
* 最後にTensorflowがGPUメモリの割り当てを動的に拡張できるように設定します。こちらは管理者権限がいるので、コマンドプロンプトの立ち上げの際に「管理者として実行」を押して管理者モードで以下を実行してください。
```cmd:管理者cmd
C:\Windows\System32> powershell -command "[System.Environment]::SetEnvironmentVariable(\"TF_FORCE_GPU_ALLOW_GROWTH\", \"true\", \"Machine\")"
```

ここまで完了したら、tensorflowが入っているかの確認とGPUが認識されているかの確認を実施します。
* TensorFlowのパッケージ情報の表示するためのコマンド
```
(gpu310)> pip show tensorflow
```
:::note info
期待値
cmd上でtensorflowの情報が表示されます。
```cmd:cmd
Name: tensorflow
Version: 2.10.1
Summary: TensorFlow is an open source machine learning framework for everyone.
Home-page: https://www.tensorflow.org/
Author: Google Inc.
Author-email: packages@tensorflow.org
License: Apache 2.0
Location: c:\users\***\anaconda3\envs\gpu310\lib\site-packages
Requires: absl-py, astunparse, flatbuffers, gast, google-pasta, grpcio, h5py, keras, keras-preprocessing, libclang, numpy, opt-einsum, packaging, protobuf, setuptools, six, tensorboard, tensorflow-estimator, tensorflow-io-gcs-filesystem, termcolor, typing-extensions, wrapt
Required-by:
```
:::

* TensorFlowがGPUを認識しているか確認するためのコマンド。
```
(gpu310)> python -c "import tensorflow as tf; print( tf.__version__ )"
```
:::note info

期待値
cmd上でCPU情報とGPU情報が表示されます。device_type:"GPU"があれば成功です。
```cmd:cmd
2024-02-17 11:46:19.810174: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX AVX2
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2024-02-17 11:46:25.727730: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1616] Created device /device:GPU:0 with 5529 MB memory:  -> device: 0,name: NVIDIA GeForce RTX 4060 Ti, pci bus id: 0000:01:00.0, compute capability: 8.9
[name: "/device:CPU:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 4060339216641810152
xla_global_id: -1
, name: "/device:GPU:0"
device_type: "GPU"
memory_limit: 5797576704
locality {
  bus_id: 1
  links {
  }
}
incarnation: 11925033124010026198
physical_device_desc: "device: 0, name: NVIDIA GeForce RTX 4060 Ti, pci bus id: 0000:01:00.0, compute capability: 8.9"
xla_global_id: 416903419
]
```
:::

## 6. GPU認識テスト
うん、なんかできてそうですね。では、締めとして、以下のPythonソースを実行してみましょう。Pythonとコマンドプロンプトで打つと立ち上がりますので、
```cmd:cmd
(gpu310)> python
Python 3.10.13 | packaged by Anaconda, Inc. | (main, Sep 11 2023, 13:24:38) [MSC v.1916 64 bit (AMD64)] on win32
>>> import tensorflow as tf
>>> tf.test.is_gpu_available()
```

:::note info
期待値
Trueと返ってきたら成功。
```
WARNING:tensorflow:From <stdin>:1: is_gpu_available (from tensorflow.python.framework.test_util) is deprecated and will be removed in a future version.
Instructions for updating:
Use `tf.config.list_physical_devices('GPU')` instead.
2024-02-17 19:01:54.348353: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX AVX2
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2024-02-17 19:01:54.609409: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1616] Created device /device:GPU:0 with 5529 MB memory:  -> device: 0, name: NVIDIA GeForce RTX 4060 Ti, pci bus id: 0000:01:00.0, compute capability: 8.9
True
```
:::

## 7. まとめ
なぜかAMDの表示がタスクマネージャに出ているみたいだけど、これは大丈夫なのかな。ちょっとしらべてみるか。。。
けど、1か月近く試行錯誤してできなかったので、構築できてすっきりしました。次週からは機械学習使ってデータ分析やチャート予測、APIの開発をしていきたいと思っています。
読んでいただきありがとうございました。では、よい開発らいふを！

## 8. 参考文献
https://www.tensorflow.org/install?hl=ja

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

https://note.com/hcanadli12345/n/nb8cf59ca2596