Ubuntu 18.04.5 LTSでNVIDIA-driver(GeForce RTX 2070 SUPER), cuda 10.0, cudnn 7.4.2の設定(tensorflow-gpu:2.0.0版)

#はじめに

今回tensorflowでGPUを使えるようにセットアップしたのでメモとして残しておきます。まあまあ手こずりました。。。困っている方の参考になれば幸いです。


#環境

- ubuntu : 18.04.5 LTS
- Graphics: GeForce RTX 2070 SUPER
- nvidia-driver: 455.45.01
- cuda: 10.0
- cudnn: 7.4.2
- tensorflow-gpu : 2.0.0

#手順


最初は、ドライバのインストールをしてcuda, cudnnのインストールを進めていく方向でした。nvidiaのドライバをインストールしてからcuda(10.0 or 10.1)をインストールするとドライバが認識しなくなる問題に当たりました。今回cudaを10.0か10.1にした理由は、tensorflowでgpuを動かしたく、ビルド確認済みの最新が10.0か10.1あたりだったからです。

ですので、cudaをインストールしてnvidia-driverをインストールする順番です。しかし、またここで上手くいかず、、、。この順番でnvidia-driverをインストールしてから再起動するとマウスとキーボードが使えなくて。。

結局私が行ったことは、
➀ nvidia-driverインストール
➁ 一旦nvidia-driverを消す
➂ cudaのインストール
➃ nvidia-driverを再度インストール
➄ cudnnのインストール

となります。絶対簡単な方法がありそうですが今回はこれでとりあえずできました。

