ubuntu 20.04 RTX 3090 にdeep learning環境を構築した時の備忘録

# 概要
rtx3090搭載pcにubuntu20.04をインストールした時のnvidia-driver, cuda, cuDNNのインストール手順を書きます.

## デフォルトで動いてるドライバを無効化する
まず初めにデフォルトで使われているドライバを無効にします． デフォルトのドライバである`nouveau`が使われているかは下記のコマンドで確認します．

```
$ lsmod | grep nouveau
```
このコマンドを叩いて, もし情報が表示されれば, 次の操作で`/etc/modprobe.d/blacklist-nouveau.conf`という新規ファイルを作り, 以下の二行を追記します．

```
$ nano /etc/modprobe.d/blacklist-nouveau.conf
```

```
blacklist nouveau
options nouveau modeset=0
```

## nvidia-driverのインストール

まず初めに, nvidiaがドライバを公開しているレポジトリを追加します．

```
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt update
```

次に, 下記のコマンドで推奨されているnvidia-driverのバージョンを確認します．

```
$ ubuntu-drivers devices

== /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0 ==
modalias : pci:v000010DEd00002204sv000019DAsd00001613bc03sc00i00
vendor   : NVIDIA Corporation
driver   : nvidia-driver-470 - third-party non-free recommended
driver   : nvidia-driver-460-server - distro non-free
driver   : nvidia-driver-465 - third-party non-free
driver   : nvidia-driver-455 - third-party non-free
driver   : nvidia-driver-460 - third-party non-free
driver   : xserver-xorg-video-nouveau - distro free builtin
```

執筆時点でrtx3090の場合は, `nvidia-driver-470`が`recommended`になっているので下記コマンドでnvidia-driverをインストールします. バージョンの数字の部分は各々書き換えてください．

```
$ sudo apt install nvidia-driver-470
$ sudo reboot
```
インストールできたかの確認は`nvidia-smi`で下記の情報が表示されるかでわかります.

```
$ nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.42.01    Driver Version: 470.42.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 ...  On   | 00000000:01:00.0 Off |                  N/A |
|  0%   53C    P8    19W / 350W |    164MiB / 24245MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A      1000      G   /usr/lib/xorg/Xorg                147MiB |
|    0   N/A  N/A      1157      G   /usr/bin/gnome-shell               14MiB |
+-----------------------------------------------------------------------------+
```

## cudaのインストール
cudaのインストールは基本的にnvidiaの公式に従います. 最新のバージョン以外はhttps://developer.nvidia.com/cuda-toolkit-archive に落ちています. gpuにあったバージョンを選択してください. ちなみに, rtx3090は11.1以降でないと良くないようです. (それより前でもPytorch等は動くのですが, `Unknown CUDA arch (8.6) or GPU not supported`というエラーが出たりします.)
適当なバージョンをクリックすると画像のような画面になりますので, 言われた通りコマンドを叩きます.

![FireShot Capture 065 - CUDA Toolkit 11.3 Update 1 Downloads - NVIDIA Developer_ - developer.nvidia.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1065071/53da83be-fd56-064e-f62f-79f8b017ed2e.png)

### 重要!!!
最後の

```
$ sudo apt-get -y install cuda
```

に関してはバージョンに合わせて

```
$ sudo apt-get -y install cuda-11-1
```
のように書き換えてください!(そうじゃないと最新のバージョンが勝手にインストールされる)

最後に, pathを通して完了です. `~/.bashrc`に以下の二行を追記します.

```
export PATH="/usr/local/cuda-**.*/bin:$PATH"    # バージョンは適宜調整
export LD_LIBRARY_PATH="/usr/local/cuda-**.*/lib64:$LD_LIBRARY_PATH"
```
下記のコマンドで変更を適用します. (再起動しても良い)

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

ちゃんとインストールできたかは

```
$ nvcc -V
```

で確認できます.

## cuDNNのインストール
cuDNNをダウンロードしてきます. nvidiaのページにsign upしてからhttps://developer.nvidia.com/cudnn　 `Download cuDNN` -> `Archived cuDNN Releases`(前のバージョンが欲しい時)から必要なバージョンのcuDNNをダウンロードしてください. ダウンロードしてくるファイルは次の３つです.

- cuDNN Runtime Library for Ubuntu20.04 x86_64 (Deb)

- cuDNN Developer Library for Ubuntu20.04 x86_64 (Deb)

- cuDNN Code Samples and User Guide for Ubuntu20.04 x86_64 (Deb)

ダウンロードが完了したら, ファイルがあるディレクトリに移動し, 下記のコマンドでインストールします.

```
$ sudo dpkg -i libcudnn8_x.x.x-1+cudax.x_amd64.deb    # バージョンは適宜調整
$ sudo dpkg -i libcudnn8-dev_8.x.x.x-1+cudax.x_amd64.deb
$ sudo dpkg -i libcudnn8-samples_8.x.x.x-1+cudax.x_amd64.deb
```

これで, rtx3090が使えるようになりました! あとは各々python環境等を整えて下さい!


### 参考にした記事
https://k-hyoda.hatenablog.com/entry/2020/07/09/223907
https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html
https://stackoverflow.com/questions/66968382/valueerror-unknown-cuda-arch-8-6-or-gpu-not-supported