Ubuntu18.04にCUDAとnvidia-docker2をインストール

## 前提
* Ubuntu 18.04にCUDAとnvidia-docker2をインストールする手順を説明します。
* 2018年6月6日現在、安定した環境が必要ならUbuntu16.04を使った方が良いと思います。

## 環境
* OS: Ubuntu 18.04
* GPU: GeForce GTX 1080

CUDAもdockerもnvidia-driverも入っていない状態からインストールしていく前提で書いていきます。

## CUDA 9.1のインストール

nvidia-docker2のrequirementsにはCUDA 9.1までしか記載が無いので、CUDA 9.1をインストールしてみます。
https://github.com/nvidia/nvidia-docker/wiki/CUDA#requirements

手順はこの記事を参考にさせていただきました。
https://qiita.com/yukoba/items/4733e8602fa4acabcc35

### 準備

```shell
$ sudo apt update
$ sudo apt upgrade
```

### CUDAとnvidia-driveのインストール

```shell
$ sudo apt install nvidia-cuda-toolkit nvidia-driver-390
$ sudo reboot
```

### nvidia-smiで動作確認

```shell
$ nvidia-smi
Wed Jun  6 12:51:28 2018       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.48                 Driver Version: 390.48                    |
|-------------------------------+----------------------+----------------------+
| 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 1080    Off  | 00000000:01:00.0  On |                  N/A |
| 27%   38C    P8     7W / 180W |    707MiB /  8118MiB |      2%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      1161      G   /usr/lib/xorg/Xorg                            40MiB |
|    0      1232      G   /usr/bin/gnome-shell                          49MiB |
|    0      1490      G   /usr/lib/xorg/Xorg                           349MiB |
|    0      1617      G   /usr/bin/gnome-shell                         170MiB |
|    0      2242      G   ...-token=D43C41A55B86FF654DC9ACF0F3A5BF30    92MiB |
+-----------------------------------------------------------------------------+

```

hostマシン上でCUDAが動いた事を確認できました。

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

公式に書いてある手順でインストールします。

https://github.com/NVIDIA/nvidia-docker

```shell
# Add the package repositories
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
  sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
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

# Install nvidia-docker2 and reload the Docker daemon configuration
sudo apt-get install -y nvidia-docker2
sudo pkill -SIGHUP dockerd

# Test nvidia-smi with the latest official CUDA image
docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi
```

### nvidia-dockerの動作確認

```shell
$ sudo docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi
Unable to find image 'nvidia/cuda:latest' locally
latest: Pulling from nvidia/cuda
b234f539f7a1: Pull complete 
55172d420b43: Pull complete 
5ba5bbeb6b91: Pull complete 
43ae2841ad7a: Pull complete 
f6c9c6de4190: Pull complete 
0555b970f65d: Pull complete 
864a2d44e3fa: Pull complete 
b6ff28d6c105: Pull complete 
0c3c54b51c1e: Pull complete 
570d460dc4c7: Pull complete 
Digest: sha256:2cc38b464d4e0ca8d04a512061f56b7931036c6ae2c9520a39bbd47f943d2295
Status: Downloaded newer image for nvidia/cuda:latest
Wed Jun  6 04:00:20 2018       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.48                 Driver Version: 390.48                    |
|-------------------------------+----------------------+----------------------+
| 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 1080    Off  | 00000000:01:00.0  On |                  N/A |
| 27%   37C    P8     7W / 180W |    740MiB /  8118MiB |      1%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+

```

nvidia-docker上で動作するコンテナからCUDAにアクセスできる事が確認できました。

### dockerのバージョン

nvidia-docker2インストール時にdokcer本体もインストールされています。



```
$ docker --version
Docker version 17.12.1-ce, build 7390fc6
```

コンテナ上でCUDAが使えるようになりました。

### おまけ: Ubuntu 18.04にdocker-composeを入れて、nvidia-docker2のコンテナを管理したい場合

`apt install docker-compose`でインストールできるdocker-composeだとバージョンが古くてruntimeオプションに対応していません。
この手順で新しいバージョンのdocker-composeがインストール出来ます。

https://qiita.com/sabaku2017/items/1591ff5ee3f3a2bc79f4