Keras/Tensorflow セットアップ for GPU (Kaggle 類似環境作り)

#環境概要
念願の GPU を手に入れたぞ！ということで環境セットアップ

##OS+GPU
NVIDIA RTX 3080
Windows10

##Software
Tensorflow 2.6
Keras 2.6
Anaconda
Python3.8
CUDA Toolkit 11.2
cuDNN 11.0


#参考にした web page

+ [本家 Tensorflow for GPU のインストール手順](https://www.tensorflow.org/install/pip?hl=ja#system-install)
+ [古いバージョンの CUDA @ NVIDIA](https://developer.nvidia.com/cuda-toolkit-archive)
+ [cuDNN SDK](https://developer.nvidia.com/rdp/cudnn-archive)
+ [参考までに @ NVIDIA](https://docs.nvidia.com/cuda/cuda-installation-guide-microsoft-windows/)
+ [Anaconda と pip の多重インストール問題](https://betashort-lab.com/データサイエンス/ディープラーニング/kerasのimporterror-cannot-import-name-absというエラー/)
+ [インストール前後の注意事項や確認方法](https://qiita.com/n-yamanaka/items/b00a94eec7eac4d2e76a)

#インストール手順
##Python 関連
###Python3.8 環境の準備
+ Anaconda Navigator をインストール

+ python3.8 の環境を Create(ここでは ML38 を作成)

+ Anacond Prompt を起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143341/98cf7184-bddf-6870-7500-17bcf3c8008a.png)

+ Python 3.8 の環境に切り替えておく

```
(base)XXX > activate ML38 # Create した環境に切り替え
(ML38)XXX > # 切り替わり完了
```

###TensorFlow for GPU と Keras のインストール

+ Tensorflow for GPU や Keras を Anaconda Prompt でインストール

>Anaconda でインストールしようとしたら、Keras のバージョンが Python3.8 非対応だと表示されたので pip を使った。
おそらくこれで Keras もインストールされるはず。
されていない時はインストールする。

```
(ML38)XXX > pip install tensorflow-gpu
(ML38)XXX > pip install keras # インストールされていない場合
```

+ Keras と Tensorflow のバージョンをチェック

```
(ML38)XXX > pip show keras # 2.6.0 
(ML38)XXX > pip show tensorflow-gpu # 2.6.0
```

+ Anaconda Navigator で Spyder か Jupter Notebook を起動

+ インストールが正常に実施されたかをチェックする

```python:xxx.py
import keras
import tensorflow
```

> エラーが発生する時は、Tensorflow や Kears のバージョンが最適でないことがある。
原因は頑張って探るしかない。

+ 必要な CUDA バージョンをチェック

```python:xxx.py
from tensorflow.python.client import device_lib
device_lib.list_local_devices()
```

> 表示されたエラーメッセージの冒頭で、今回は以下のようなエラーが発生した。
どうやら CUDA Toolkit は 11.0 を必要としている。

```
2021-10-03 22:27:35.821119: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'cudart64_110.dll'; dlerror: cudart64_110.dll not found
```

##CUDA 関連
###CUDA Toolkit 11.2

::: note warn 
以下のように CUDA Toolkit 11.0 には 10.x の dll が混ざっていました。そのため、11.2 に変更しています。チェックしたフォルダは、C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\bin です。
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143341/e8195e74-15d5-a685-4bc8-e9b8f6307c93.png)

+ 今回は 11.2.2 を [古いバージョンの CUDA @ NVIDIA](https://developer.nvidia.com/cuda-toolkit-archive) からダウンロードする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143341/f7d8565e-22c5-8e1b-d859-9d4c302867f0.png)

+ ダウンロードした exe を実行する。特に注意することは無し。

+ 環境変数 PATH に追加

```
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.2\bin
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.2\lib\x64
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.2\include
```

###cuDNN
+ CUDA Toolkit に対応したバージョンをダウンロードする。
（以下のように、CUDA Toolkit との対応が書いてあるので間違えないこと。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143341/2ffd0afc-69ec-dfd3-71e2-0644f22078cb.png)

+ ダウンロードした zip を解凍し、適当な場所に設置する。　

> 今回は C:\cuda にした。

+ 環境変数 PATH に追加

```
C:\cuda
C:\cuda\bin
C:\cuda\lib\x64
C:\cuda\include
```

##インストール後チェック
###CUDA のバージョンチェック
コマンドプロンプトでチェック

```
nvcc -V
```

###Python3.8 環境で GPU が利用可能なことをチェック
::: note info
環境変数 PATH の設定反映のため、Anaconda Navigator で Spyder か Jupter Notebook を再起動すること。
:::
```python:xxx.py
from tensorflow.python.client import device_lib
device_lib.list_local_devices()
```

>問題なく Tensorflow で GPU を利用できる環境が準備できたことがメッセージから見て取れる。

```
2021-10-03 23:42:23.685509: 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:  AVX AVX2
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.

2021-10-03 23:42:23.685509: 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:  AVX AVX2
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2021-10-03 23:42:29.203411: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1510] Created device /device:GPU:0 with 7444 MB memory:  -> device: 0, name: GeForce RTX 3080, pci bus id: 0000:01:00.0, compute capability: 8.6
```

###Kaggle で利用できるパッケージのチェック

>import できないパッケージがある場合、Anaconda Navigator や pip を使ってインストールする

```python:xxx.py
import numpy
import pandas

import keras
from keras import layers
from keras import models
from keras import optimizers
from keras import regularizers
from keras import metrics
import keras.layers.advanced_activations

import tensorflow as tf
from tensorflow.keras.layers import Input, Dense

from sklearn.model_selection import KFold
from sklearn.model_selection import train_test_split
from sklearn.metrics import log_loss

import matplotlib.pyplot as plt
```