RTX30XX 系で Tensorflow を安定動作させる

## 簡単にまとめると
CUDA 11.3 のインストール
cuDNN 8.2 系のインストール
```pip install tensorflow==2.5.0``` 
```tf.test.is_gpu_available()``` で確認

## 私の環境
OS Ubuntu 20.04LTS
Device RTX3060
クリーンインストール直後を想定してます。

## これまでの問題
CUDA 11.0 cuDNN 8.0.4 Tensorflow 2.4.0 で tf.keras を使ってCNNしたいが、なぜか Dense は動くのに Conv2D が動かない。魔法のコード(記事最下段)を入力してなんとなく動くようになっても ptxas? のエラーコードが邪魔だし遅い。

今回このあたりの解決を確認済み。

## 前準備
アップデート

```
sudo apt update
sudo apt upgrade
```
nouveau の無効化。[このへん](https://qiita.com/sasayabaku/items/2323a2c501e58c0621b6)を参照。

```sh:/etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
options nouveau modeset=0
```
```
sudo update-initramfs -u
```
再起動して ```lsmod | grep -i nouveau``` して nouveau 無効化を確認。何も出てこなかったらOK。

一応いれとく

```
sudo apt install build-essential
```
## CUDA Driver & CUDA 11.3 のインストール
以下ページをめちゃくちゃ参考にしています。なんならここをみてやったほうがいいかも。ただ、インストールするバージョンだけ違うので注意。
[NVIDIA グラフィックスドライバ，NVIDIA CUDA ツールキット 11.0，NVIDIA cuDNN 8.0.5 のインストール（Ubuntu 上） 金子邦彦研究室](https://www.kkaneko.jp/tools/ubuntu/ubuntu_cudnn.html#S2)

リポジトリの登録

```
sudo wget -O /etc/apt/preferences.d/cuda-repository-pin-600 https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/7fa2af80.pub
sudo add-apt-repository "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/ /"
```
CUDAのインストール。ドライバも一緒に入ります。

```
sudo apt -y install cuda-11-3
```
インストールが終わったら、以下でパスを通す。

```
export CUDA_PATH=/usr/local/cuda-11.3
echo 'export CUDA_PATH=/usr/local/cuda-11.3' >> ${HOME}/.bashrc
export LD_LIBRARY_PATH=/usr/local/cuda-11.3/lib64:${LD_LIBRARY_PATH}
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-11.3/lib64:${LD_LIBRARY_PATH}' >> ${HOME}/.bashrc
export PATH=/usr/local/cuda-11.3/bin:${PATH}
echo 'export PATH=/usr/local/cuda-11.3/bin:${PATH}' >> ${HOME}/.bashrc
```
再起動。ドライバの動作確認

```
nvidia-smi
```

```
Fri Jul 30 15:11:59 2021       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.57.02    Driver Version: 470.57.02    CUDA Version: 11.4     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ...  On   | 00000000:01:00.0 Off |                  N/A |
|  0%   49C    P8    16W / 170W |    732MiB / 12053MiB |      7%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A       966      G   /usr/lib/xorg/Xorg                100MiB |
|    0   N/A  N/A      1503      G   /usr/lib/xorg/Xorg                302MiB |
|    0   N/A  N/A      1672      G   /usr/bin/gnome-shell               54MiB |
|    0   N/A  N/A      2191      G   ...AAAAAAAAA= --shared-files       93MiB |
|    0   N/A  N/A      2444      G   /usr/lib/firefox/firefox          166MiB |
|    0   N/A  N/A      2757      G   /usr/lib/firefox/firefox            2MiB |
+-----------------------------------------------------------------------------+
```
右上の ``` CUDA Version: 11.4``` は関係ないので無視。

nvcc の確認もしましょう。

```
nvcc -V
```
```
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2021 NVIDIA Corporation
Built on Mon_May__3_19:15:13_PDT_2021
Cuda compilation tools, release 11.3, V11.3.109
Build cuda_11.3.r11.3/compiler.29920130_0
```
## cuDNNのインストール
リポジトリの登録。

```
cd /tmp
wget https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu2004/x86_64/nvidia-machine-learning-repo-ubuntu2004_1.0.0-1_amd64.deb
sudo dpkg -i nvidia-machine-learning-repo-ubuntu2004_1.0.0-1_amd64.deb
sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub
sudo apt update
```
入れれるパッケージ名を確認

```
apt-cache search cudnn
```
確認したパッケージをインストール

```
sudo apt -y install libcudnn8 libcudnn8-dev
```

:::note warn
TensorFlow 2.5.0 の動作には cuDNN 8.2系が必要みたいで、現時点(2021/7/30)時点では上のコマンドで8.2.2が入るため問題ないですが、将来的に必ずしもこのコマンドで所望のバージョンが得られるかはわかりません。
:::
インストールされたパッケージリストの取得

```
dpkg -l | grep cuda
```

## Anaconda のインストール
Pythonの仮想環境として Anaconda を使います。なんでもいいというか、むしろ pyenv のほうが望ましいかもしれませんが、Anacondaに慣れてしまった＆問題なく動いているためこれでいきます。

[ホームページ](https://www.anaconda.com/products/individual#Downloads)からLinuxインストーラをダウンロードし、ダウンロードしたディレクトリでシェルを実行します。

```
bash Anacondaうんたらかんたら.sh
```
:::note alert
ぜったいに sudo でしないこと。
:::
あとはぽちぽち指示通りにインストールするだけでOK。ターミナルを再起動すると頭に ```(base)``` とついて、Anacondaが動いてることを確認できます。

## 環境を作成してTensorflowのインストール
仮想環境の作成

```
conda create -n tensorflow python=3.8
```
できたら ```conda activate tensorflow``` して tensorflow 環境に入る。

```
conda activate tensorflow
```
Anaconda では conda コマンドを使用してあれこれパッケージを入れるのが普通ですが、私はこれを仮想環境としてしか使っていないので、普通に pip で入れます。一応それぞれちゃんと Anaconda のものが動いていることを確認。

```
which pip
which python
```
anaconda3 の文字があればOK。
そしたら、pip でインストール

```
pip install numpy pillow matplotlib opencv-contrib-python
pip install tensorflow==2.5.0 tensorflow_datasets tensorflow-hub
```
できたら、```python```コマンドでPython REPLを起動して、

```py
import tensorflow as tf
tf.test.is_gpu_available()
```
でGPUが使えるか確認。```True``` がでたらOK。

##　備考
* CUDA 11.1以上でないとRTX30series はサポートされないらしい。
* [公式HP](https://www.tensorflow.org/install/gpu?hl=ja)に記載の Tensorflow 2.4.0 は CUDA 11.0は動くけど CUDA 11.1 は動かないらしい。
* 今回の方法でやれば、RTX30series を CUDA 11.0、cuDNN 8.0.4、Tensorflow 2.4.0 で無理やり動かしたときに必要な

```py
from tensorflow.compat.v1 import ConfigProto
from tensorflow.compat.v1 import InteractiveSession

config = ConfigProto()
config.gpu_options.allow_growth = True
session = InteractiveSession(config=config)
```
は不要。