ubuntu18.04LTS+GPU有効のdocker環境を構築する

# 3行で
* 毎度毎度何かしらやらかしてくれるnvidiaのアレコレを簡単に構築したい
* dockerは19.03以上でGPU対応したので、構築済みのdockerイメージを使う
* ホストOSに必要なのはGPUのドライバのみ。CUDA不要

# 必要な作業
1. OSのインストール
2. GPUドライバのインストール
3. dockerのインストール
4. nvidia-container-toolkitのインストール


# 完成形
```bash:
user@host:~$ sudo docker run --rm -it  --gpus all  nvidia/cuda:7.5-devel 
root@695b31f3738d:/# nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2015 NVIDIA Corporation
Built on Tue_Aug_11_14:27:32_CDT_2015
Cuda compilation tools, release 7.5, V7.5.17
root@695b31f3738d:/# nvidia-smi
Fri Jun  5 11:19:48 2020       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.59       Driver Version: 440.59       CUDA Version: 10.2     |
|-------------------------------+----------------------+----------------------+
| 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 GTX 1070    Off  | 00000000:01:00.0  On |                  N/A |
| 28%   36C    P8    10W / 151W |    573MiB /  8117MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+
root@695b31f3738d:/# 


```

こんなんになります。
`nvidia/cuda:***-devel`　の`***`の部分を`10.0`だったり`9.0`だったりにするとCUDAのバージョンを変えられる。
ホストOSでやるとめんどいやつ。

# OSのインストール
[ここ](https://www.ubuntulinux.jp/News/ubuntu1804-ja-remix)などからisoを取得して[Rufus](https://rufus.ie/)などでライブUSBを作ります。
USBさしてPCを再起動してBIOSの画面で起動の優先順位をUSBを最優先にすれば、あとは指示にしたがうだけ。

# GPUドライバのインストール
```bash:
sudo ubuntu-drivers autoinstall
```

やってる間に別のターミナル立ち上げてnouveauを無効にしましょう。`blacklist-nouveau.conf`というファイルを作り、下記の内容を書き込んでおく。

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

```:blacklist-nouveau.conf
blacklist nouveau
options nouveau modeset=0
```

ドライバのインストールが終わったタイミングでカーネルモジュール再読込

```bash:
sudo update-initramfs -u
```

PCを再起動して`nvidia-smi`を行う。GPUの情報っぽいものが出ればドライバインストール成功。

## (不要)CUDAのインストール
docker前提ならホストOSにCUDAは不要です。

>The machine running the CUDA container only requires the NVIDIA driver, the CUDA toolkit doesn't have to be installed.
https://github.com/NVIDIA/nvidia-docker/wiki/CUDA

というか、[この通り](https://developer.nvidia.com/cuda-downloads)導入しようとしたら[ダメ](https://forums.developer.nvidia.com/t/cuda-install-unmet-dependencies-cuda-depends-cuda-10-0-10-0-130-but-it-is-not-going-to-be-installed/66488)でした。

CUDAのバージョンなり、その他機械学習フレームワークのバージョンだったりを色々変えたいモチベーションはあると思うので、dockerでいいのではないかと思います。構築簡単だし。

# dockerのインストール
[公式](https://docs.docker.com/engine/install/ubuntu/)
19.03以降のバージョンをインストールしてください。

```bash:
sudo apt-get update
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
```

成功していれば

```bash
sudo docker run hello-world
```
が通ります。

# nvidia-container-toolkitのインストール
[公式](https://github.com/NVIDIA/nvidia-docker#quickstart)

```bash:
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker
```

うまくいっていれば

```bash:
sudo docker run --rm --gpus all nvidia/cuda:7.5-devel nvcc --version
```

が

```
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2015 NVIDIA Corporation
Built on Tue_Aug_11_14:27:32_CDT_2015
Cuda compilation tools, release 7.5, V7.5.17
```

を返します。別のバージョンのCUDAも簡単に試せて

```bash:
sudo docker run --rm --gpus all nvidia/cuda:10.0-devel nvcc --version
```

などとすればOKです。

# 補足
tensorflowもこの方法で導入できます。
https://www.tensorflow.org/install/docker

探せばメジャーなフレームワークはdockerイメージがありそうで、もうホストOSに環境構築する必要はないのでは。

# 参考
[Ubuntu18.04にCUDAをインストールする](https://qiita.com/protocol1964/items/19de3d1e27306f80d06d)