学習時間評価 [TensorFlowでDeep Learning 11]

([目次はこちら](http://qiita.com/kumonkumon/items/6fd05963df92e9eec8c0))

#はじめに
これまで、MNISTというデータセットを使って、ロジスティック回帰から畳み込みニューラルネットワークまで拡張しつつ、性能評価をやってきたが、特には学習時間については触れてこなかった。

[前回の記事](http://qiita.com/kumonkumon/items/4c94e90e548696aba85c)で、

> 人手で決めるパラメータもわりとあるので、試行錯誤やるには処理速度が早いに越したことない

と書きつつ、私自身、学習時間の評価していなかったのでやってみる。

#評価環境
手元には古いMacBookProしかないので、[Amazon EC2](https://aws.amazon.com/ec2/)を使う。

評価対象は、以下。

| Type | GPUs | vCPU | Mem(GiB) |
|:----:|:----:|:----:|:--------:|
| c4.2xlarge | - | 8 | 15 |
| g2.2xlarge | 1 | 8 | 15 |
| g2.8xlarge | 4 | 32 | 60 |

評価用に実行するものは、
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/models/image/cifar10/cifar10_train.py
で、複数GPU用に、
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/models/image/cifar10/cifar10_multi_gpu_train.py
を。

#学習時間計測
##c4.2xlarge
```sh
2016-05-30 05:09:20.010463: step 200, loss = 4.32 (267.5 examples/sec; 0.478 sec/batch)
2016-05-30 05:09:25.299022: step 210, loss = 4.31 (270.9 examples/sec; 0.472 sec/batch)
2016-05-30 05:09:30.089110: step 220, loss = 4.30 (261.6 examples/sec; 0.489 sec/batch)
2016-05-30 05:09:34.912969: step 230, loss = 4.28 (263.1 examples/sec; 0.487 sec/batch)
2016-05-30 05:09:39.770633: step 240, loss = 4.26 (258.6 examples/sec; 0.495 sec/batch)
2016-05-30 05:09:44.644984: step 250, loss = 4.24 (264.3 examples/sec; 0.484 sec/batch)
2016-05-30 05:09:49.479784: step 260, loss = 4.23 (266.1 examples/sec; 0.481 sec/batch)
2016-05-30 05:09:54.287899: step 270, loss = 4.21 (265.0 examples/sec; 0.483 sec/batch)
2016-05-30 05:09:59.165484: step 280, loss = 4.20 (261.2 examples/sec; 0.490 sec/batch)
2016-05-30 05:10:04.025648: step 290, loss = 4.18 (263.1 examples/sec; 0.486 sec/batch)
```

##g2.2xlarge

```sh
2016-05-30 05:21:55.004440: step 200, loss = 4.33 (527.9 examples/sec; 0.242 sec/batch)
2016-05-30 05:21:57.512823: step 210, loss = 4.31 (535.3 examples/sec; 0.239 sec/batch)
2016-05-30 05:21:59.821739: step 220, loss = 4.30 (547.2 examples/sec; 0.234 sec/batch)
2016-05-30 05:22:02.215690: step 230, loss = 4.29 (595.0 examples/sec; 0.215 sec/batch)
2016-05-30 05:22:04.603561: step 240, loss = 4.27 (521.9 examples/sec; 0.245 sec/batch)
2016-05-30 05:22:06.887362: step 250, loss = 4.25 (541.2 examples/sec; 0.237 sec/batch)
2016-05-30 05:22:09.200980: step 260, loss = 4.24 (540.7 examples/sec; 0.237 sec/batch)
2016-05-30 05:22:11.491492: step 270, loss = 4.22 (556.0 examples/sec; 0.230 sec/batch)
2016-05-30 05:22:13.807076: step 280, loss = 4.21 (525.3 examples/sec; 0.244 sec/batch)
2016-05-30 05:22:16.096672: step 290, loss = 4.19 (586.2 examples/sec; 0.218 sec/batch)
```

##g2.8xlarge
```sh
2016-05-30 05:47:42.305082: step 200, loss = 4.32 (1328.2 examples/sec; 0.096 sec/batch)
2016-05-30 05:47:46.316455: step 210, loss = 4.31 (1331.8 examples/sec; 0.096 sec/batch)
2016-05-30 05:47:50.058900: step 220, loss = 4.29 (1388.5 examples/sec; 0.092 sec/batch)
2016-05-30 05:47:53.623737: step 230, loss = 4.27 (1416.1 examples/sec; 0.090 sec/batch)
2016-05-30 05:47:57.277992: step 240, loss = 4.26 (1589.8 examples/sec; 0.081 sec/batch)
2016-05-30 05:48:00.921081: step 250, loss = 4.24 (1449.4 examples/sec; 0.088 sec/batch)
2016-05-30 05:48:04.558838: step 260, loss = 4.23 (1424.1 examples/sec; 0.090 sec/batch)
2016-05-30 05:48:08.242038: step 270, loss = 4.21 (1231.7 examples/sec; 0.104 sec/batch)
2016-05-30 05:48:11.875426: step 280, loss = 4.20 (1525.9 examples/sec; 0.084 sec/batch)
2016-05-30 05:48:15.530232: step 290, loss = 4.18 (1509.4 examples/sec; 0.085 sec/batch)
2016-05-30 05:48:19.162920: step 300, loss = 4.17 (1609.2 examples/sec; 0.080 sec/batch)
```

#評価
MNISTのときは、g2.2xlargeだと、c4.2xlargeに比べて（正確に計測していないが）7倍くらいになってたけど、CIFAR10だと、2倍程度。なぜだろう。当然であるが、g2.8xlargeが最も早い。

https://github.com/tensorflow/tensorflow/blob/master/tensorflow/models/image/cifar10/cifar10_multi_gpu_train.py
に、

```
System        | Step Time (sec/batch)  |     Accuracy
--------------------------------------------------------------------
1 Tesla K20m  | 0.35-0.60              | ~86% at 60K steps  (5 hours)
1 Tesla K40m  | 0.25-0.35              | ~86% at 100K steps (4 hours)
2 Tesla K20m  | 0.13-0.20              | ~84% at 30K steps  (2.5 hours)
3 Tesla K20m  | 0.13-0.18              | ~84% at 30K steps
4 Tesla K20m  | ~0.10                  | ~84% at 30K steps
```
ってあるので、まぁ60K回せばいいかんじ。

（今回は途中で止めたけど）60K回したとすると、学習時間はこのくらいになるかと。

| Type | TrainingTime |
|:----:|:------------:|
| c4.2xlarge | 8 hours |
| g2.2xlarge | 4 hours |
| g2.8xlarge | 1.5 hours |

オンデマンド インスタンスだと、（スポット インスタンスだと75% offくらい）

| Type | Price |
|:----:|:------------:|
| c4.2xlarge | $0.419 / hour |
| g2.2xlarge | $0.65 / hour |
| g2.8xlarge | $2.6 / hour |

なので、コスパが最も高いのは、g2.2xlargeか。でも、待ち時間がもったいないので、ある程度検証できたら、g2.8xlargeを利用するのがよさそう。

東京リージョンだと、GPUインスタンスは、1.5倍くらいの値段なのか・・。

==
P2インスタンスが使えるようになったので、[TensorFlowでDeep Neural Networks (13) 学習時間評価 その2](http://qiita.com/kumonkumon/items/134ec9cd054d3c3339ca)を書きました。