Ubuntu 18.04.3 LTSでNVIDIA-driver(GeForce RTX 2070 SUPER), cuda 10.1, cudnn 7.6のインストール+python環境構築

# はじめに

GPUのセットアップをすることになり、手順を備忘録として残しておきます。本記事では、**NVIDIA-driver, cuda, cudnn**のインストールをし、**pyenv, virtualenv**を用いてPythonの仮想環境を作成するところまでです。
少しでも参考になればと思います。


# 環境

* ubuntu: 18.04.3 LTS
* Graphics: GeForce RTX 2070 SUPER
* Ndivier-driver: 430.50
* cuda: 10.1
* cudnn: 7.6
* Python: 3.6.5


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


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

```
$ sudo apt update
$ sudo apt install vim
```

vimでjjを使いたいので、~/.vimrcの編集をします。
（一時的にこの設定だけ私はします。）

```~/.vimrc
set number
inoremap<silent> jj <ESC>
```



###(1) Nouveauの無効化

まずは、Nouveauの無効化をします。
Nvidiaのグラフィックカードの時だと、Nouveauというドライバがデフォで設定されているのでNouveauをブラックリストに登録します。



#####Nouveauが使用されているかの確認

```
$ lsmod | grep -i 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 : パッケージの一覧を表示したり、パッケージのインストール・更新・削除などといったパッケージ管理作業ができるDebian GNU/Linux のパッケージシステムに対するテキストベースのインタフェース。


#####カーネルバージョンの確認

```
$ 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.64.66
Pin-Priority: 1001

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

Package: linux-image-generic
Pin: version 4.15.0.64.66
Pin-Priority: 1001
```

カーネルの固定は以上です。

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

#####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-430
$ sudo reboot
```

#####ドライバがインストールされたか確認
```
$ nvidia-smi
```
GPUなどの使用状況が表示されればOK

###NVIDIA-driverインストール別方法
以前に記事を書いていますのでそちらを参照ください。
[Ubuntu17.10にNVIDIAドライバをインストールしてみた。](https://qiita.com/tatsuya11bbs/items/be6ceb85eee074c57b71)

#3. cudaのインストール


cudaは[こちらからダウンロード](https://developer.nvidia.com/cuda-toolkit-archive)してください。
cudaとdriverのバージョンは必ず確認してください。

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

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

##### ~/.bashrcを編集(環境変数の設定)

```~/.bashrc
export PATH="/usr/local/cuda-10.1/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda-10.1/lib64:$LD_LIBRARY_PATH"
```
#####PATHを通す
```
$ source ~/.bashrc
```

#####バージョン確認
```
$ nvcc -V
$ nvidia-smi
```


#4. cudnnのインストール


cudnnのインストールファイルは[こちらからダウンロード](https://developer.nvidia.com/rdp/cudnn-download)してください。
アカウントの登録が必要になります。


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

```
$ tar xvf cudnn-10.1-linux-x64-v7.6.5.32.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
```


*追記 (抜けていたので追加しました) 2020/12/11
versionは各自合わせてください


```
$ sudo dpkg -i libcudnn8_8.0.5.39-1+cuda11.0_amd64.deb 
$ sudo dpkg -i libcudnn8-dev_8.0.5.39-1+cuda11.0_amd64.deb
$ sudo dpkg -i libcudnn8-samples_8.0.5.39-1+cuda11.0_amd64.deb
$ cp -r /usr/src/cudnn_samples_v8/ $HOME
$ cd $HOME/cudnn_samples_v8/mnistCUDNN
$ make clean && make
$ ./mnistCUDNN
```


#####cudnnがインストールできたかテスト

```
$ sudo dpkg -i libcudnn7-doc_7.6.5.32-1+cuda10.1_amd64.deb
$ cp -r /usr/src/cudnn_samples_v7/ $HOME
$ cd $HOME/cudnn_samples_v7/mnistCUDNN
$ make clean && make
$ ./mnistCUDNN
```

`Test passed!`と表示されればOK

####cudnnバージョン確認コマンド

```
$ cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
```

#5. Pythonの環境構築

#####依存関係のエラーが出たので修復

```
$ sudo apt --fix-broken install
```

#####Pythonに必要なパッケージのインストール

```
$ sudo apt install git gcc make openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev zlib1g-dev
```

###(1) pyenvのインストール


**pyenv** : Pythonのバージョン管理を行なうコマンドラインツールで、複数のバージョンのPythonのインストールや切り替えを容易に行うことができます。

```
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc 
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc 
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
$ source ~/.bashrc
```

#####インストールできるパッケージ一覧表示

```
$ pyenv install -l
```

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

```
$ pyenv install 3.6.5
```

#####インストールされているバージョンの確認

```
$ pyenv versions
```

#####バージョンの切り替え

```
$ pyenv global 3.6.5
```

###(2) virtualenv


**virtualenv** : 一つのシステムの中に分離されたPythonの仮想環境を作ることができるソフトウェアです。コマンドで仮想環境を簡単に作成できます。

#####virtualenvのインストール
```
$ pip install virtualenv
```

#####バージョン確認
```
$ virtualenv --version
```

#####仮想環境作成
```
$ virtualenv (PJ name) --no-site-packages
```


##### 仮想環境の有効化

```
$ . (PJ name)/bin/activate
```

#####仮想環境の無効化

```
$ deactivate
```


# 終わりに

今回Ubuntuからインストールしましたが、最初インストール画面が出てきませんでした。BIOS画面で以下の設定が必要でした。

- Secure Boot : osタイプ　UEFIモード⇒非UEFIモード
- CSM : CSMの起動⇒Enabled

時間はかかりましたが、知見が得られたので今回のセットアップは良い経験になりました。