TensorFlowのGPU環境をGCPでさくっと作る方法

TensorFlowのためのGPU環境をGCPの[Google Compute Engine (GCE)](https://cloud.google.com/compute/)で構築するには、

- GPUの割り当て申請（初回のみ。所要時間は約5分）
- CUDAやcuDNNをインストール（[NVIDIAのサイトからダウンロードしたりインストールしたりなんだり](https://www.tensorflow.org/install/install_linux#nvidia_requirements_to_run_tensorflow_with_gpu_support)でスゲー時間かかって面倒）
- TensorFlowをインストール（所要時間は約5分）

って手順が必要。しかし最近、[Cloud DatalabのGPUインスタンス](https://cloud.google.com/datalab/docs/reference/command-line/create#--machine-type_machine_type)が利用可能になったおかげで、この手順がぐんと簡単になった。

- GPUの割り当て申請（初回のみ。所要時間は約5分）
- Cloud Datalabインスタンスを作成（コマンド一発、待ち時間は15分ほど）

これでOK。DatalabインスタンスにはTensorFlowだけじゃなくて、scikit-learnとかpandas、matplotlib等の定番ツールも入ってるので、Anaconda的なお手軽環境をGPUインスタンス上でさくっと構成できる。

以下、その手順を解説する。

## GPUの割り当て申請

GCPのGCEもしくはDatalabでGPUを使うには、初回のみ割り当て（クオータ）申請の手順が必要となる。申請とは言っても、べらぼうな数量を申請しない限り、2〜3分で割り当て許可が得られる（ちなみに、GCPの無料トライアルではGPU割り当て申請は行えない）。

まずはGCPのコンソールから`IAMと管理`-`割り当て`を選択する。`指標`フィルタの`なし`を選択してフィルタをクリアしたあと、`NVIDIA P100`または`K80`を選ぶ。すると、GPU割り当ての一覧が絞り込み表示される。

<img width="1267" alt="Screen Shot 2017-12-31 at 11.16.21 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/38290/3de82c34-eced-af9f-7fad-5e5338fc34b3.png">

GPU割り当てはリージョンごとに設定する。ここでは東京リージョン`asia-northeast1`を選択し、`割り当てを編集`をクリックする。

<img width="475" alt="Screen Shot 2017-12-31 at 11.29.48 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/38290/32507103-088a-8c48-e246-19d5b8ec04b9.png">

ここで、`次に変更`の部分に使用したいGPU数の上限を指定する。ここで指定した数値はあくまで上限値なので、どのような数字を入れてもこの時点で課金が発生することはない。とりあえず4個くらいを指定しておけば、さくっと自動承認されるはず。あまり大きな数（100個とか）を入れるとサポート担当者とのやり取りが必要となる。`理由`の部分にはGPUの使いみちを適当に書いておけばよい。

まもなくして、以下のような承認メールが届く。

```
Hello,

Your quota request for project 'xxx' has been approved and your quota has been adjusted accordingly.

The following quotas were increased:
+-------------------------+------------------+
| Region: asia-northeast1 | NVIDIA_P100_GPUS |
+-------------------------+------------------+
|         Changes         |      0 -> 4      |
+-------------------------+------------------+
```

これでP100を最大4個まで使う準備が整った。

## Datalabインスタンスの作成

ここからはDatalabの[Quickstart](https://cloud.google.com/datalab/docs/quickstart)にしたがってGPUインスタンスを作成していく。以下に要点のみ書いておこう。

### Google Cloud SDKのインストール

Datalab（というかGCPのいろいろなサービス）の利用には[Google Cloud SDK](https://cloud.google.com/sdk/docs/)をインストールしておくと何かと都合がよいので、まずはこちらをインストールしておく。

### Datalab GPUインスタンスの作成

DatalabのCPUインスタンスを作成するには、以下のようなコマンドオプションを指定する。

```
datalab beta create-gpu --machine-type n1-standard-8 --accelerator-type nvidia-tesla-p100 --accelerator-count 1 YOUR_INSTANCE_NAME
```

この例は、

- `--machine-type`として`n1-standard-8`（vCPUが8個）
- `--accelerator-type`（GPU種別）はP100
- `--accelerator-count`（GPU個数）は1個

という意味になる。`YOUR_INSTANCE_NAME`部分にはDatalabのインスタンス名を指定する。

このコマンドを実行すると、

```
$ datalab beta create-gpu --machine-type n1-standard-8 --accelerator-type nvidia-tesla-p100 --accelerator-count 2 YOUR_INSTANCE_NAME

By accepting below, you will download and install the following third-party software onto your managed GCE instances: NVidia GPU CUDA Toolkit Drivers: cuda-repo-ubuntu1604_8.0.61-1_amd64.deb
Do you accept? (y/[n]): y
```

というプロンプトが表示されるので`y`と入力。これにより、GPUドライバ付きのDatalabインスタンスの作成が開始する。

```
Due to GPU Driver installation, please note that Datalab GPU instances take significantly longer to startup compared to non-GPU instances.
Created [https://www.googleapis.com/compute/beta/projects/xxx/zones/asia-east1-a/instances/xxx].
Connecting to xxx.
This will create an SSH tunnel and may prompt you to create an rsa key pair. To manage these keys, see https://cloud.google.com/compute/docs/instances/adding-removing-ssh-keys
Waiting for Datalab to be reachable at http://localhost:8081/
```

このメッセージに書いてあるように、普通のDatalabインスタンスに比べて、GPU版は作成にすっごく長い時間がかかる。15分くらい。なので、この状態のまま放置しておこう。

しばらくすると、以下のメッセージが表示され、ブラウザ上にはDatalab画面が現れるはずだ。

```
The connection to Datalab is now open and will remain until this command is killed.
You can connect to Datalab at http://localhost:8081/
```

## GPU動作の確認

では、GPUがきちんと動作しているのかDatalab上で確認しよう。Datalab画面で`notebooks`フォルダを開き、`Notebook`をクリックして新規Notebookを作成する。

つづいて、TensorFlowドキュメントの[Using GPUs](https://www.tensorflow.org/tutorials/using_gpu)を参考に、以下のコードを実行してみる。

<img width="751" alt="Screen Shot 2017-12-31 at 12.04.35 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/38290/940c1920-0475-d65c-2e60-6c72c32df7ec.png">

こんなふうにエラーが発生せずに動作を確認できれば、GPUは正常に動作している。

これでTensorFlowをGPUで回す準備は整った。[TFGAN](https://qiita.com/kazunori279/items/e29f7f4215234ed38793)でガンガン遊んでみよう。

## 追記（1/1）

TFGANでガンガン遊ぼうと思ったら、2018年1月1日現在のDatalabではTensorFlow 1.4でGPUが動かない様子 :( デフォルトで入っているTF 1.2なら問題なく動く。
https://github.com/googledatalab/datalab/issues/1879

-----
Disclaimer この記事は個人的なものです｡ここで述べられていることは私の個人的な意見に基づくものであり､私の雇用者には関係はありません｡