Tensorflow2.4 Install to Ubuntu20.04 備忘録

#概要
TF2.4を入れていたUbuntu18.05のAnacondaの具合が悪い。
fit()中のエラーが解消できなくなり、OSをUbunto20.04にして再セットアップした。

- 実施時期: 2021年5月
- OS: Ubuntu20.04LTS (Linux ryzen 5.8.0-50-generic #56~20.04.1-Ubuntu)
- CPU: Ryzen 5600X
- GPU: GeForce RTX3070
- Python: 標準のPython3

##経緯
Anacondaの問題だったので今回はAnacondaは使わない。
前回UpしたとおりcondaでTF2.4.1が入るようになったけど、同時に入るCUDAが依然として10.1のままだったり、怪しい部分があるから。

RTX 30X0 + TF2.4.1 on Ubuntu20.04について、Stack Overflowにスレを立てたけど大した情報が集まらなかった。
https://stackoverflow.com/questions/67364950/cuda-and-cudnn-version-conflict-against-tensorflow2-4-1

##前準備
CUDA対応NVIDIAボードが刺さっていることを確認する。


```Terminal
$ lspci | grep -i nvidia
07:00.0 VGA compatible controller: NVIDIA Corporation Device 2484 (rev a1)
07:00.1 Audio device: NVIDIA Corporation Device 228b (rev a1)
```

##Nvidia Driverのインストール
CUDAをインストールするとき自動的にドライバは一緒に入るが、バーションがr450になるかもしれず、RTX 3070はr457以降が対応しているので、あえて明示的に最新版のr460を入れる。

```Terminal
$ sudo ubuntu-drivers devices
== /sys/devices/pci0000:00/0000:00:03.1/0000:07:00.0 ==
modalias : pci:v000010DEd00002484sv00001462sd00003909bc03sc00i00
vendor   : NVIDIA Corporation
driver   : nvidia-driver-460 - distro non-free recommended
driver   : xserver-xorg-video-nouveau - distro free builtin

$ sudo apt install --no-install-recommends nvidia-driver-460
```

##cuda, cuDNNのサポート表を確認
TFオフィシャルの手順はUbuntu16, 18のみでUbuntu 20向けには書かれていない。
Ubuntu, NVIDIA driver, cuda, cuDNNの各バージョンは厳密に合わせておく必要があるので下表で確認する。

https://docs.nvidia.com/deeplearning/cudnn/support-matrix/index.html

TF2.4.1の要求から本PCの構成で選択したのは下記の組み合わせ

Driver: r460
cuda: CUDA Toolkit 11.0 Update 1 Downloads
cuDNN: cudnn-11.0-linux-x64-v8.0.4.30.tgz

##cudaのインストール
下記のrunfile[local]を行う。deb[local]でうまく行かなかったため。

https://developer.nvidia.com/cuda-11.0-update1-download-archive?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=2004&target_type=runfilelocal



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205257/9387c2f1-4158-22e7-bfa2-cfe6cfe12d32.png)


```Terminal
$ wget https://developer.download.nvidia.com/compute/cuda/11.0.3/local_installers/cuda_11.0.3_450.51.06_linux.run
$ sudo sh cuda_11.0.3_450.51.06_linux.run          # ①
$ sudo sh ./cuda_11.0.3_450.51.06_linux.run --toolkit --silent –override      # ②
```

①を実行したときに、警告‘Existing package manager installation of the driver found.’ が表示され、継続せずに手動で削除して再度実行するように言われた。どのDriverのことなのか書かれていなかったが多分先に入れたr460のことだと思う。
r460はそのままにしたいので、①は再実行せず下記をおこなった。

```Terminal
$ sudo sh ./cuda_11.0.3_450.51.06_linux.run --toolkit --silent –override      # ②
```

https://askubuntu.com/questions/1211919/error-installing-cuda-toolkit-existing-package-manager-installation-of-the-driv

実行後、/usr/local/cuda-11.0/bin フォルダができていることを確認してbashrcに以下を追加する。

```Terminal
export PATH=/usr/local/cuda-11.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-11.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRAR
```

##cuDNNのインストール
予め下記の cudnn-11.0-linux-x64-v8.0.4.30.tgz ファイルをダウントードしておく。

Download cuDNN v8.0.4 (September 28th, 2020), for CUDA 11.0
　cuDNN Library for Linux [x86_64]

https://developer.nvidia.com/rdp/cudnn-archive

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205257/0cdbbd30-c6c2-f712-5da2-d898326a882f.png)

```Terminal
cd Downloads
tar -xzvf cudnn-11.0-linux-x64-v8.0.4.30.tgz
sudo cp cuda/include/cudnn*.h /usr/local/cuda/include
sudo cp -P cuda/lib64/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*
sudo apt update
```

##Tensorflow2.4.1のインストール
まず、仮想環境などを作成するためTFオフィシャルのとおりに実行する。
なお、Documents/ML/tf-test1に仮想環境test1を作成しそこにTFを入れる。

https://www.tensorflow.org/install/pip?hl=ja

```Terminal
sudo apt install python3-dev python3-pip python3-venv
cd Documents/ML/tf-test1
python3 -m venv test1
source test1/bin/activate
pip install --upgrade pip
pip list
pip install --upgrade tensorflow
pip install pandas
pip install matplotlib
pip install seaborn
pip install plotly
pip install jupyterlab
pip install scipy
pip install scikit-learn
pip install gpyopt
pip install trax==1.3.7
```

Pythonを起動し下記でTFがGPUを認識していることを確認する。


```Terminal
import tensorflow as tf
print(tf.__version__)
print(tf.config.list_physical_devices('GPU'))
print(tf.test.gpu_device_name())
```