TensorflowでGPUを使う（初心者編）

# はじめに
　学校の研究を行うにあたって、Tensorflowによる機械学習が必要になりました。その際、CPUだと時間がかかるのでGPUを用いようとしたのですが、環境構築に1日ほどかかったので、その様子を残しておきたいなと思いこの記事を書きました。プログラミング初心者であるうえ、記事を書くのも初めてなので至らないところも多々あると思いますが読んでいただけると嬉しいです。

# 環境
・Windows11
・GPU : RTX 3070 Laptop

 # 挫折
　まず、なぜ環境構築にこんなにも時間がかかったかを説明します。
はじめは、いろいろなネット記事で紹介されている通り、
1. NVIDIAドライバーのインストール　
2. CUDAのダウンロード　
3. cuDNNのダウンロード　
4. Tensorflowのダウンロード　

と手順通りに行いました。しかし、TensorflowでGPUを使うことはできませんでした。
色々調べていったところ、WindowsではTensorflow2.11.0以降GPU版は使えないとのことでした。ここにたどり着くまでに多くの時間を費やしてしまいました。

# 解決策
　解決策を調べていくと、次の２つであることがわかりました。
 1. Tensorflow2.10など古いバージョンで利用する
 2. WSL2にTensorflowをインストールして利用する
 
[公式ドキュメント](https://www.tensorflow.org/?hl=ja)で推奨されている方法は2の方法なのですが、なんせ初心者でLinuxすらもあやふやなので今回は比較的簡単な1の方法で環境構築していきたいと思います。
また、いろいろ勉強して身についてきたら2の方法についての記事も書いてみたいと思います。

# 構築
## NVIDIAドライバー
　まず初めにNVIDIAドライバーのインストールを行います。以下の公式サイトからダウンロードを行います。

https://www.nvidia.com/ja-jp/drivers/

インストールするドライバを選択するために、自分のGPUのスペックを調べます。Windowsのコマンドプロンプトで次のコマンドを実行します。
```powershell
wmic path win32_VideoController get name
```
すると次のように表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4091076/8feefb77-508a-407a-83cd-15e1cda2395a.png)

私の場合は、GPU：Geforce RTX 3070 Laptop GPU なので以下の画像のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4091076/d494f943-232e-4bb0-8a2e-38201fff1152.png)

検索すると以下のように表示されるのでダウンロードを行ってください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4091076/63eabcd4-0f37-4021-8df3-712d2d098a99.png)

