久しぶりにAWSのGPUインスタンスを見ていてると、p2インスタンスが利用可能になっていました。

p2のGPUはTesla K80が載っているのでg2系のK10よりも2.5倍ほど速い。FLOPSは2倍、GPUメモリは3倍、などおおむね倍以上のスペックになっていて、値段としては、g2.2xlargeが$0.65/hでp2.xlargeが$0.9/hなので、1.4倍ほど。ディープラーニングの学習が12時間かかったとしても1200円ちょっとで、コストパフォーマンスとしても割といいのではないでしょうか。
tesla-k80
このp2インスタンス、AmazonLinuxならCaffeなどが入っているらしいですが、ディープラーニングではubuntuばかり使っているので、ubuntuでのTensorFlowインストールを行います。以前に比べて妙な手間が減って割と簡単になった感があります。


Ubuntu初期設定

まずインスタンスを立ち上げます。Ubuntu Server 16.04 LTSを使用して、ディープラーニングではデータセットが大きくなるのでSSDは50GB以上など大きめにとっておきます。 awswiz
インスタンスが起動したら、ツール類をインストールしておきます。今回はPython2.7で。
$ sudo apt-get update
$ sudo apt-get upgrade -y
$ sudo apt-get install -y build-essential python-pip python-dev git python-numpy swig python-dev default-jdk zip zlib1g-dev ipython

CUDA/cuDNNインストール

デフォルトでnouveauのグラフィックドライバが有効になっているので、NVIDIAのCUDAなどドライバをインストールする際にエラーがでないように無効化しておきます。
$ echo -e "blacklist nouveau\nblacklist lbm-nouveau\noptions nouveau modeset=0\nalias nouveau off\nalias lbm-nouveau off\n" | sudo tee /etc/modprobe.d/blacklist-nouveau.conf
$ echo options nouveau modeset=0 | sudo tee -a /etc/modprobe.d/nouveau-kms.conf
$ sudo update-initramfs -u
$ sudo reboot

$ sudo apt-get install -y linux-image-extra-virtual
$ sudo reboot
NVIDIAのウェブサイトからドライバをダウンロードしておきます。
cuda
cuDNN
cuDNNはNVIDIAへのログインが必要です。CUDA8.0と、cuDNN5.1 for CUDA 8.0をダウンロードしたら、SCPなどでubuntu側へアップロードしておきます。

CUDAインストール

sudo apt-get install -y linux-source linux-headers-`uname -r`
sudo dpkg -i cuda-repo-ubuntu1604_8.0.61-1_amd64.deb
sudo apt-get update
sudo apt-get install cuda

cuDNNインストール

tar xvzf cudnn-8.0-linux-x64-v5.1.tgz
sudo cp -P cuda/include/cudnn.h /usr/local/cuda/include
sudo cp -P cuda/lib64/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*
sudo apt-get install libcupti-dev

.profile更新

export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64"
export CUDA_HOME=/usr/local/cuda
$ source ~/.profile
CUDAドライバのインストールは完了です。
$ nvidia-smi
で、
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 375.66                 Driver Version: 375.66                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla K80           Off  | 0000:00:1E.0     Off |                    0 |
| N/A   37C    P0    76W / 149W |      0MiB / 11439MiB |     93%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID  Type  Process name                               Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+
が出てくればOKです。


TensorFlowインストール

使いたいライブラリがr0.12バージョン指定だったのでTensorFlow r0.12をインストールします。必要に応じてバージョンは変えてください。
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-0.12.1-cp27-none-linux_x86_64.whl
$ sudo pip install --upgrade $TF_BINARY_URL
動作確認をしておきます。 TensorFlowの動作確認。
$ python
...
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
Hello, TensorFlow!
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> print(sess.run(a + b))
42
>>>
CUDAが上手く動いているか確認。
$ python -c 'import os; import inspect; import tensorflow; print(os.path.dirname(inspect.getfile(tensorflow)))'

I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcublas.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcudnn.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcufft.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcurand.so locally
/usr/local/lib/python2.7/dist-packages/tensorflow


ここまでできればAMIなどを作成してインスタンスを停止、使いたいときに起動という運用にしておけば、いつでも低コストで人工知能の開発ができますね。