Google CloudMLの分散処理におけるユニット数による処理速度の変化

#Google CloudML
最近GoogleがCloudMLという,TensorFlowの実行環境をbeta版で公開しました。
やはり目玉は分散処理による高速な計算と, パラメータチューニングだろうということで, ひとまず分散処理の方を試してみました。

あまり分散処理に関する試料がないので, 下のgithubを参考に簡単なモデルを作ってみました。
https://github.com/GoogleCloudPlatform/cloudml-samples/tree/master/mnist/distributed

#3種類の実行環境
CloudMLでは３つのscale tier（実行環境?）が用意されています。

|名前|ユニット数|説明|
|:-----|------------|---------------:|
| BASIC | 1 unit/hour |シングルワーカー|
| STANDARD_1 | 10 unit/hour |多くのワーカーと少しのパラメータサーバー| 
| PREMIUM_1 | 75 unit/hour |多くのワーカーと多くのパラメータサーバー| 

参考:
https://cloud.google.com/ml/pricing
https://cloud.google.com/ml/docs/concepts/training-overview#scale_tier

CloudMLの使用金額は, ユニット数と使用時間で決まるので, 下に行くほど高くなります。
ということで, それぞれの実行環境でどれくらい処理速度が変わるのかを確認しました。




##まずはローカルで実行
MacBook Pro (13-inch, Mid 2012)を使用して, ローカルで実行しました。
モデルは4層の全結合層で構成されたモデルを使用しました。

では実行結果です。

```
INFO:root:Train [master/0], step 100:loss:2.346, accuracy:0.133 (6.247 sec) 16.009 global_steps/s, 16.009 local_steps/s
INFO:root:Train [master/0], step 200:loss:2.125, accuracy:0.327 (15.281 sec) 11.069 global_steps/s, 11.069 local_steps/s
INFO:root:Train [master/0], step 300:loss:2.139, accuracy:0.243 (20.713 sec) 18.411 global_steps/s, 18.411 local_steps/s
INFO:root:Train [master/0], step 400:loss:1.965, accuracy:0.227 (26.001 sec) 18.910 global_steps/s, 18.910 local_steps/s
INFO:root:Train [master/0], step 500:loss:2.054, accuracy:0.230 (31.343 sec) 18.719 global_steps/s, 18.719 local_steps/s
INFO:root:Train [master/0], step 600:loss:1.987, accuracy:0.283 (36.647 sec) 18.853 global_steps/s, 18.853 local_steps/s
INFO:root:Train [master/0], step 700:loss:1.866, accuracy:0.280 (41.959 sec) 18.825 global_steps/s, 18.825 local_steps/s
INFO:root:Train [master/0], step 800:loss:1.998, accuracy:0.243 (47.250 sec) 18.903 global_steps/s, 18.903 local_steps/s
INFO:root:Train [master/0], step 900:loss:1.930, accuracy:0.277 (52.522 sec) 18.968 global_steps/s, 18.968 local_steps/s
INFO:root:Train [master/0], step 1000:loss:2.075, accuracy:0.253 (57.748 sec) 19.135 global_steps/s, 19.135 local_steps/s
```

一秒間にだいたい18~19 step 処理しているようです。
loss減って無くね？とか言わないでください。

##BASIC
続けて同じモデルをBASICコースでやってみました。

```
Train [master/0], step 100:loss:2.314, accuracy:0.183 (21.535 sec) 4.644 global_steps/s, 4.644 local_steps/s
Train [master/0], step 200:loss:2.129, accuracy:0.230 (42.658 sec) 4.734 global_steps/s, 4.734 local_steps/s
Train [master/0], step 300:loss:2.148, accuracy:0.210 (65.141 sec) 4.448 global_steps/s, 4.448 local_steps/s
Train [master/0], step 400:loss:1.952, accuracy:0.210 (86.501 sec) 4.682 global_steps/s, 4.682 local_steps/s
Train [master/0], step 500:loss:2.069, accuracy:0.233 (107.608 sec) 4.738 global_steps/s, 4.738 local_steps/s
Train [master/0], step 600:loss:1.990, accuracy:0.373 (130.281 sec) 4.410 global_steps/s, 4.410 local_steps/s
Train [master/0], step 700:loss:1.858, accuracy:0.287 (151.080 sec) 4.808 global_steps/s, 4.808 local_steps/s
Train [master/0], step 800:loss:2.006, accuracy:0.227 (172.056 sec) 4.767 global_steps/s, 4.767 local_steps/s
Train [master/0], step 900:loss:1.948, accuracy:0.287 (194.379 sec) 4.480 global_steps/s, 4.480 local_steps/s
Train [master/0], step 1000:loss:2.042, accuracy:0.250 (215.516 sec) 4.731 global_steps/s, 4.731 local_steps/s
```

おおよそ一秒間に 4~5 stepのようです。
弱い。自分のmacより全然遅いです。

##STANDARD_１

```
Train [worker/0], step 100:loss:2.439, accuracy:0.093 (5.613 sec) 17.814 global_steps/s, 3.919 local_steps/s
Train [worker/3], step 200:loss:2.319, accuracy:0.290 (3.093 sec) 64.662 global_steps/s, 3.556 local_steps/s
Train [worker/1], step 300:loss:2.049, accuracy:0.247 (13.217 sec) 22.698 global_steps/s, 4.010 local_steps/s
Train [worker/3], step 400:loss:2.050, accuracy:0.220 (11.707 sec) 23.218 global_steps/s, 4.992 local_steps/s
Train [worker/3], step 500:loss:2.069, accuracy:0.243 (16.138 sec) 22.570 global_steps/s, 4.740 local_steps/s
Train [master/0], step 700:loss:2.140, accuracy:0.247 (45.261 sec) 15.904 global_steps/s, 4.498 local_steps/s
Train [worker/2], step 800:loss:1.948, accuracy:0.267 (29.167 sec) 27.428 global_steps/s, 4.800 local_steps/s
Train [worker/3], step 900:loss:1.888, accuracy:0.267 (33.495 sec) 23.045 global_steps/s, 4.955 local_steps/s
Train [worker/0], step 1000:loss:1.967, accuracy:0.257 (46.673 sec) 21.919 global_steps/s, 4.335 local_steps/s
```
※余計なログは編集して消しています。

少しばらついてますが, おおよそ１秒あたり 22~23 step 処理しているようです。
macより少し早い程度ですね。

##PREMIUM_1

```
ERROR: gcloud crashed (BadStatusCodeError):
```
初期設定だと最大unit数がMAX25に縛られるようです。そのせいでunit数75のPREMIUM_1は実行できないようです。
https://cloud.google.com/ml/quotas#resource_quotas

ただ何故かAPIの割当画面いっても, unit数の設定欄が見当たらないんですよね・・・
どなたか解決策ご存知の方いたら教えてください。

##結論
正直STANDARD_1だと, ほとんどローカルと変わらない印象を受けました。
もちろん使用するモデルによって実行結果も変わると思うので, 今回の結果がすべてという訳ではないと思います。目安程度に読んで下さい。
どなたかPREMIUM_１で実行したことある方がいたら, 是非結果教えてください。
あとBASIC,STANDARD_1,PREMIUM_1以外にCUSTOMって謎のコースがあったので, 機会があったら使ってみたいと思います。
Google Cloud Platformは使用開始から60日間3万円の無料枠があるので, 是非皆さんCloudML使ってみてください。