Windows10でGPU(RTX 2060 SUPER)をtensorflow2.0に認識させる手順

# 0. はじめに
Windows10上で次の出力を得る手順をメモします。

```sh
2021-08-01 23:28:55.688957: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cudart64_110.dll
2021-08-01 23:28:57.038229: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2021-08-01 23:28:57.042125: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library nvcuda.dll
2021-08-01 23:28:57.070942: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1720] Found device 0 with properties:
pciBusID: 0000:01:00.0 name: NVIDIA GeForce RTX 2060 SUPER computeCapability: 7.5
coreClock: 1.665GHz coreCount: 34 deviceMemorySize: 8.00GiB deviceMemoryBandwidth: 417.29GiB/s
2021-08-01 23:28:57.071056: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cudart64_110.dll
2021-08-01 23:28:57.076423: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cublas64_11.dll
2021-08-01 23:28:57.076514: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cublasLt64_11.dll
2021-08-01 23:28:57.095707: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cufft64_10.dll
2021-08-01 23:28:57.096702: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library curand64_10.dll
2021-08-01 23:28:57.103773: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cusolver64_10.dll
2021-08-01 23:28:57.137910: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cusparse64_11.dll
2021-08-01 23:28:57.138539: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cudnn64_8.dll
2021-08-01 23:28:57.138651: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1862] Adding visible gpu devices: 0
2021-08-01 23:28:57.611757: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1261] Device interconnect StreamExecutor with strength 1 edge matrix:
2021-08-01 23:28:57.611871: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1267]      0
2021-08-01 23:28:57.611945: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1280] 0:   N
2021-08-01 23:28:57.614067: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1406] Created TensorFlow device (/device:GPU:0 with 6640 MB memory) -> physical GPU (device: 0, name: NVIDIA GeForce RTX 2060 SUPER, pci bus id: 0000:01:00.0, compute capability: 7.5)
2021-08-01 23:28:57.615031: I tensorflow/compiler/jit/xla_gpu_device.cc:99] Not creating XLA devices, tf_xla_enable_xla_devices not set
[name: "/device:CPU:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 14078343090718274700
, name: "/device:GPU:0"
device_type: "GPU"
memory_limit: 6963513280
locality {
  bus_id: 1
  links {
  }
}
incarnation: 16342930098274601856
physical_device_desc: "device: 0, name: NVIDIA GeForce RTX 2060 SUPER, pci bus id: 0000:01:00.0, compute capability: 7.5"
]
```

試行錯誤の末に達成したため、各操作について必要十分が明確でない点をはじめにご了承ください。
不要な操作などありましたらコメント等でご連絡頂けると幸いです。
また、個人的なメモとしての側面からダウンロードURLを直接書き込んでいますが、実行できる保証はございませんので利用しないことを推奨します。

# 1. 環境
- Windows10 (20H2)
    - GPU RTX 2060 SUPER
    - CPU i9-9900
- Python 3.8.11
- NVIDIA ドライバー  471.41
- CUDA 11.0
- cuDNN 8.0.5
- TensorFlow 2.4.0

# 2. 手順

## NVIDIA ドライバーのインストール
Geforce Experienceがプリインストールされている場合はそちらからアップグレードの確認ができます。そうでなければ次のURLからドライバーのダウンロードが可能です。
https://jp.download.nvidia.com/Windows/471.41/471.41-desktop-win10-64bit-international-dch-whql.exe

適宜こちらのサイトからバージョンを確認してください。
https://www.nvidia.co.jp/Download/index.aspx?lang=jp

## CUDAのインストール
CUDAのインストーラにはVisual StudioのVC++が必要になります。以下のURLからダウンロード可能です。
https://visualstudio.microsoft.com/ja/thank-you-downloading-visual-studio/?sku=Community&rel=16#
VC2019ではCUDAをインストールできない場合は以下のVC2017を利用してください
https://aka.ms/vs/15/release/vs_Community.exe

インストーラでC++によるデスクトップ開発のワークロードを選択しインストールを実行します。（必要及び不要なオプションは未確認）

次にCUDAのインストールを実行します。次のURLからインストーラをダウンロードし実行します。
https://developer.download.nvidia.com/compute/cuda/11.0.2/local_installers/cuda_11.0.2_451.48_win10.exe
ダウンロードページ：https://developer.nvidia.com/cuda-11.0-download-archive?target_os=Windows&target_arch=x86_64&target_version=10&target_type=exelocal

最後にインストールしたCUDAにパスを通します。自動で追加されているパスがあり、この作業が不要である可能性があります。したがって、実行せずにエラーを確認した場合はこの作業によって改善を見込めます。
以下のパスを追加
`C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\bin`
`C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\extras\CUPTI\lib64`
`C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\include`
`C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\lib\x64`


