Ubuntu18.04, GeForceRTX2080でtensorflow2.8.0を使えるようにする

# はじめに

きっかけはtensorflow2.8の`tf.keras.applications.efficientnet_v2`を使ってみたかったから。

最新のtensorflowなので、Nvidia Driver、CUDA Toolkit、cudnnの再インストールが必要になった。
前回のインストール時も色々試行錯誤した記憶があるので、今回のインストールまでの流れを備忘録として残す。
＊CUDA Toolkitのインストールの途中でエラーあり

- 構成
OS: Ubuntu18.04LTS
CPU: Intel® Core™ i7-8700 CPU @ 3.20GHz × 12
GPU: GeForce RTX2080
Python: Python3.7.9(Anacondaで作成した仮想環境)


下記の記事を大いに参考にしました。
① https://qiita.com/Ihmon/items/b6950495c29ee1bfbe99
② https://marmooo.blogspot.com/2020/01/apt.html

# Nvidia Driverのインストール

- [参考記事①](https://qiita.com/Ihmon/items/b6950495c29ee1bfbe99)から460をインストールする。


`nvidia-smi`で確認すると、参考記事①と同様に470と表示されるが次に進む。

```
sudo apt-get purge nvidia-*
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
sudo apt install nvidia-driver-460
sudo reboot
nvidia-smi
```

# CUDA Toolkitのインストール

- 11.2.2をインストールする。
- nvidiaのサイトから自分の環境を選択して、出てきた↓のコマンドをコピペする。
```
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin
sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/11.2.2/local_installers/cuda-repo-ubuntu1804-11-2-local_11.2.2-460.32.03-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1804-11-2-local_11.2.2-460.32.03-1_amd64.deb
sudo apt-key add /var/cuda-repo-ubuntu1804-11-2-local/7fa2af80.pub
sudo apt-get update
sudo apt-get -y install cuda
```
最後の`sudo apt-get -y install cuda`でエラー発生。

```
$ sudo apt-get -y install cuda
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
インストールすることができないパッケージがありました。おそらく、あり得
ない状況を要求したか、(不安定版ディストリビューションを使用しているの
であれば) 必要なパッケージがまだ作成されていなかったり Incoming から移
動されていないことが考えられます。
以下の情報がこの問題を解決するために役立つかもしれません:

以下のパッケージには満たせない依存関係があります:
 cuda : 依存: cuda-11-2 (>= 11.2.2) しかし、インストールされようとしていません
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。
```
[参考記事②](https://marmooo.blogspot.com/2020/01/apt.html)によると、このエラーの時は依存ライブラリを順に入れていくと良いらしい。
- cuda-11-2を入れてみる。
```
$ sudo apt-get install cuda-11-2
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
インストールすることができないパッケージがありました。おそらく、あり得
ない状況を要求したか、(不安定版ディストリビューションを使用しているの
であれば) 必要なパッケージがまだ作成されていなかったり Incoming から移
動されていないことが考えられます。
以下の情報がこの問題を解決するために役立つかもしれません:

以下のパッケージには満たせない依存関係があります:
 cuda-11-2 : 依存: cuda-runtime-11-2 (>= 11.2.2) しかし、インストールされようとしていません
             依存: cuda-demo-suite-11-2 (>= 11.2.152) しかし、インストールされようとしていません
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。

```

- cuda-runtime-11-2を入れてみる。(cuda-demo-suite-11-2はcuda-runtime-11-2と依存関係のため入れれなかったらしい)
```
$ sudo apt-get install cuda-runtime-11-2
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
インストールすることができないパッケージがありました。おそらく、あり得
ない状況を要求したか、(不安定版ディストリビューションを使用しているの
であれば) 必要なパッケージがまだ作成されていなかったり Incoming から移
動されていないことが考えられます。
以下の情報がこの問題を解決するために役立つかもしれません:

以下のパッケージには満たせない依存関係があります:
 cuda-runtime-11-2 : 依存: cuda-drivers (>= 460.32.03) しかし、インストールされようとしていません
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。

```
- 同様に、cuda-driversを入れてみる。
``` 
$ sudo apt-get install cuda-drivers
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
インストールすることができないパッケージがありました。おそらく、あり得
ない状況を要求したか、(不安定版ディストリビューションを使用しているの
であれば) 必要なパッケージがまだ作成されていなかったり Incoming から移
動されていないことが考えられます。
以下の情報がこの問題を解決するために役立つかもしれません:

以下のパッケージには満たせない依存関係があります:
 cuda-drivers : 依存: cuda-drivers-460 (= 460.32.03-1) しかし、インストールされようとしていません
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。

```
- cuda-driver-460を入れてみる。
```
$ sudo apt-get install cuda-drivers-460
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
インストールすることができないパッケージがありました。おそらく、あり得
ない状況を要求したか、(不安定版ディストリビューションを使用しているの
であれば) 必要なパッケージがまだ作成されていなかったり Incoming から移
動されていないことが考えられます。
以下の情報がこの問題を解決するために役立つかもしれません:

以下のパッケージには満たせない依存関係があります:
 cuda-drivers-460 : 依存: libnvidia-compute-460 (>= 460.32.03) しかし、インストールされようとしていません
                    依存: libnvidia-decode-460 (>= 460.32.03) しかし、インストールされようとしていません
                    依存: libnvidia-encode-460 (>= 460.32.03) しかし、インストールされようとしていません
                    依存: libnvidia-fbc1-460 (>= 460.32.03) しかし、インストールされようとしていません
                    依存: libnvidia-gl-460 (>= 460.32.03) しかし、インストールされようとしていません
                    依存: libnvidia-ifr1-460 (>= 460.32.03) しかし、インストールされようとしていません
                    依存: nvidia-compute-utils-460 (>= 460.32.03) しかし、インストールされようとしていません
                    依存: nvidia-dkms-460 (>= 460.32.03) しかし、インストールされようとしていません
                    依存: nvidia-driver-460 (>= 460.32.03) しかし、インストールされようとしていません
                    依存: nvidia-kernel-common-460 (>= 460.32.03) しかし、インストールされようとしていません
                    依存: nvidia-kernel-source-460 (>= 460.32.03) しかし、インストールされようとしていません
                    依存: nvidia-utils-460 (>= 460.32.03) しかし、インストールされようとしていません
                    依存: xserver-xorg-video-nvidia-460 (>= 460.32.03) しかし、インストールされようとしていません
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。

```

- libnvidia-compute-460を入れてみると、インストール成功。
- 遡って、cuda-drivers-460、cudaの順で入れる。
- 確認のため、`nvidia-smi`をすると失敗。
```
Failed to initialize NVML: Driver/library version mismatch
```
バージョンがあってないらしい。Nvidia Driverの表示が470だったからか？
- Nvidia Driverのインストールやり直す(コマンドの内容は同じ)。
- 再起動後、`nvidia-smi`成功。表示がちゃんと460になっている。

# CudNNのインストール
- Download cuDNN v8.1.0 (January 26th, 2021), for CUDA 11.0,11.1 and 11.2
　cuDNN Library for Linux (x86_64)をダウンロードする。
- 解凍し、includeとlib64の中身を/usr/local/cudaのそれぞれのフォルダにコピーする。
 ```
 cd cudnn-11.2-linux-x64-v8.1.0.77/cuda
sudo cp include/cudnn*.h /usr/local/cuda/include
sudo cp -P lib64/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*
sudo apt-get update
 ```
 
 # 仮想環境構築＆tensorflowインストール
 - Anacondaで仮想環境を構築し、tensorflow2.8.0を`pip install`で入れる。
 ```
 conda create -n tf28 python==3.7.9
 activate tf28
 pip install tensorflow=2.8.0
 ```
 - tensorflowがgpuを認識できるか確認する。
```python
from tensorflow.python.client import device_lib
device_lib.list_local_devices()
```
出力結果
```
2022-03-23 23:46:12.290377: I tensorflow/core/platform/cpu_feature_guard.cc:151] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2 FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2022-03-23 23:46:12.700162: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1525] Created device /device:GPU:0 with 6418 MB memory:  -> device: 0, name: GeForce RTX 2080, pci bus id: 0000:01:00.0, compute capability: 7.5
[name: "/device:CPU:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 12041040034942007924
xla_global_id: -1
, name: "/device:GPU:0"
device_type: "GPU"
memory_limit: 6730481664
locality {
  bus_id: 1
  links {
  }
}
incarnation: 2528322641246949854
physical_device_desc: "device: 0, name: GeForce RTX 2080, pci bus id: 0000:01:00.0, compute capability: 7.5"
xla_global_id: 416903419
]
```
インストール完了。