AWS(Ubuntu14.04)をDeepLearning用にセットアップする（CUDA, cuDNNをインストール）

# 1. AWSでDeepLearning用マシンを用意する

DeepLearningには、GPUを搭載したLinuxマシンが欠かせません。

しかし自分でGPUマシンを揃えるのは手間もお金もかかるので、
AWS(Amazon Web Service)で、お手軽に高性能なLinuxマシンを用意しましょう。

## 1.1. インスタンスの要件

インスタンス(AWS上のコンピュータ)には、以下の条件のものを採用します。

* AMI(OS): Ubuntu14.04 64-bit
    * 通常のUbuntu
* インスタンスタイプ: g2.2xlarge
    * GPU対応
* ストレージ: 100GB
    * デフォルトの8GBでは不足

AMIではUbuntuの他にAmazon Linuxなどが選択できますが、
パッケージ関連でトラブルが多発するため、普通のUbuntuを使うのがおすすめです。

## 1.2. セキュリティグループの設定

デフォルトではSSH接続しか許可していないので、
AWS上でサーバを立ててもアクセスできません。pingも飛びません。

セキュリティグループからTCPプロトコルの8888ポートをアクセスできるように設定します。

## 1.3. Elastic IP の設定

AWSでは再起動のためにインスタンスの停止を行う必要がありますが、
インスタンスを停止するたびにパブリックIPが変わってしまいます。

そこでパブリックIPを固定するために、Elastic IPを登録して、インスタンスへと割り当てます。

## 1.4. インスタンスにSSH接続

