2017/03/14

GCEのGPUインスタンスでTensorFlowを動かす方法

Google Compute Engine(GCE)にGPUインスタンス(インスタンスにGPUを追加できる)が利用できるようになったので、TensorFlow(TF)を動かした。 

1. GPUインスタンスを作る

オフィシャルドキュメントに沿って作るもよし、Cloud Consoleから作るもよし。

GPUが使えるゾーンには現時点(2017/03/14)では制限があるので気を付ける。
OSの選択は気を付ける。GPU(NVIDIAのCUDA)がサポートしているOSにする。
また、各OS毎にCUDAツールキットのインストール方法が異なるので、気を付ける。
私はUbuntu 16.10のOSを選択。

1.1 CUDA Toolkit 8.0をインストールする

インスタンスが生成されたらSSHとかでログインして下記のスクリプトを実行する。
これでCUDA Toolkit 8.0がインストールされる。
#!/bin/bash
echo "Checking for CUDA and installing."
# Check for CUDA and try to install.
if ! dpkg-query -W cuda; then
  # The 16.04 installer works with 16.10.
  curl -O http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_8.0.61-1_amd64.deb
  dpkg -i ./cuda-repo-ubuntu1604_8.0.61-1_amd64.deb
  apt-get update
  apt-get install cuda -y
fi

他(バージョンも含めて)のOSの場合、インストールスクリプトが異なるので、オフィシャルドキュメントを参考にして下さい。

2. GPUの動作確認

nvidia-smiを使ってGPUが認識しているかを確認する。
$ nvidia-smi
Tue Mar 14 01:56:30 2017       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 375.26                 Driver Version: 375.26                    |
|-------------------------------+----------------------+----------------------+
| 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:04.0     Off |                    0 |
| N/A   35C    P8    27W / 149W |     13MiB / 11439MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID  Type  Process name                               Usage      |
|=============================================================================|
|    0      2145    G   /usr/lib/xorg/Xorg                              13MiB |
+-----------------------------------------------------------------------------+

コノような内容がコンソールに表示されたらGPU(0番デバイスにTesla K80)が認識されている。

3. cuDNNを追加

すでにドライバとCUDA Toolkitがインストールされているので次に、TensorFlowを動くようにする。
cuDNNはNVIDIAから取得できるが、アカウント登録が必要になるため、コチラから登録する。連絡がくるまで1日要することもあるので、お早めに。
アカウントがあれば先のURLのDownloadボタンから、必要なcudnnライブラリをダウンロードする。
今回の例だと、CUDA 8.0とLinuxの条件に当てはまる「cuDNN v5.1 Library for Linux」が適切。

.tgz形式のファイルがダウンロードできるので、それを展開して、適切な場所にコピーしてインストール完了。
$ tar zxvf cudnn-8.0-linux-x64-v5.1.tgz
$ sudo cp ./cuda/include/cudnn.h /usr/local/cuda/include
$ sudo cp ./cuda/lib64/libcudnn* /usr/local/cuda/lib64 
sudo chmod a+r /usr/local/cuda/lib64/libcudnn*

4. CUDA Compute Capabilityをインストール

$ sudo apt-get install libcupti-dev


5. TFをインストール

TFのインストールも簡単になったものです。下記コマンド1つでインストールできます。
Python2.7とPython3系ではインストール方法が異なるので気をつけて下さい。
TFはまだバージョン更新が激しいのでvirtualenvを作っておくと幸せになれると思います。
$ mkdir tf && cd tf
$ virtualenv --system-site-packages .venv
$ source .venv/bin/activate
(.venv)$ pip install --upgrade tensorflow-gpu

もし、CPUバージョンのTFをインストールしたいならtensorflow-gpuをtensorflowにして下さい。
Python3系を利用している場合はpipをpip3にして下さい。
これでインストールが完了しました。

5.1 動作確認

$ python
>>> import tensorflow as tf
>>> sess = tf.Session()

これでErrorが表示されなければ(Warningは表示されます)正常動作しています。