## cuDNNのインストール
cuDNNのダウンロードにはNVIDIAアカウントを要求されます。作成してから実行してください。
以下のURLからcuDNNをダウンロードします。
https://developer.nvidia.com/compute/machine-learning/cudnn/secure/8.0.5/11.0_20201106/cudnn-11.0-windows-x64-v8.0.5.39.zip

ダウンロードしたファイルは解凍し、CUDAと対応するディレクトリにファイルをコピーします。
`cuda\bin\*.dll`を`CUDA\v10.0\bin`へ
`cuda\include\cudnn*`を`CUDA\v10.0\include`へ
`cuda\lib\x64\cudnn*`を`CUDA\v10.0\lib\x64`へコピーします。

## Pythonのインストール
次のURLからインストーラをダウンロードして実行する。
https://www.python.org/ftp/python/3.8.10/python-3.8.10-amd64.exe

上のURLは以下のサイトに記載されたものです。
https://www.python.org/downloads/windows/

## Tensorflowのインストール
試行錯誤のためにvirtualenvを利用して仮想環境を作成し作成と消去を繰り返しました。不要と考える場合は仮想環境の作成をスキップしてかまいません。

### virtualenvのインストール
```sh
pip install --upgrade virtualenv
```

### 仮想環境の作成と有効化
```sh
virtualenv tensorflow_env
 .\tensorflow_env\Scripts\activate
```

### Tensorflowのインストール
```sh
pip install tensorflow-gpu==2.4.0
```

## 動作確認
以下のコマンドでTensorFlowのインポートを確認します。
環境変数を登録した後にターミナルを開きなおしていない場合は環境変数が適用されないので開きなおしてください。

```sh
 python -c "import tensorflow as tf; print( tf.__version__ )"
```

`2.4.0`と出力されると成功です。

次に、以下のコマンドでGPUが認識されるか確認します。

```sh
python -c "from tensorflow.python.client import device_lib; print(device_lib.list_local_devices())"
```

以下の出力が得られたら成功です。

```sh
2021-08-01 23:28:55.688957: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cudart64_110.dll
2021-08-01 23:28:57.038229: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2021-08-01 23:28:57.042125: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library nvcuda.dll
2021-08-01 23:28:57.070942: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1720] Found device 0 with properties:
pciBusID: 0000:01:00.0 name: NVIDIA GeForce RTX 2060 SUPER computeCapability: 7.5
coreClock: 1.665GHz coreCount: 34 deviceMemorySize: 8.00GiB deviceMemoryBandwidth: 417.29GiB/s
2021-08-01 23:28:57.071056: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cudart64_110.dll
2021-08-01 23:28:57.076423: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cublas64_11.dll
2021-08-01 23:28:57.076514: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cublasLt64_11.dll
2021-08-01 23:28:57.095707: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cufft64_10.dll
2021-08-01 23:28:57.096702: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library curand64_10.dll
2021-08-01 23:28:57.103773: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cusolver64_10.dll
2021-08-01 23:28:57.137910: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cusparse64_11.dll
2021-08-01 23:28:57.138539: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cudnn64_8.dll
2021-08-01 23:28:57.138651: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1862] Adding visible gpu devices: 0
2021-08-01 23:28:57.611757: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1261] Device interconnect StreamExecutor with strength 1 edge matrix:
2021-08-01 23:28:57.611871: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1267]      0
2021-08-01 23:28:57.611945: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1280] 0:   N
2021-08-01 23:28:57.614067: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1406] Created TensorFlow device (/device:GPU:0 with 6640 MB memory) -> physical GPU (device: 0, name: NVIDIA GeForce RTX 2060 SUPER, pci bus id: 0000:01:00.0, compute capability: 7.5)
2021-08-01 23:28:57.615031: I tensorflow/compiler/jit/xla_gpu_device.cc:99] Not creating XLA devices, tf_xla_enable_xla_devices not set
[name: "/device:CPU:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 14078343090718274700
, name: "/device:GPU:0"
device_type: "GPU"
memory_limit: 6963513280
locality {
  bus_id: 1
  links {
  }
}
incarnation: 16342930098274601856
physical_device_desc: "device: 0, name: NVIDIA GeForce RTX 2060 SUPER, pci bus id: 0000:01:00.0, compute capability: 7.5"
]
```

# 3. 参考：バージョン情報
tensorflow, python, cuDNN, CUDA: https://www.tensorflow.org/install/source?hl=ja#tested_build_configurations
cuda, nvidia-driver:https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html