SSHクライアントソフト[Tera Term](https://osdn.jp/projects/ttssh2/)をダウンロードしましょう。

インスタンスのパブリックIPに接続して、
ユーザー名「ubuntu」でインスタンス作成時にダウンロードできるキーを指定すると、
インスタンスのコンソールに入れます。

ここでUbuntuとしての操作を行います。

# 2.　GPUを使えるようにする

ここまでで、AWS上にインスタンスを設置できました。

しかしインスタンスg2.2xlargeはGPUを搭載していますが、
デフォルトではGPUが使えるようにはなっていません。

そこで、以下のものをインストールして、GPUでDeepLearningができるようにします。

* NVIDIAのグラフィックドライバ
* CUDA-toolkit
* cuDNN

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

### 2.1.1. パッケージのアップデート

まずはパッケージ管理システムをアップデートします。
aptitudeではなくapt-getを使用しても構いません。

```bash:bash
$ sudo aptitude update
$ sudo aptitude -y full-upgrade
$ sudo aptitude install -y build-essential cmake
```

### 2.1.2. nouveauを停止

次に、グラフィックドライバを更新したいのですが、
まずはデフォルトのグラフィックドライバ（nouveau）を停止します。

以下の設定ファイルを作成したあと、

```bash:/etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
blacklist lbm-nouveau
options nouveau modeset=0
alias nouveau off
alias lbm-nouveau off
```

```bash:/etc/modprobe.d/nouveau-kms.conf
options nouveau modeset=0
```

bashから停止用のコマンドを叩きます。

```bash:bash
$ sudo update-initramfs -u
```

ここでインスタンスを再起動します。
AWSだとrebootコマンドで再起動できないので、
AWSコンソールからインスタンスを一度停止し、再開させます。

### 2.1.3. グラフィックドライバのインストール

[NVIDIAの公式ページ](http://www.nvidia.co.jp/Download/index.aspx?lang=jp)からドライバをダウンロードします。

* 製品のタイプ: GRID
* 製品シリーズ: GRID Series
* 製品ファミリー: GRID K520
* オペレーティングシステム: Linux 64-bit
* 言語: Japanese

インスタンスに直接ダウンロード先からwgetしてもいいですし、tera termなどを介してダウンロードしたドライバを送信しても構いません。

ドライバのインストールは下記のコマンドで実行します。

```bash:bash
$ sudo aptitude install -y linux-image-extra-virtual linux-source linux-headers-`uname -r`
$ wget 『ドライバ』.run
$ sudo sh 『ドライバ』.run -a --disable-nouveau
```

ここで再びインスタンスを再起動すると、ドライバのインストールが完了します。

## 2.2. CUDA-toolkitのインストール

[CUDAの公式ページ](https://developer.nvidia.com/cuda-downloads)からcuda用のリポジトリをダウンロードします。

* Operating System: Linux
* Architecture: x86_64
* Distribution: Ubuntu
* Version: 14.04
* Installer Type: deb(network)

ダウンロードしたリポジトリを有効にすると、aptitude(apt-get)からcudaがインストールできるようになります。

```bash:bash
$ wget 『リポジトリ』.deb
$ sudo dpkg -i 『リポジトリ』
$ sudo aptitude update
$ sudo aptitude install -y cuda
$ sudo reboot
```

## 2.3. cuDNNのインストール

### 2.3.1. cuDNNのダウンロード

[NVIDIAのページ](https://developer.nvidia.com/cudnn)からcuDNNをダウンロードします。
このダウンロードにはアカウント登録が必要なので、適当なアカウントを作成してください。

また、cuDNNのアーカイブファイルはwgetで直接取ってこれないので、
tera termなどを介してインスタンスに送る必要があります。

```bash:bash
$ tar -xvf 『cnDNN』.tgz
$ cd cuda
$ sudo cp include/cudnn.h /usr/local/『cuda-X.X』/include/
$ sudo cp lib64/libcudnn* /usr/local/『cuda-X.X』/lib64
$ sudo ldconfig /usr/local/cuda/lib64
```

ldconfigに失敗する場合は、競合するファイルを削除します。

### 2.3.2. 環境変数の設定

ホームに戻り、.bashrcを書き換えます。

```bash:bash
$ cd ~
$ vim .bashrc
```

```bash:~/.bashrc
export PATH=/usr/local/『cuda-X.X』/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/『cuda-X.X』/lib64:$LD_LIBRARY_PATH
```

最後に.bashrcの内容を有効にします。

```bash:bash
$ source .bashrc
```

### 2.3.3. インストール成否の確認

以下のコマンドを打ってCUDAの情報が表示されていれば、
GPU用の設定が完了できています。

```bash:bash
$ nvcc -V
```

# 3. Python関連をインストール

DeepLearningの実装には、Pythonを使います。
Pythonの数理計算用モジュールや、開発環境（jupyter notebook）を一括で入れるために、
Anacondaというディストロをインストールします。

その他に、DeepLearningライブラリのTheanoや、
画像処理用ライブラリのopenCVを使えるようにします。

## 3.1. Anacondaをインストール

```bash:bash
$ wget https://3230d63b5fc54e62148e-c95ac804525aac4b6dba79b00b39d1d3.ssl.cf1.rackcdn.com/Anaconda3-2.4.1-Linux-x86_64.sh
$ bash Anaconda3-2.4.1-Linux-x86_64.sh
$ source .bashrc
```

shが通らなかったのでbashコマンドを使いました。

## 3.2. Theanoをインストール

```bash:bash
$ sudo aptitude install git
$ pip install git+git://github.com/Theano/Theano.git --upgrade --no-deps
```
pipでgitを介さず直接Theanoを引っ張ってきた場合は、一部の古いモジュールでエラーを吐くことがあります。

## 3.3. openCVをインストール

Anacondaを使えば、openCVも1行でインストールできます。

```bash:bash
$ conda install -c https://conda.binstar.org/menpo opencv3
``` 

# 4. GPUの動作確認

これまでのセットアップの成否を確認するには、

```python:gpu_check.py
from theano import function, config, shared, sandbox
import theano.tensor as T
import numpy
import time

vlen = 10 * 30 * 768  # 10 x #cores x # threads per core
iters = 1000

rng = numpy.random.RandomState(22)
x = shared(numpy.asarray(rng.rand(vlen), config.floatX))
f = function([], T.exp(x))
print(f.maker.fgraph.toposort())
t0 = time.time()
for i in range(iters):
    r = f()
t1 = time.time()
print("Looping %d times took %f seconds" % (iters, t1 - t0))
print("Result is %s" % (r,))
if numpy.any([isinstance(x.op, T.Elemwise) for x in f.maker.fgraph.toposort()]):
    print('Used the cpu')
else:
    print('Used the gpu')

```

上のPythonスクリプト(gpu_check.py)を下記のコマンドで実行してみましょう。

```bash:bash
$ THEANO_FLAGS=mode=FAST_RUN,device=gpu,floatX=float32 python gpu_check.py
```

この実行結果が

```bash:bash
Using gpu device 0: GeForce GTX 580
[GpuElemwise{exp,no_inplace}(<CudaNdarrayType(float32, vector)>), HostFromGpu(GpuElemwise{exp,no_inplace}.0)]
Looping 1000 times took 0.638810873032 seconds
Result is [ 1.23178029  1.61879349  1.52278066 ...,  2.20771813  2.29967761
  1.62323296]
Used the gpu
```

となっていれば、TheanoがGPUで動いていることが確認できます。

# 5. セットアップ完了

以上で、AWSをDeepLearning用に設定することができました。

最後に、開発環境を立ち上げて、いざ人工知能を実装しましょう。

```bash:bash
$ jupyter notebook --no-browser --ip="*"
```

# 参考文献

AWSへのグラフィックドライバドライバ・CUDAのインストール：
http://qiita.com/shinya_ohtani/items/f374ed0dd51737087369

cuDNNのインストール：
http://www.computervisionbytecnalia.com/es/2016/06/deep-learning-development-setup-for-ubuntu-16-04-xenial/

cuDNNの環境変数設定：
http://qiita.com/bohemian916/items/a48e6496b04bbbf09fb3

Anacondaのインストール：
http://morimori2008.web.fc2.com/contents/PCprograming/python/pythonAnaconda.html

Theanoのインストール：
https://github.com/fchollet/keras/issues/1888

openCVのインストール：
http://hikuichi.hatenablog.com/entry/2015/12/22/124044

TheanoをGPU動作させる：
http://deeplearning.net/software/theano/tutorial/using_gpu.html