Tensorflow2.8 Install to Ubuntu20.04 備忘録

#概要
[前回の投稿](https://qiita.com/Ihmon/items/4ed0bd013435aac16bdc)はTF2.4だったが、今回は最新版のTF2.8をまっさらのUbuntu20.04にインストールした。その作業手順を残しておく。

- 実施時期: 2022年2月
- OS: Ubuntu20.04LTS
- CPU: Ryzen 5600X
- GPU: GeForce RTX3070
- Python: 標準のPython3.9.10

##経緯
日本語wikipediaのフルデータでNLPモデル作成作業中、システムが起動できなくなるまで裏で巨大logを書き出しやがって、Ubuntuが起動しなくなり再インストール羽目になった。
githubに落ちてるコードを拾い喰いするとこんなことになる。

##前準備
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)
```

TFと必要ライブラリの最新依存関係を調べる。

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

「ソフトウェア要件」曰く、

1. NVIDIA® GPU ドライバ - CUDA® 11.2 には 450.80.02 以降が必要です。
1. CUDA® ツールキット - TensorFlow は CUDA® 11.2 に対応しています（TensorFlow は 2.5.0 以降）
1. cuDNN SDK 8.1.0 cuDNN バージョン

この順に入れるが、相変わらず色々とトラップありUbuntuを２度ほど入れ直した。


##Nvidia Driverのインストール
`sudo ubuntu-drivers devices`コマンドでrecommendされた470をインストールしてからCUDA Toolkit 11.2をインストールしようとすると、「460のドライバが見つからないのでインストールに失敗しました」的なメッセージでdead endとなる。「450.80.02 以降が必要です。」は間違いではないが、ドライバのアンインストールは失敗することが多いので、はっきり**460**が必要です、と書いてほしかった。

```Terminal
sudo apt install --no-install-recommends nvidia-driver-460
sudo reboot
```

インストールされたか確認する。

```Terminal
$ sudo nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.103.01   Driver Version: 470.103.01   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 ...  Off  | 00000000:07:00.0  On |                  N/A |
|  0%   41C    P8    12W / 220W |    281MiB /  7973MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A       984      G   /usr/lib/xorg/Xorg                 35MiB |
|    0   N/A  N/A      1541      G   /usr/lib/xorg/Xorg                124MiB |
|    0   N/A  N/A      1671      G   /usr/bin/gnome-shell               37MiB |
|    0   N/A  N/A      2373      G   ...892649246251055168,131072       70MiB |
+-----------------------------------------------------------------------------+
```

ドライバインストール直後は460と表示されていたが、CUDA関連をインストールすると勝手に470に上がっていた。
ドライバインストールせず、いきなりCUDA関連をインストールしても良いのかも。次回試してみる。

##CUDA Toolkitのインストール
要件である11.2の最終マイナバージョンの11.2.2を入れた。
CUDA Toolkit 11.2.2 (March 2021), Versioned Online Documentation

https://developer.nvidia.com/cuda-toolkit-archive


![Screenshot from 2022-02-07 22-07-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205257/309e10e8-cef0-fc0e-c997-6672b0fc1bb4.png)

```Terminal
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/11.2.2/local_installers/cuda-repo-ubuntu2004-11-2-local_11.2.2-460.32.03-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu2004-11-2-local_11.2.2-460.32.03-1_amd64.deb
sudo apt-key add /var/cuda-repo-ubuntu2004-11-2-local/7fa2af80.pub
sudo apt-get update
sudo apt-get -y install cuda
```

下記のフォルダが作成されていることは少なくとも確認する。
/usr/local/cuda-11.2/bin
.bashrcに下記の2行を追加する。

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

`source ~/.bashrc`を実行する。

##CuDNNのインストール
要件である下記をインストールする。
Download cuDNN v8.1.0 (January 26th, 2021), for CUDA 11.0,11.1 and 11.2
　cuDNN Library for Linux (x86_64)

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

![Screenshot from 2022-02-07 22-18-49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205257/9d3fd489-09a7-774c-d4af-dde7235e35e4.png)

"cudnn-11.2-linux-x64-v8.1.0.77.tgz"というファイルがDownloadsに落ちるので、その場で解凍しそこで作業する。
一番近い手順は下記オフィシャルにあり。ピシャリとあっていないがバージョンが多いため仕方ないので、経験で解凍したものを見ながら読み替える。
`apt-get install`する方法も書かれているが、いつもファイルをコピーする手順で済ませているので今回もそうする。

https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html#installlinux-tar

解凍したフォルダ中のincludeフォルダとlib64フォルダの中身を/usr/local/cudaのそれぞれにコピーする。

```Terminal
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のインストール
コンパイルせずに簡単なpipでインストールする。これもTFのオフィシャルを一読しておく。

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

書かれているインストール要件は下記なので、`python -V`で確認しておく
Ubuntu20.04LTSのPythonは3.9.10だった。

対応Python: 3.6～3.9
pip: 19.0以降

```terminal
sudo apt install python3-dev python3-pip python3-venv
pip install --upgrade pip
```

前回のTF2.4の投稿ではcondaの仮想環境にpipでインストールしたが、同時に使用するかもしれない他のcondaパケージと依存関係が壊れてしまう可能性があるので、pythonのvenvを作ってそこにpipインストールする。
たとえばDocuments直下にvenvの"hoge"を作る。

```terminal
cd Documents
python -m venv hoge
cd hoge   # venvコマンドで作られるフォルダ
source bin/activate
```
TFが依存しているパケージも同時にインストールされるので、最初にpipでTFをインストールする。`pip list`の実行結果を見れば多くのそれらパケージがインストールされたことがわかる。その上で足りないものを個別にインストールする。

```terminal
(hoge)$ pip install --upgrade tensorflow
(hoge)$ pip list
(hoge)$ pip install pandas
(hoge)$ pip install jupyterlab==3
```

jupyter notebookを起動し、セルで下記を確認する。

```python
import tensorflow as tf
print(tf.__version__)
print(len(tf.config.list_physical_devices('GPU'))>0)
```
2.8.0
True
ただし、初回実行時に下記のInfoが表示された。これはjupyter labを起動するたびに表示されて目障り。

I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:936] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero

下記コマンドでNUMA_nodeの値を確認できる。-1になっていれば、その下のコマンドですべて0（無効）に書き換えることができる。さすればこのInfoは今後出なくなる。


```terminal
grep . /sys/bus/pci/devices/*/numa_node
for a in /sys/bus/pci/devices/*; do echo 0 | sudo tee -a $a/numa_node; done
```

下記参照のこと。

https://github.com/tensorflow/tensorflow/issues/42738


以上