Deep Learning 用 Workstation 構築記録 その４（nVidia Docker のインストール）



![IMG_2959.JPG](https://qiita-image-store.s3.amazonaws.com/0/177247/475e088a-351e-39e5-fbf9-2748a0cd2d29.jpeg "IMG_2959.JPG")

[その３](http://qiita.com/kunitaya/items/ce63c0ce0cec033a1ca0)で Fedora25 と CUDA のインストールが終わりました。
いよいよ Deep Learning を始めたい！となるのも分かりますが、その前に Docker と nvidia-docker をインストールしましょう。

### 作業を Docker コンテナ上で行うべき３つの理由
+ ホストの環境が汚れない
+ 前の環境を残したまま新しい環境を構築できる
+ Docker ならオーバーヘッドがほとんど存在しない

Deep Learning はまだ新しい技術で、（定番はありますが）枯れた方法というものがありません。
今後も色々な手法が出て来るでしょうし、正解という方法もまだ無いのが現状です。
何か環境を変えたいとなった時に、 Docker コンテナで新たに構築することで「以前の環境が残っていたために安定しない」という事がなくなります。
また、「新しい環境を試してみたけどやっぱり前の方が良かった」となった時も切り戻しが比較的簡単にできます。

#### それなら ESXi や VirtualBox でも良いの？
ESXi や VirtualBox でも GPU をパススルーできれば問題なく使えると思います。
ですがオーバーヘッドが Docker と比べて高い事や、「一度に１つの仮想マシンしか GPU を使えないこと」がデメリットになります。

#### ホスト直接の方がオーバーヘッドは少ない！
+ Docker だと学習コストが増える
+ CUDA の学習に全力投球したい


どうぞ、ホスト上で直接ご利用ください。
その方が一番性能を発揮できるのは間違いありませんし、先ずはやってみるというのは何より重要です。
KickStart を使えば、そこまで再構築の手間もないと思います。
それでも Docker も面白そうだなと思われるなら、この記事が何かの助けになれば幸いです。

## Docker インストール
### Docker CE インストール
[公式サイト](https://docs.docker.com/engine/installation/)の通り実行するだけです。
なお、特に断りがない限り全て root で実行します。

##### 既存 Docker のアンインストール
```
dnf remove docker docker-common container-selinux docker-selinux docker-engine
```

##### リポジトリインストール
```
dnf install dnf-plugins-core
dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo
dnf config-manager --set-enabled docker-ce-edge
```

##### Docker CE (Comunity Edition) のインストール
```
dnf install docker-ce
```

### Docker Compose インストール
アップデートに容易に対応する為、 pip を使ってインストールします。
##### pip3 のアップデート
```
pip3 install -U pip
```

##### docker-compose のインストール
```
pip3 install docker-compose
```

### 一般ユーザの Docker 利用登録
Docker はプロセスが全て root で実行されます。
この為、通常は一般ユーザでは実行できません。
一般ユーザに Docker の実行権限を与えたい場合は、以下を実行します。

```
usermod -aG docker <ユーザー名>
```



## nVidia Docker インストール
[ここ](https://github.com/NVIDIA/nvidia-docker/wiki)のCentOS用手順でインストールします。

```
wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker-1.0.1-1.x86_64.rpm
rpm -i /tmp/nvidia-docker*.rpm && rm /tmp/nvidia-docker*.rpm
```

### systemd 修正
```
systemctl edit nvidia-docker

```

以下を追記します。
>[Service]
ExecStart=
ExecStart=/usr/bin/nvidia-docker-plugin -s $SOCK_DIR -d /usr/local/nvidia

### ドライバー配置ディレクトリの作成
```
mkdir -p /usr/local/nvidia
chown -R nvidia-docker. /use/local/nvidia
```

### 実行テスト
Docker を実行したいユーザーで、以下を実行します。

```
nvidia-docker run --rm nvidia/cuda nvidia-smi
```

下のような表示が出れば完了です。

```
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 381.22                 Driver Version: 381.22                    |
|-------------------------------+----------------------+----------------------+
| 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 108...  Off  | 0000:05:00.0      On |                  N/A |
| 23%   27C    P8    10W / 250W |    223MiB / 11169MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  GeForce GTX 108...  Off  | 0000:06:00.0     Off |                  N/A |
| 23%   30C    P8     8W / 250W |    138MiB / 11172MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   2  GeForce GTX 108...  Off  | 0000:09:00.0     Off |                  N/A |
| 23%   27C    P8     9W / 250W |    138MiB / 11172MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   3  GeForce GTX 108...  Off  | 0000:0A:00.0     Off |                  N/A |
| 23%   31C    P8     8W / 250W |    138MiB / 11172MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID  Type  Process name                               Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+
```