## Tensorflow-GPU
　GPU版のTensorflowをインストールします。GPU版をインストールすることでCUDAtoolkitとcuDNNが付属したTensorflowを入手できます。

 はじめにAnaconda Promptを開き、次のコマンドで新しい環境を作成し有効化してください。[公式ドキュメント](https://www.tensorflow.org/?hl=ja)を見るとPythonの環境は 3.7～3.10が推奨されています。

 ```powershell
conda create -n tf-gpu python=3.9
conda activate tf-gpu
```

続いて次のコマンドで歴代のバージョンを確認してください。

 ```powershell
conda search tensorflow
```

これを打つと、

 ```shell:出力
 （省略）
tensorflow                     2.8.2 eigen_py310h3184f71_0  pkgs/main
tensorflow                     2.8.2 eigen_py37h326eb71_0  pkgs/main
tensorflow                     2.8.2 eigen_py38h0b14ea6_0  pkgs/main
tensorflow                     2.8.2 eigen_py39h9b0e0cb_0  pkgs/main
tensorflow                     2.8.2 gpu_py310h5cc41f4_0  pkgs/main
tensorflow                     2.8.2 gpu_py37h39c650d_0  pkgs/main
tensorflow                     2.8.2 gpu_py38he639981_0  pkgs/main
tensorflow                     2.8.2 gpu_py39h5ca5225_0  pkgs/main
tensorflow                     2.8.2 mkl_py310h517747f_0  pkgs/main
tensorflow                     2.8.2 mkl_py37h31f2aba_0  pkgs/main
tensorflow                     2.8.2 mkl_py38h6f30489_0  pkgs/main
tensorflow                     2.8.2 mkl_py39hfd350ca_0  pkgs/main
tensorflow                     2.9.1 eigen_py310h7e6dd96_1  pkgs/main
tensorflow                     2.9.1 eigen_py310hd297198_0  pkgs/main
tensorflow                     2.9.1 eigen_py37h2d80419_1  pkgs/main
tensorflow                     2.9.1 eigen_py37hd324010_0  pkgs/main
tensorflow                     2.9.1 eigen_py38h1fa63f8_0  pkgs/main
tensorflow                     2.9.1 eigen_py38h9efb3fa_1  pkgs/main
tensorflow                     2.9.1 eigen_py39h296740f_1  pkgs/main
tensorflow                     2.9.1 eigen_py39ha6ebefe_0  pkgs/main
tensorflow                     2.9.1 gpu_py310h5ade2b3_0  pkgs/main
tensorflow                     2.9.1 gpu_py310hdfba57f_1  pkgs/main
tensorflow                     2.9.1 gpu_py37h12a4f0f_0  pkgs/main
tensorflow                     2.9.1 gpu_py37h1b18eab_1  pkgs/main
tensorflow                     2.9.1 gpu_py38h46f8375_1  pkgs/main
tensorflow                     2.9.1 gpu_py38h4a6fda8_0  pkgs/main
tensorflow                     2.9.1 gpu_py39h05f4d00_1  pkgs/main
tensorflow                     2.9.1 gpu_py39hb21c0df_0  pkgs/main
tensorflow                     2.9.1 mkl_py310h0b323c9_0  pkgs/main
tensorflow                     2.9.1 mkl_py310h626feff_1  pkgs/main
tensorflow                     2.9.1 mkl_py37h6343fec_1  pkgs/main
tensorflow                     2.9.1 mkl_py37ha747b87_0  pkgs/main
tensorflow                     2.9.1 mkl_py38h7f03810_0  pkgs/main
tensorflow                     2.9.1 mkl_py38hff71f30_1  pkgs/main
tensorflow                     2.9.1 mkl_py39hb9887a6_0  pkgs/main
tensorflow                     2.9.1 mkl_py39hc9ebea8_1  pkgs/main
tensorflow                    2.10.0 eigen_py310h1d93ef9_0  pkgs/main
tensorflow                    2.10.0 eigen_py37h0b514e4_0  pkgs/main
tensorflow                    2.10.0 eigen_py38h465b00b_0  pkgs/main
tensorflow                    2.10.0 eigen_py39hfced716_0  pkgs/main
tensorflow                    2.10.0 gpu_py310h4d27e69_0  pkgs/main
tensorflow                    2.10.0 gpu_py37h5d22f32_0  pkgs/main
tensorflow                    2.10.0 gpu_py38h51559ff_0  pkgs/main
tensorflow                    2.10.0 gpu_py39h9bca9fa_0  pkgs/main
tensorflow                    2.10.0 mkl_py310hd99672f_0  pkgs/main
tensorflow                    2.10.0 mkl_py38ha5c4042_0  pkgs/main
tensorflow                    2.10.0 mkl_py39ha510bab_0  pkgs/main
tensorflow                    2.18.1 cpu_py310h6605a60_0  pkgs/main
tensorflow                    2.18.1 cpu_py311h6605a60_0  pkgs/main
tensorflow                    2.18.1 cpu_py312h6605a60_0  pkgs/main
tensorflow                    2.18.1 cpu_py39h6605a60_0  pkgs/main
```

と出力されます。「gpu_xx」となっているのがGPU版です。「xx」の部分が「py39」となっているのがPython バージョン 3.9に対応したビルドなのでそれを確認してインストールすれば、望んだ環境をインストールすることができます。

```powershell:GPU版Tensorflowをダウンロード
conda install tensorflow=2.10.0=gpu_py39h9bca9fa_0
```

# 確認
最後にGPUが認識されているかTensorflow上で確認します。次のコードで確認をすることができます。

```py:確認コード
from tensorflow.python.client import device_lib
device_lib.list_local_devices()
```

```py:出力
[name: "/device:CPU:0"
 device_type: "CPU"
 memory_limit: 268435456
 locality {
 }
 incarnation: 9756898791593678236
 xla_global_id: -1,
 name: "/device:GPU:0"
 device_type: "GPU"
 memory_limit: 5733613568
 locality {
   bus_id: 1
   links {
   }
 }
 incarnation: 1701581810037505818
 physical_device_desc: "device: 0, name: NVIDIA GeForce RTX 3070 Laptop GPU, pci bus id: 0000:01:00.0, compute capability: 8.6"
 xla_global_id: 416903419]
```

この中に「device_type: "GPU"」というブロックがあるのでGPUを認識していることが確認できます。

以上がTensorflowでGPUを使用する方法となります。

# さいごに
　もし何かアドバイスなどがあれば、コメントで書いてくれると嬉しいです。