Ubuntu18.04, CUDA10.0, cuDNN7.4, tensorflow-gpu1.14の環境再構築メモ

##前提
[このコード](https://github.com/LeonLok/Deep-SORT-YOLOv4)をGPUで回すためには，tensorflow-gpu 1.14が必要らしい．
tensorflow-gpuのバージョンによってCUDAやcuDNNのバージョンは限定される．
また，インストールするCUDAのバージョンによっては，Nvidiaドライバのバージョンが適さない場合もある．

tensorflowとCUDA・cuDNNの対応関係⇨[こちら](https://www.tensorflow.org/install/source#common_installation_problems)
CUDAとNvidiaドライバの対応関係⇨[こちら](https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html)

##開発環境
OS：Ubunutu18.04.5 LTS
GPU：GeForce RTX 2060

###これを入れたい
・tensorflow-gpu 1.14
　　　⇩
・CUDA 10.0 & cuDNN 7.4.2
　　　⇩
・Nvidiaドライバ 410.48以上

###再構築前の環境
・CUDA 10.0
・cuDNN 7.4.2
・Nvidiaドライバ 410.104

ドライバのバージョンが低くてGPUで回せなかった．

#①古いやつ全部消す
[このページ](https://qiita.com/tsuchiyaTaro/items/10d399686ce778cb9ffa)を参考にした．

以下をターミナルに打ち込む．

```terminal:terminal
sudo apt-get --purge remove nvidia-*
sudo apt-get --purge remove cuda-*
sudo apt-get --purge remove cudnn-*
sudo apt-get --purge remove libnvidia-*
sudo apt-get --purge remove libcuda-*
sudo apt-get --purge remove libcudnn-*
sudo apt-get autoremove
```
```terminal:terminal
dpkg -l | grep nvidia
dpkg -l | grep cuda
dpkg -l | grep cudnn
```
これで何も出力されなければOK.

###上のコマンド後に何か出力されてしまったときの対処法
```terminal:terminal(output)
rc cuda-cuda-...
︙
rc cuda-...
```
みたいなのが出力されてしまったときは以下のコマンド．

```terminal:terminal
sudo aptitude purge cuda-cuda-... ･･･ cuda-...
```

```sudo aptitude purge [ファイル名]```で消せるはず．


#②ドライバのインストール
初めてやる人は一通り[このページ](https://qiita.com/tsuchiyaTaro/items/10d399686ce778cb9ffa)に沿ってやるほうが良いと思う．

##自分のケース
ドライバのインストール後，CUDA 10.0をインストールすると，なぜかドライバのバージョンが410.104に戻されてしまった．
よくわからないため別のページのやり方を参考に．

ここからは[このページ](https://qiita.com/JeJeNeNo/items/045948694327977f614f)を参考にした．

```terminal:terminal
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-repo-ubuntu1804_10.0.130-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1804_10.0.130-1_amd64.deb
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
sudo apt-get update
wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
sudo apt install ./nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
sudo apt-get update
```

```terminal:terminal
ubuntu-drivers devices  # インストールされているデバイスと利用可能なドライバの確認。
sudo ubuntu-drivers autoinstall
sudo reboot
```
今回は，autoinstallでnvidia-driver-465をインストールすることになった．
最新版，ちょっとコワい…．

再起動後，```nvidia-smi```でドライバがインストールされているか確認．

#③CUDA 10.0，cuDNN 7.4.2のインストール
```terminal:terminal
sudo apt-get install -y --no-install-recommends cuda-10-0 libcudnn7 libcudnn7-dev
```

これやったらcuDNNの7.4.2以外のバージョンらしきものをインストールしてるように見えたけど大丈夫だろうか…．

##PATHを通す
```terminal:terminal
echo -e "\n## CUDA and cuDNN paths"  >> ~/.bashrc
echo 'export PATH=/usr/local/cuda-10.0/bin:${PATH}' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64:${LD_LIBRARY_PATH}' >> ~/.bashrc
```

##最後に確認
```terminal:terminal
nvidia-smi
nvcc -V
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
```
上からNvidiaドライバ，CUDA，cuDNNのバージョン確認．

最後にGPUを認識しているかを確認．（tensorflow-gpuをインストールした上で）

```terminal:terminal上でpython
python3
>>>from tensorflow.python.client import device_lib
>>>device_lib.list_local_devices()
```

これでdevice_type:GPUを出力すればOK.（XLA_GPUではダメ）