Ubuntu16.04を入れて、nvidia-docker2を入れて、Chainerを動かす

以前に入れた、[Ubuntu16.10の環境](https://qiita.com/ikeyasu/items/5213b8902098b197f4d7#1-nouveau-kernel-driver-%E3%82%92disable%E3%81%AB%E3%81%99%E3%82%8B)が壊れたので、改めてGTX 1080 搭載のデスクトップPCを買って、 Ubuntu 16.04 を入れて、nvidia-docker2主体の環境を作り直してみました。前半は[Ubuntu16.10の記事](https://qiita.com/ikeyasu/items/5213b8902098b197f4d7#1-nouveau-kernel-driver-%E3%82%92disable%E3%81%AB%E3%81%99%E3%82%8B)とほぼ同じですが、御了承ください
以前は、16.10を入れて居ましたが、16.04.3ですと、WiFiもすんなり認識したので、今回は16.04です。


USBドライブを使ったインストールメディアの作り方
-----------------------

ここではMacでのやり方です。
基本的に以下に従う。
https://www.ubuntu.com/download/desktop/create-a-usb-stick-on-macos

1. Ubuntu をダウンロード https://www.ubuntu.com/download/desktop
2. Etcher をダウンロードしてインストール https://etcher.io/
3. USBドライブをさす
4. Etcher を起動、ディスクイメージを選択し、先ほどダウンロードしたISOを選択
5. ドライブでUSBドライブのものを選択
6. OKをクリック
7. 完了までかなり時間がかかるので待ちましょう（15分ほど）

Ubuntuをインストール
-----------------

画面に従い、普通にインストールしてください。その後、普通に

```bash
$ sudo apt update
$ sudo apt upgrade
```

以下、お好みで
-----------

```
$ sudo apt install screen ssh git
$ gsettings set org.gnome.Vino require-encryption false # mac の vnc からつながらないため
```

* "Desktop Sharing preference"アプリを開いて、VNC接続を有効に

NVIDIAドライバのインストール
---------------------------

参考： http://qiita.com/IshitaTakeshi/items/3efce820986f4560765d
参考：公式ドキュメント　https://developer.nvidia.com/compute/cuda/8.0/prod/docs/sidebar/CUDA_Installation_Guide_Linux-pdf

#### 1. Nouveau kernel driver をdisableにする

* /etc/modprobe.d/blacklist-nouveau.conf を作成

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

  ```
$ sudo update-initramfs -u
$ sudo reboot
  ```

#### 2. ドライバインストール


以下から、ドライバをダウンロード。
http://www.nvidia.com/Download/index.aspx?lang=en-us
GTX1080 の場合は、以下のように設定して検索すれば良いです。
ここで注意なのは、CUDA を使ってドライバーを入れないことです。CUDAは、Nvidia Tesla などGPGPU用に作られているようで、**CUDAに同梱されているドライバでは、GeForceで動かないかもしれません。**必ず、手持ちのGPUのドライバをインストールして、CUDA同梱のドライバは入れないようにして下さい。

![スクリーンショット 2017-07-02 17.32.32.png](https://qiita-image-store.s3.amazonaws.com/0/38555/13892100-afac-518c-be14-b4587d23ed19.png)

```
$ sudo service lightdm stop # x を止める
$ sudo ./NVIDIA-Linux-x86_64-384.111.run
$ sudo reboot
```

**なお、CUDAは、ホスト側に入れる必要はありません。**
もし、CUDAをコンテナ側でのみ使うのであれば、上記のドライバのみでOKです。

Dockerのインストール
-----------------

参考： https://docs.docker.com/install/linux/docker-ce/ubuntu/

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

fingerprint が`9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88`である事を確認

```
$ sudo apt-key fingerprint 0EBFCD88
pub   4096R/0EBFCD88 2017-02-22
      Key fingerprint = 9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid                  Docker Release (CE deb) <docker@docker.com>
sub   4096R/F273FCD8 2017-02-22
```

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

試しに実行してみる

```
$ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
ca4f61b1923c: Pull complete 
Digest: sha256:66ef312bbac49c39a89aa9bcc3cb4f3c9e7de3788c944158df3ee0176d32b751
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/
```

ついでに、docker を一般ユーザーで動くようにしておきます。

参考： https://docs.docker.com/install/linux/linux-postinstall/#manage-docker-as-a-non-root-user

```
$ sudo usermod -aG docker $USER
$ sudo /sbin/reboot
```

nvidia-docker2のインストール
------------------------

参考： https://github.com/NVIDIA/nvidia-docker#quickstart

```
$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
  sudo apt-key add -
$ curl -s -L https://nvidia.github.io/nvidia-docker/ubuntu16.04/amd64/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 run --runtime=nvidia --rm nvidia/cuda nvidia-smi
```

nvidia-dockerとGPUドライバのバージョンとの関係
-----------------------------------

ここで注意が必要なのは、最初に入れたドライバとnvidia-dockerで動かすCUDAのバージョンには対応関係があります。

https://github.com/NVIDIA/nvidia-docker/wiki/CUDA#requirements

※ 上記URLより転載

CUDA toolkit version   | Driver version  | GPU architecture
:---------------------:|:-----------------------:|:-------------------------:
  6.5                  | >= 340.29               | >= 2.0 (Fermi)
  7.0                  | >= 346.46               | >= 2.0 (Fermi)
  7.5                  | >= 352.39               | >= 2.0 (Fermi)
  8.0                  | == 361.93 or >= 375.51  | == 6.0 (P100)
  8.0                  | >= 367.48               | >= 2.0 (Fermi)
  9.0                  | >= 384.81               | >= 3.0 (Kepler)
  9.1                  | >= 387.26               | >= 3.0 (Kepler)
  9.2                  | >= 396.26               | >= 3.0 (Kepler)
  10.0                 | >= 384.130, < 385.00    | [Tesla GPUs](https://docs.nvidia.com/cuda/cuda-c-best-practices-guide/index.html#flexible-upgrade-path)
  10.0                 | >= 410.48               | >= 3.0 (Kepler)

後方互換性があるので、新しいドライバを入れておけば、それまでのCUDAで使えます。

また、GeforceのLinuxのドライバはリリースが少し遅いようで、2018/01/29 現在、 CUDA 9.1 が使える 387.26 以上のドライバーはリリースされていません。
このCUDAのバージョンと機械学習フレームワークのバージョンには対応があるので、注意が必要です。例えば、TensorFlow 1.5(tensorflow-gpu==1.5) は、CUDA 9.1 でないと使えません。

Chainerをnvidia-dockerで動かしてみる
-----------------------------

```
$ sudo docker run --runtime=nvidia -it --rm chainer/chainer:v4.0.0b3 bash

$ apt update && apt install -y git 
$ cd
$ git clone https://github.com/chainer/chainer.git
$ cd chainer/examples/mnist/
$ python train_mnist.py --gpu 0
```
```
/usr/local/lib/python2.7/dist-packages/cupy/core/fusion.py:659: FutureWarning: cupy.core.fusion is experimental. The interface can change in the future.
  util.experimental('cupy.core.fusion')
GPU: 0
# unit: 1000
# Minibatch-size: 100
# epoch: 20

Downloading from http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz...
Downloading from http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz...
Downloading from http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz...
Downloading from http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz...
/usr/local/lib/python2.7/dist-packages/chainer/training/extensions/plot_report.py:25: UserWarning: matplotlib is not installed on your environment, so nothing will be plotted at this time. Please install matplotlib to plot figures.

  $ pip install matplotlib

  warnings.warn('matplotlib is not installed on your environment, '
epoch       main/loss   validation/main/loss  main/accuracy  validation/main/accuracy  elapsed_time
1           0.191562    0.0984969             0.94325        0.9681                    7.7457
2           0.0727045   0.078326              0.977199       0.9761                    9.44116
3           0.0475951   0.0953064             0.984532       0.9715                    11.1401
4           0.0360086   0.0823658             0.988865       0.9786                    12.8432
5           0.0272196   0.0794587             0.991049       0.9771                    14.537
6           0.0242206   0.0740276             0.991665       0.9804                    16.225
7           0.022245    0.0832645             0.992348       0.9797                    17.9534
8           0.0192461   0.068595              0.993699       0.9838                    19.6568
9           0.0138185   0.0844866             0.995365       0.9806                    21.3518
10          0.0157227   0.0762108             0.994649       0.9832                    23.0431
11          0.0127363   0.0801768             0.995815       0.9821                    24.7315
12          0.0121151   0.081401              0.996299       0.9821                    26.4256
13          0.012959    0.0779125             0.995699       0.9835                    28.13
14          0.0108018   0.086303              0.996782       0.9825                    29.8367
15          0.00961264  0.0751394             0.997182       0.9839                    31.5322
16          0.00940392  0.0908331             0.997032       0.9823                    33.228
17          0.00934081  0.0928618             0.997416       0.9822                    34.9274
18          0.00880869  0.119626              0.997266       0.9772                    36.6393
19          0.0114004   0.125807              0.996866       0.9779                    38.3455
20          0.00832069  0.108752              0.997849       0.9807                    40.0682
```