AWSのGPUインスタンスにTensorflow/Keras環境を構築する 2017年6月版

## 概要

AWSのGPUインスタンスに、TensorflowおよびKerasがGPUで動作する環境を構築します。

こういった記事がn番煎じなのは承知の上ですが、それでもネットには各々のタイミングで書かれ最新かどうかも分からない資料が散逸しているので、こういうものと割り切って今の現状を書きます。まだまだ手作業な部分がありつつも、NouveauやCUDA Toolkitの手動インストールから解放されたようです。

## 参考資料 
基本的には下記URLの内容を参考にします。細かなバージョン等は変更を加えています。

- [How to Set Up a Deep Learning Environment on AWS with Keras/Theano](https://medium.com/towards-data-science/how-to-set-up-a-deep-learning-environment-on-aws-with-keras-theano-b0f39e3d861c)
- [AWS E2 G2インスタンス上にKeras環境を構築する 2017年2月版 - Qiita](http://qiita.com/bathtimefish/items/9f62042c7424486f514c)


## 環境

- OS: Ubuntu Server 16.04 LTS (HVM), SSD Volume Type ami-afb09dc8
- Instance type: g2.2xlarge, g2.8xlarge


## 作業

### GPUインスタンスのセットアップ

選択するOSはUbuntu 16.04、あとの細かな設定は割愛します。ここでの注意としては、CUDA Toolkitのファイルがでかいので、ストレージのサイズはデフォルトの8GBではなく少し多めにしておいた方がいいでしょう。

### NVIDIA Driverのインストール

```bash
$ sudo add-apt-repository ppa:graphics-drivers/ppa -y
$ sudo apt-get update
$ sudo apt-get install -y nvidia-375 nvidia-settings
```

### CUDA Toolkitのインストール

CUDA Toolkitをインストールします。今回は8.0を利用します。ここではwgetで取得していますが、下記URLから「Linux > x86_64 > Ubuntu > 16.04 > deb (local)」で取得したインストーラーと同じです。

[CUDA Toolkit Download | NVIDIA Developer](https://developer.nvidia.com/cuda-downloads)

```bash
$ wget https://developer.nvidia.com/compute/cuda/8.0/Prod2/local_installers/cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64-deb
$ sudo dpkg -i cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64-deb
$ sudo apt-get update
$ sudo apt-get install -y cuda nvidia-cuda-toolkit
```

ここで、`nvidia-smi`と`nvcc --version`で正常にインストールされたことを確認します。

### cuDNNのインストール

**追記: 下記URLから直接ダウンロードすることができるようです。**
**`$ wget http://developer.download.nvidia.com/compute/redist/cudnn/v5.1/cudnn-8.0-linux-x64-v5.1.tgz`**

~~cuDNNはNVIDIAのサイトからダウンロードしてAWSのインスタンスに転送する必要があります。~~

~~下記URLのダウンロードボタンを押して「cuDNN Software License Agreement」に同意し、「Download cuDNN v5.1 (Jan 20, 2017), for CUDA 8.0」の「cuDNN v5.1 Library for Linux」（ファイル名：`cudnn-8.0-linux-x64-v5.1.tgz`）をダウンロードします。要ログイン。~~

[NVIDIA cuDNN | NVIDIA Developer](https://developer.nvidia.com/cudnn)

~~ダウンロードしたファイルをAWSのGPUインスタンスにコピーします。~~

```bash
# local
$ scp cudnn-8.0-linux-x64-v5.1.tgz aws-gpu-instance:
```

解凍して中のファイルを配置します。

```bash
$ tar zxvf cudnn-8.0-linux-x64-v5.1.tgz 
$ sudo mv cuda/lib64/* /usr/local/cuda/lib64/
$ sudo mv cuda/include/* /usr/local/cuda/include/
```

### 環境変数の設定

利用しているシェルの設定ファイルに下記設定を追加します。今回は`.bashrc`に追記しました。

```bash
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda/lib64"
export CUDA_HOME=/usr/local/cuda
```

### TensorflowおよびKerasをインストールする

さて、ようやくTensorflowとKerasのセットアップです。Pythonの環境構築は割愛しますが、[この記事](http://qiita.com/bathtimefish/items/9f62042c7424486f514c)に従うとpyenv/virtualenvを利用したPython3の環境が構築できます。

```bash
$ pip install tensorflow-gpu
$ pip install keras
```

### GPUが利用できるかどうかテストする

試しにKerasのソースコードをダウンロードして、中のexampleを幾つか動かしてみます。

```bash
$ git clone https://github.com/fchollet/keras.git
$ cd keras/examples
$ python mnist_cnn.py
```

何か適当に動かしてみて、`nvidia-smi`でGPU-Utilが上がったり、ローカルやCPU利用版より明らかに早ければOKでしょう。お疲れ様でした。

## 参考：試行錯誤時のエラー

[参考URLの一つ](https://medium.com/towards-data-science/how-to-set-up-a-deep-learning-environment-on-aws-with-keras-theano-b0f39e3d861c)に従ってインストールすると、cuDNNのバージョン差異でエラーになります。v5.0ではなくv5.1を利用しましょう。

```
Loaded runtime CuDNN library: 5005 (compatibility version 5000) but source was compiled with 5110 (compatibility version 5100)
```

- [tensorflow - Loaded runtime CuDNN library: 5005 (compatibility version 5000) but source was compiled with 5103 (compatibility version 5100) - Stack Overflow](https://stackoverflow.com/questions/39859260/loaded-runtime-cudnn-library-5005-compatibility-version-5000-but-source-was-c)