Ubuntu 18.04 GeForce RTX 2080 GPU Deep Learning

- Ubuntu 18.04
- GeForce RTX 2080

の構成で GPU を動作させるための設定手順。

まだ書きかけだがその内ちゃんと書き直すかも。



## Disable Secure boot

> 今ではもうしなくてよい項目

```
sudo apt install mokutil -y
sudo mokutil --disable-validation
```

`Change Secure boot state` を選んで、パスワードを入力した後 `YES` を選択して再起動する。すると解像度が適切なものになった。

```
dmesg | grep secure
[    0.000000] secureboot: Secure boot disabled
```

Secure boot が無効になったことが確認できた。



## Disable nouveau

> 今ではもうしなくてよい項目

```
$ lsmod | grep -i nouveau
nouveau              1716224  0
i2c_algo_bit           16384  1 nouveau
ttm                   106496  1 nouveau
drm_kms_helper        172032  1 nouveau
mxm_wmi                16384  1 nouveau
drm                   401408  3 drm_kms_helper,ttm,nouveau
wmi                    24576  4 intel_wmi_thunderbolt,wmi_bmof,mxm_wmi,nouveau
video                  45056  1 nouveau
```

```
sudo nano /etc/modprobe.d/blacklist-nvidia-nouveau.conf
```

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

```
sudo update-initramfs -u
```

Reboot してはいけない。

### Enter CUI mode

自分の環境だと `Ctrl + Alt + F3` で CUI mode に入り `Ctrl + Alt + F2` で GUI mode に戻れた。



## Install NVIDIA Driver

### Install driver

```
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
ubuntu-drivers devices
sudo apt install nvidia-driver-440
sudo reboot
```

```console
$ nvidia-smi
Tue Jan 29 13:34:45 2019       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.78       Driver Version: 410.78       CUDA Version: 10.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce RTX 2080    Off  | 00000000:01:00.0  On |                  N/A |
| 24%   32C    P8    14W / 215W |    337MiB /  7949MiB |      2%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      1780      G   /usr/lib/xorg/Xorg                            18MiB |
|    0      1838      G   /usr/bin/gnome-shell                          57MiB |
|    0      2475      G   /usr/lib/xorg/Xorg                           116MiB |
|    0      2616      G   /usr/bin/gnome-shell                          84MiB |
|    0      3539      G   ...uest-channel-token=16844326574801113722    58MiB |
+-----------------------------------------------------------------------------+
```



## CUDA と cuDNN はインストールしない

conda もしくは nvidia-docker に管理を任せるので CUDA や cuDNN のインストールはしない。



## Install conda

conda を使いたい人はこちら。

- [Miniconda installer archive](https://repo.continuum.io/miniconda/)

```console
$ wget "https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh"
$ sh Miniconda3-latest-Linux-x86_64.sh
$ conda -V
conda 4.5.12
```



## nvidia-docker

nvidia-docker を使いたい人はこちら。

### Install nvidia-docker

> [NVIDIA/nvidia-docker: Build and run Docker containers leveraging NVIDIA GPUs](https://github.com/NVIDIA/nvidia-docker)

上記を参考にして nvidia-container-toolkit をインストールする。

### Rootless Docker

- [nvidia-container-runtime doesn't work with rootless mode · Issue #38729 · moby/moby](https://github.com/moby/moby/issues/38729)

Rootless Docker を利用している場合は上のリンク先のような対応が必要。

```
sudo vim /etc/nvidia-container-runtime/config.toml
```

具体的には上記ファイルを以下のように書き換える。

```diff
- #no-cgroups = false
+ no-cgroups = true
```

マシンを再起動した後などに、以下のように言われた場合は `systemctl --user start docker` を実行すると良い。

```sh
Cannot connect to the Docker daemon at unix:///run/user/1000/docker.sock. Is the docker daemon running?
```

ログインの度に上記コマンドを実行しなければならない状態を解決するには `sudo loginctl enable-linger username` を実行しておくと良いかもしれない。



## GPU の動作確認

nvidia-docker の場合は以下のようにしてコンテナを起動する。

```
docker run -it --gpus all nvidia/cuda:10.0-devel-ubuntu18.04 bash
```

Docker 19.03 より `--gpus all` が利用できる。

- [Docker 19.03新機能 (root権限不要化、GPU対応強化、CLIプラグイン…) - nttlabs - Medium](https://medium.com/nttlabs/docker-1903-5155754ff8ac)

### PyTorch

`python3` を実行してインタラクティブモードで確認する。

```python
>>> import torch 
>>> print(torch.cuda.is_available())
True
>>> torch.cuda.get_device_name(0)
'GeForce RTX 2080'
```

- [PyTorch Cheat Sheet — PyTorch Tutorials 1.1.0 documentation](https://pytorch.org/tutorials/beginner/ptcheat.html?highlight=torch%20cuda%20is_available)

### TensorFlow and Keras

`python3` を実行してインタラクティブモードで確認する。

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

上記を実行すると以下のように利用できるデバイスの一覧を確認できる。

```python
[name: "/device:CPU:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 9038648218982750694
, name: "/device:XLA_GPU:0"
device_type: "XLA_GPU"
memory_limit: 17179869184
locality {
}
incarnation: 2090976096258654801
physical_device_desc: "device: XLA_GPU device"
, name: "/device:XLA_CPU:0"
device_type: "XLA_CPU"
memory_limit: 17179869184
locality {
}
incarnation: 9284591186135588828
physical_device_desc: "device: XLA_CPU device"
]
```



## MNIST

TBW