nvidia-docker 2 を Docker CE (安定版) と共に Ubuntu 18.04 へインストールする

# 前提となる組合せ

以下の組合せでインストールしたいものとする：

* Ubuntu 18.04
* nvidia-docker 2
* Docker CE は安定版（stable）を使いたい
* CUDA のバージョンは特にこだわらないができるだけ新しいもの



※動作確認に使用したハードウェア

* NVIDIA V100
* Cisco UCS C240 M5

# Docker CE の Ubuntu 18.04 対応について
Docker CE 安定版が Ubuntu 18.04 へ対応しておらずしばらく[話題となっていた](https://github.com/NVIDIA/nvidia-docker/issues/643#issuecomment-384806571)が、2018年7月頃にサポートし、Docker の公式マニュアルにも [18.04 への対応が記載された](https://stackoverflow.com/questions/50096815/install-docker-on-ubuntu-18-04)。

# インストール要件の確認

[nvidia-docker 2 のインストール要件](https://github.com/NVIDIA/nvidia-docker/wiki/Installation-(version-2.0)#prerequisites)と[CUDA 要件](https://github.com/NVIDIA/nvidia-docker/wiki/CUDA#requirements)を参考にすると下表の組合せで良さそう。

特に Docker のバージョンについて、1.12 以降であればよいことになっているが、Ubuntu 18.04 が前提になると十分でない。[こちら](https://github.com/NVIDIA/nvidia-docker/wiki/Frequently-Asked-Questions#how-do-i-install-20-if-im-not-using-the-latest-docker-version)に「latest を使わない場合には nvidia-docker インストール時にバージョン指定が必要」な旨の記載があるので、latest （執筆時点で5:18.09.0~3-0）を使うこととしたがここに落とし穴があった。対応策は本文中に記載。

|Ubuntu|GNU/Linux x86_64 with kernel version | CUDA toolkit version 	| Driver version  | GPU architecture | Docker |
|:-:|:-:|:-:|:-:|:-:|:-:|
|18.04|> 3.10 |10.0 	| >= 410.48 	| >= 3.0 (Kepler) | latest (5:18.09.0~3-0) |

# インストール手順

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

```
$ uname -r
4.15.0-39-generic
```

## 2. Docker のインストール

```
$ sudo apt-get update
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    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       # 執筆時点では要書き換え
```

なお、執筆時点で[上記では不具合が起きてしまう](#発生した不具合への対応)ので、最後の一行を以下の通り書き換えた（バージョンを指定しないと 5:18.09.0~3-0~ubuntu-xenial がインストールされてしまい、後の工程でエラーが出る）：

```
$ sudo apt-get install docker-ce=5:18.09.0~3-0~ubuntu-bionic 
```

インストールした Docker のバージョンを確認：

```
$ sudo docker version
Client:
 Version:           18.09.0
 API version:       1.39
 Go version:        go1.10.4
 Git commit:        4d60db4
 Built:             Wed Nov  7 00:48:57 2018
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.0
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.4
  Git commit:       4d60db4
  Built:            Wed Nov  7 00:16:44 2018
  OS/Arch:          linux/amd64
  Experimental:     false
```

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

[NVIDIA のサイト](https://www.nvidia.com/Download/index.aspx)から以下の条件に合ったファイルを特定して WGET し、その後インストールする。

Version: 	410.72
Release Date: 	2018.10.29
Operating System: 	Linux 64-bit Ubuntu 18.04
CUDA Toolkit: 	10.0
Language: 	English (US)
File Size: 	92.55 MB 

```
wget http://us.download.nvidia.com/tesla/410.72/nvidia-diag-driver-local-repo-ubuntu1804-410.72_1.0-1_amd64.deb
sudo dpkg -i nvidia-diag-driver-local-repo-ubuntu1804-410.72_1.0-1_amd64.deb
sudo apt-get update
sudo apt-get install cuda-drivers
sudo reboot
```

動作確認：

```
$ nvidia-smi
Thu Nov 29 12:41:43 2018
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.72       Driver Version: 410.72       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  Tesla V100-PCIE...  Off  | 00000000:5E:00.0 Off |                    0 |
| N/A   35C    P0    35W / 250W |      0MiB / 16130MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+
```

## 4. nvidia-docker 2 のインストール

```
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

sudo apt-get install -y nvidia-docker2
sudo pkill -SIGHUP dockerd
```

以上でインストール完了。

# 発生した不具合への対応

※既に対応策は記載しているのでその通りの手順を踏めば以下の作業は不要。参考情報として記載。

本文中に記載した不具合は Docker (5:18.09.0~3-0~ubuntu-xenial) インストール後に nvidia-docker 2 をインストールする際に発生。両者のバージョン不整合が原因。エラーログは以下の通り：

```
$ sudo apt-get install -y nvidia-docker2
（略）
The following packages have unmet dependencies:
 nvidia-docker2 : Depends: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic) but 5:18.09.0~3-0~ubuntu-xenial is to be installed or
                           docker-ee (= 5:18.09.0~3-0~ubuntu-bionic) but it is not installable
E: Unable to correct problems, you have held broken packages.
```

nvidia-docker2 は docker-ce (= 5:18.09.0~3-0~ubuntu-bionic) を必要としていることがわかる。実際にインストールされているものは以下で確認可能：

```
$ apt list -a search docker-ce
Listing... Done
docker-ce/xenial,now 5:18.09.0~3-0~ubuntu-xenial amd64 [installed]
docker-ce/bionic 5:18.09.0~3-0~ubuntu-bionic amd64
docker-ce/bionic 18.06.1~ce~3-0~ubuntu amd64
docker-ce/xenial 18.06.1~ce~3-0~ubuntu amd64
docker-ce/bionic 18.06.0~ce~3-0~ubuntu amd64
docker-ce/xenial 18.06.0~ce~3-0~ubuntu amd64
docker-ce/xenial 18.03.1~ce-0~ubuntu amd64
docker-ce/bionic 18.03.1~ce~3-0~ubuntu amd64
docker-ce/xenial 18.03.0~ce-0~ubuntu amd64
docker-ce/xenial 17.12.1~ce-0~ubuntu amd64
docker-ce/xenial 17.12.0~ce-0~ubuntu amd64
docker-ce/xenial 17.09.1~ce-0~ubuntu amd64
docker-ce/xenial 17.09.0~ce-0~ubuntu amd64
docker-ce/xenial 17.06.2~ce-0~ubuntu amd64
docker-ce/xenial 17.06.1~ce-0~ubuntu amd64
docker-ce/xenial 17.06.0~ce-0~ubuntu amd64
docker-ce/xenial 17.03.3~ce-0~ubuntu-xenial amd64
docker-ce/xenial 17.03.2~ce-0~ubuntu-xenial amd64
docker-ce/xenial 17.03.1~ce-0~ubuntu-xenial amd64
docker-ce/xenial 17.03.0~ce-0~ubuntu-xenial amd64
```

表示の一行目で分かる通り-xenial (16.04) が最新としてインストールされてしまっているので Docker のバージョンを 5:18.09.0~3-0~ubuntu-bionic へ変更すればよい。

以下のコマンドでバージョンを指定して Docker CE をインストール：

```
$ sudo apt-get install docker-ce=5:18.09.0~3-0~ubuntu-bionic
```

確認：

```
$ sudo apt list -a search docker-ce
Listing... Done
docker-ce/xenial 5:18.09.0~3-0~ubuntu-xenial amd64 [upgradable from: 5:18.09.0~3-0~ubuntu-bionic]
docker-ce/bionic,now 5:18.09.0~3-0~ubuntu-bionic amd64 [installed,upgradable to: 5:18.09.0~3-0~ubuntu-xenial]
docker-ce/bionic 18.06.1~ce~3-0~ubuntu amd64
docker-ce/xenial 18.06.1~ce~3-0~ubuntu amd64
docker-ce/bionic 18.06.0~ce~3-0~ubuntu amd64
docker-ce/xenial 18.06.0~ce~3-0~ubuntu amd64
docker-ce/xenial 18.03.1~ce-0~ubuntu amd64
docker-ce/bionic 18.03.1~ce~3-0~ubuntu amd64
docker-ce/xenial 18.03.0~ce-0~ubuntu amd64
docker-ce/xenial 17.12.1~ce-0~ubuntu amd64
docker-ce/xenial 17.12.0~ce-0~ubuntu amd64
docker-ce/xenial 17.09.1~ce-0~ubuntu amd64
docker-ce/xenial 17.09.0~ce-0~ubuntu amd64
docker-ce/xenial 17.06.2~ce-0~ubuntu amd64
docker-ce/xenial 17.06.1~ce-0~ubuntu amd64
docker-ce/xenial 17.06.0~ce-0~ubuntu amd64
docker-ce/xenial 17.03.3~ce-0~ubuntu-xenial amd64
docker-ce/xenial 17.03.2~ce-0~ubuntu-xenial amd64
docker-ce/xenial 17.03.1~ce-0~ubuntu-xenial amd64
docker-ce/xenial 17.03.0~ce-0~ubuntu-xenial amd64
```

以上により下記コマンドで nvidia-docker2 のインストールが可能：

```
$ sudo apt-get install -y nvidia-docker2
```