AzureのNシリーズでChainer、Tensorflow、CNTK、DIGITSのGPU環境を作る

# AzureのNCインスタンスでChainer、Tensorflow、CNTK、DIGITSのGPU環境を作る
AzureのNCインスタンス上にChainer、Tensorflow、CNTK、DIGITSの環境を作った時の手順をまとめます。

## VM作成
Azureのポータルから行いました。注意点は以下の通りです。

- LinuxはUbuntu16.04のみサポートされている。[(参考URL)](https://github.com/Microsoft/azure-docs/blob/master/articles/virtual-machines/virtual-machines-linux-n-series-driver-setup.md)
    - 他のバージョンでも起動はできるようですが、肝心のGPUを認識しませんでした。
- NCシリーズが使えるリージョンは限られている。
    - 米国中南部、米国東部で使えますが、日本リージョンではまだ使えないようです。
- OSディスクはHDDを選択しなくてはいけない。
- リージョンのリソース状況によっては作成できないことがある。
    - 時間を置けば作成できるようになります。

## NVIDIA Dockerのインストール
依存関係が面倒なことになりそうだったので、dockerを使って環境を分けることにしました。NVIDIAが提供しているNVIDIA DockerはCUDAやcuDNNが既に入っているので、こちらを使うことにします。

### 1.GPUドライバインストール 
```shell-session
sudo apt-get update
sudo apt install -y gcc make
wget -O /tmp/NVIDIA-Linux-x86_64-375.20.run http://us.download.nvidia.com/XFree86/Linux-x86_64/375.20/NVIDIA-Linux-x86_64-375.20.run
chmod +x /tmp/NVIDIA-Linux-x86_64-375.20.run
sudo sh /tmp/NVIDIA-Linux-x86_64-375.20.run
```

### 2.Dockerインストール
```shell-session
apt-get update
apt-get install apt-transport-https ca-certificates
apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
echo "deb https://apt.dockerproject.org/repo ubuntu-xenial main" >> /etc/apt/sources.list.d/docker.list
apt-get update
apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual
apt-get install docker-engine
docker run hello-world
```

### 3.NVIDIA Dockerインストール
```shell-session
wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.0-rc.3/nvidia-docker_1.0.0.rc.3-1_amd64.deb
dpkg -i /tmp/nvidia-docker*.deb && rm /tmp/nvidia-docker*.deb
nvidia-docker run --rm nvidia/cuda nvidia-smi
```
最後のnvidia-smiでGPUの状態が出力されていれば完了です。

## 各フレームワークのインストール
ここから各フレームワークのDockerコンテナを作っていきます。GPUも使えるように作っています。

### 1.DIGITS
```shell-session
sudo nvidia-docker run --name digits -d -p 8080:34448 nvidia/digits
```
これでDockerホストの8080ポートでDIGITSが起動します。

### 2.Chainer
```shell-session
sudo nvidia-docker run -it --name chainer nvidia/cuda:cudnn /bin/bash
```
でコンテナを起動し、

```shell-session
sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get wget git -y
```
のように必要なものを適当に準備し、[データサイエンティストを目指す人のpython環境構築 2016](http://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c)のLinuxの場合を見ながらanacondaの設定をしました。最後に

```shell-session
pip install chainer
```
でchainerがインストールできました。

### 3.Tensorflow
Chainerと同様にしてコンテナを作り、anacondaの設定までした後、

```shell-session
export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-0.12.0rc1-cp35-cp35m-linux_x86_64.whl
pip install --ignore-installed --upgrade $TF_BINARY_URL
```
でtensorflowがインストールできました。

### 4.CNTK
Microsoftがdockerイメージを提供していたので、それを利用しました。
[CNTK Docker Containers](https://github.com/Microsoft/CNTK/wiki/CNTK-Docker-Containers)
こちらの手順通りに実行すればCNTKがインストールできました。
（ビルドに時間がかかるのと、途中赤い文字がたくさん見えてどきどきします。）

## まとめ
以上で、Chainer、Tensorflow、CNTK、DIGITSでGPUが使える環境を作ることができました。NVIDIA Docker様々です。

## 参考ページ
[Azure NシリーズでNVIDIA DIGITSをサクッと動かす](http://qiita.com/ksasaki/items/bd85786171424901b27d)
[Azure で NVIDIA GPU を使うには](http://qiita.com/pottava/items/28228293d3f841c1e934)
[データサイエンティストを目指す人のpython環境構築 2016](http://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c)
[nvidia-dockerとは？](http://blog.engineer.adways.net/entry/2016/09/03/012940)
[TensorFlow Get Started - Anaconda installation](https://www.tensorflow.org/get_started/os_setup#anaconda_installation)
[Pythonの環境構築からTensorFlowインストール](http://qiita.com/bohemian916/items/4f0736dcea932a162d9e)
[CNTK Docker Containers](https://github.com/Microsoft/CNTK/wiki/CNTK-Docker-Containers)