【Windows】PythonのTensorflow/KerasをGPUで使う方法

# やりたいこと
PythonでTensorflow, KerasをGPUで動かしたい
KerasはTensorflowから使えます。
以下のコードが実行できるようになります。

```python
from tensorflow.config.experimental import list_physical_devices
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM

physical_devices = list_physical_devices('GPU')
```
## Keras
Kerasは個別に`import keras`利用可能ですがKeras自体の開発は終了し、今では`import tensorflow.keras`で使用することが推奨されているようです。
なので`pip install keras`で個別にKerasをインストールする必要はありません。
https://keras.io/about/


# 必要なもの
- Visual Studio (C++によるデスクトップ開発)
- Anaconda
- tensorflow-gpu (バージョン指定)
- Geforce Experience(Nvidia GPU Driver)
- Nvidia CUDA Toolkit (バージョン指定)
- NVIDIA cuDNN(バージョン指定)

# 互換性の確認
インストールしたいバージョンのTensorFlowが「どのバージョンのPythonに対応している」「どのバージョンのCUDA Toolkitに対応している」「どのバージョンのcuDNNに対応している」かを下のリンクから確認しましょう。
https://www.tensorflow.org/install/source?hl=ja#gpu
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225372/56f29836-6251-9e34-47ab-dfc6a4055d28.png)

# 例
**Tensorflow-gpu 2.4.0**を入れたい場合インストールするものは以下になります。

- Tensorflow-gpu 2.4.0
- Python 3.6～3.8
- Nvidia CUDA Toolkit 11.0
- Nvidia cuDNN v8.0
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225372/142aa3ad-98eb-9fa2-60e8-560935a2e057.png)

# Visual Studioのインストール
- Visual Studioを以下リンクからダウロード
https://visualstudio.microsoft.com/ja/downloads/
- ダウンロードしたVisual Studio  Installerを開いて「C++によるデスクトップ開発」「Desktop development with C++」にチェックを入れてインストール


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225372/0436532e-8042-86fc-1592-f1d91518f2df.png)
# Gerforce Experience
- Geforce Experience(Nvidia GPU Driver)を以下リンクからダウンロード
https://www.nvidia.com/ja-jp/geforce/geforce-experience/

- ダウンロードしたら開いてインストール

- インストールしたGeforce Experienceを開いて最新のドライバーをインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225372/5375c20a-60e8-9bee-8070-c0c77d791ed8.png)

# Nvidia CUDA Toolkitインストール
- 互換性のあるバージョンを以下リンクから探してダウンロード
https://developer.nvidia.com/cuda-toolkit-archive


- ダウンロードしたら開いてインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225372/06cd013e-ae89-a4b7-0892-3f8c45d44de1.png)

# Nvidia cuDNNインストール

- 互換性のあるバージョンを以下リンクから探して「cuDNN Library for Windows」をダウンロード
Nvidia Developのアカウントでログインする必要があります。
https://developer.nvidia.com/rdp/cudnn-download
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225372/5093d989-c07d-34e4-4368-29cacf17d82c.png)

- ダウンロードしたZIPファイルを展開する。
- 「C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0」的なところにCUDA Toolkitがインストールされているのを確認する。
- 展開したファイルをCUDA Toolkitにコピーする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225372/682f4248-f8d8-43b0-d225-48a05348a674.png)

# システム環境変数(Path)の確認
Pathに以下のものが入っていれば大丈夫。なければ追加する

- C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\bin
- C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\libnvvp
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225372/0f2bc253-0821-f0a2-1219-64086f07005f.png)

# Anacondaをインストール
以下リンクからAnacondaをインストール
https://www.anaconda.com/products/individual

# Anacondaの新しい環境を作成
- Anaconda Navigatorを開いて、Environmentsで新しい環境を作成
- Pythonのバージョンは上で互換性を確認したものを選択
- 作成した環境で「Open Terminal」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225372/bfb89dda-58ae-1fd2-9557-bb8e1f342aa8.png)

- ターミナルが開いたら「pip install tensorflow-gpu==version」を実行してTensorflow-gpuをインストール
versionには上で確認したバージョンが入る

```shell
pip install tensorflow-gpu==version
例
pip install tensorflow-gpu==2.4.0
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225372/f62e687e-344e-2dda-f566-b250fc0081a5.png)

# 動いているか確認
先ほど開いたターミナルで以下コマンドを実行

```shell
python -c "from tensorflow.python.client import device_lib;print(device_lib.list_local_devices());"
```
## 出力
出力が以下のように**「device_type: "GPU"」**という表記があれば成功です!!

```shell
[
　　name: "/device:CPU:0"
　　device_type: "CPU"
　　memory_limit: 268435456
　　locality {}
　　incarnation: 408926561584540200,
　　name: "/device:GPU:0"
　　device_type: "GPU"
　　memory_limit: 9988323456
　　locality {
　　　　bus_id: 1
　　　　links {}
　　}
　　incarnation: 8775696053629801602
　　physical_device_desc: "device: 0, name: GeForce GTX 1080 Ti, pci bus id: 0000:01:00.0, compute capability: 6.1"
]
```