- [tensorflowのGPU対応表](https://www.tensorflow.org/install/source?hl=ja#gpu_support_2)

#1. NVIDIA-driverをインストールする前に

vimのインストール（個人的にvimを使いたいので）

```
$ sudo apt upgrade
$ sudo apt update
$ sudo apt install vim
```
vimでjjを使いたいので、~/.vimrcの編集をします。

```
$ vim ~/.vimrc
```

``` ~/.vimrc
set number
inoremap<silent> jj <ESC>
```
###(1) Nouveauの無効化
まずは、Nouveauの無効化をします。
Nvidiaのグラフィックカードの時だと、Nouveauというドライバがデフォで設定されているのでNouveauをブラックリストに登録します。
####ブラックリストの作成

```
$ sudo vim /etc/modprobe.d/blacklist-nouveau.conf
```

```/etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
options nouveau modeset=0
```

####以下のコマンドを実行し、nouveauが無効化になっていることを確認
ディスプレイの解像度が落ちていればOK

```
$ sudo update-initramfs -u
$ sudo reboot 
```

###(2)カーネルの固定

nvidiaのドライバーをカーネルのバージョンを固定しないでいると、アップグレードとかしたときにドライバとの依存関係が崩れることがあるようです。なので、カーネルの固定をします。

####aptitudeのインストール

```
$ sudo apt install aptitude
```
###カーネルバージョンの確認

```
$ aptitude show linux-generic
```
####上記で確認した内容を以下のファイルに書き込む(versionのところだけ書き換え)

```
$ cd /etc/apt/preferences.d
$ sudo vim linux-kernel.pref
```


```linux-kernel.pref
Package: linux-generic
Pin: version 4.15.0.128.115
Pin-Priority: 1001

Package: linux-headers-generic
Pin: version 4.15.0.128.115
Pin-Priority: 1001

Package: linux-image-generic
Pin: version 4.15.0.128.115
Pin-Priority: 1001
```
カーネルの固定は以上です。

#2. NDIVIAドライバのインストール

####nouveauが無効化されているか確認

```
$ lsmod | grep -i nouveau
```

####gccやmakeなど開発に必要なツールをまとめてインストール
```
$ sudo apt install build-essential
```

####リポジトリの追加
```
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt update
```
####インストール可能なデバイスが表示
```
$ ubuntu-drivers devices
```

####インストールしたいドライバを選択し、インストール
```
$ sudo apt install nvidia-driver-455
$ sudo reboot
```

####ドライバがインストールされたか確認

```
$ nvidia-smi
```

#3. NVIDIAドライバの削除


インストールされているnvidiaドライバの確認。(全て消します)

```
$ dpkg -l | grep nvidia-*
```

削除

```
$ sudo apt-get --purge remove nvidia-*
$ sudo apt-get --purge remove libnvidia-*
$ sudo apt-get --purge remove libnvidia-compute-455:i386 
$ sudo apt-get --purge remove  libnvidia-fbc1-455:i386
```

以下のコマンドで何も表示されなければokayです

```
$ dpkg -l | grep nvidia
```


#4. CUDAのインストール

[こちら](https://developer.nvidia.com/cuda-toolkit-archive)からCUDAをインストールしてください。tensorflowの場合はversionが厳しいのでしっかりと対応表で確認してください。

```
$ sudo dpkg -i cuda-repo-ubuntu1804-10-0-local-10.0.130-410.48_1.0-1_amd64.deb
$ sudo apt-key add /var/cuda-repo-10-0-local-10.0.130-410.48/7fa2af80.pub
$ sudo apt-get update
$ sudo apt-get install cuda
```


#### ~/.bashrcにPATHを通す


``` ~/.bashrc 

export PATH="/usr/local/cuda-10.0/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda-10.0/lib64:$LD_LIBRARY_PATH"
```

```
$ source ~/.bashrc
```

####*CUDAをインストールした際にNVIDIAドライバがインストールされてしまうので削除します。(この場合だと410がインストールされていました)

```
$ sudo apt-get --purge remove nvidia-*
$ sudo apt-get --purge remove libnvidia-*
$ sudo apt-get --purge remove libnvidia-compute--410:i386
$ sudo apt-get --purge remove libnvidia-fbc1-410:i386 
```

以下のコマンドで何も表示されなければ大丈夫です

```
$ dpkg -l | grep nvidia*
```


#5.NVIDIAドライバのインストール

やっとここでnvidiaのドライバをインストールします

```
$ sudo apt install nvidia-driver-455
$ sudo reboot
```
####ドライバとCUDAの確認
```
$ nvidia-smi
$ nvcc -V
```

`nvidia-smi`でCUDAのところが`11.1`のように表示されますが、`nvcc -V`で表示されるバージョンが実際のバージョンなんで気をつけてください。（とてもややこしくてここでもつまずきました、、、）


#6. cudnnのインストール

cudnnのインストールには、登録が必要です。
CUDAのバージョンに適したcudnnをダウンロードしてください。
[cudnnのインストールはこちらから](https://developer.nvidia.com/rdp/cudnn-download)

```
$ sudo dpkg -i libcudnn7_7.4.2.24-1+cuda10.0_amd64.deb 
$ sudo dpkg -i libcudnn7-dev_7.4.2.24-1+cuda10.0_amd64.deb 
$ sudo dpkg -i libcudnn7-doc_7.4.2.24-1+cuda10.0_amd64.deb
$ tar xvf cudnn-10.0-linux-x64-v7.4.2.24.tgz
$ sudo cp -a cuda/include/cudnn.h /usr/local/cuda/include/
$ sudo cp -a cuda/lib64/libcudnn* /usr/local/cuda/lib64/
$ sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*
$ sudo reboot
```

確認

```
$ cp -r /usr/src/cudnn_samples_v7/ $HOME
$ cd $HOME/cudnn_samples_v7/mnistCUDNN
$ make clean && make
$ ./mnistCUDNN
```
`Test passed!`と表示されればOK

#+α

###Tensorflowのインストール

pipでインストールできます

```
$ pip install tensorflow-gpu==2.0.0
```

###GPUが使用可能か確認

このコマンドでは、認識しているCPU,GPUが表示されます

```
from tensorflow.python.client import device_lib
device_lib.list_local_devices()
```

以下のコマンドで、TRUEが表示されればokayです

```
import tensorflow as tf
tf.test.is_gpu_available()
```

- [推奨ドライバの確認](https://www.nvidia.co.jp/Download/index.aspx?lang=jp)

###DockerによるGPU設定

Dockerを用いてGPUを設定する方法があるようです。まだ試したことはありませんが、、こっちの方が楽にできそう。

- [DockerでのディープラーニングGPU学習環境構築方法](https://qiita.com/karaage0703/items/e79a8ad2f57abc6872aa)

#終わりに

やっぱりtensorflowのGPU設定はめんどくさいですね、、、。
今後やる人の参考になればと思います。