学習時間評価 その2 [TensorFlowでDeep Learning 13]

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

#はじめに

[以前の記事](http://qiita.com/kumonkumon/items/57bd2a7eb0aa0b17fcd7)で、

- c4.2xlarge
- g2.2xlarge
- g2.8xlarge

の3つのインスタンスタイプで、cifar10の学習時間の評価を行った。

今回、AWSのEC2で[p2インスタンス](https://aws.amazon.com/ec2/instance-types/p2/)が利用可能になったので、また同じように学習時間の評価を。

# P2インスタンス？

| Name | GPUs | vCPUs | RAM (GiB) | Price/Hour |
|:----:|:----:|:-----:|:---------:|:----------:|	
| p2.xlarge | 1 | 4 | 61 | $0.900 |
| p2.8xlarge | 8 | 32 | 488 | $7.200 |
| p2.16xlarge | 16 | 64 | 732 | $14.400 |

GPUは、NVIDIA Tesla K80!!
個人で所有するには敷居が高いスペック。

# 評価環境

## インスタンスタイプ
いろいろ環境構築とか面倒なので、g2.2xlargeとp2.xlargeで。

## 学習対象

### LeNet-5-like convolutional MNIST model
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/models/image/mnist/convolutional.py

### Inception v3 model on Imagenet
https://github.com/tensorflow/models/blob/master/inception/inception/inception_train.py

こちらは、
[tensorflow/models/inception](https://github.com/tensorflow/models/tree/master/inception)にあるように、
> **NOTE** Before doing anything, we first need to build TensorFlow from source, and installed as a PIP package. Please follow the instructions at Installing From Source.

なので、ビルドが必要。
さらに、ImagenetのデータのダウンロードとTFRecord formatへの変換が必要で、それだけで丸一日かかる・・・

# 学習時間計測
## LeNet-5-like convolutional MNIST model
### <del>g2.2xlarge</del>
GRID K520がCompute Capability 3.0であることを失念していました。この結果はCPUになります。。

```
Step 0 (epoch 0.00), 10.6 ms
Minibatch loss: 8.334, learning rate: 0.010000
Minibatch error: 85.9%
Validation error: 84.6%
Step 100 (epoch 0.12), 119.7 ms
Minibatch loss: 3.250, learning rate: 0.010000
Minibatch error: 6.2%
Validation error: 7.6%
Step 200 (epoch 0.23), 117.6 ms
Minibatch loss: 3.377, learning rate: 0.010000
Minibatch error: 12.5%
Validation error: 4.2%
...
Step 8500 (epoch 9.89), 119.8 ms
Minibatch loss: 1.618, learning rate: 0.006302
Minibatch error: 0.0%
Validation error: 0.8%
Test error: 0.8%
```
### p2.xlarge
```
Step 0 (epoch 0.00), 44.4 ms
Minibatch loss: 8.334, learning rate: 0.010000
Minibatch error: 85.9%
Validation error: 84.6%
Step 100 (epoch 0.12), 11.8 ms
Minibatch loss: 3.259, learning rate: 0.010000
Minibatch error: 6.2%
Validation error: 7.4%
Step 200 (epoch 0.23), 10.9 ms
Minibatch loss: 3.362, learning rate: 0.010000
Minibatch error: 9.4%
Validation error: 4.4%
...
Step 8500 (epoch 9.89), 10.9 ms
Minibatch loss: 1.612, learning rate: 0.006302
Minibatch error: 1.6%
Validation error: 0.9%
Test error: 0.7%
```

### 評価
<del>いうまでもないが、p2.xlargeはg2.2xlargeの10倍速い。
g2インスタンスでリザーブドインスタンス買った人も多いだろうに。たぶん、粋なはからいでp2インスタンスに乗り換えるんでしょうけど。</del>

<del>こんなに差が出るなら、Inception v3 modelのほうは評価不要に思えるが、モデルやデータの質が全然異なるので、さらに差が広がると容易に想像できるので、やる。</del>

## Inception v3 model on Imagenet
### <del>g2.2xlarge</del>
GRID K520がCompute Capability 3.0であることを失念していました。この結果はCPUになります。。

```
2016-11-27 11:17:37.914060: step 0, loss = 13.05 (0.7 examples/sec; 45.648 sec/batch)
2016-11-27 11:22:09.663319: step 10, loss = 13.99 (1.5 examples/sec; 21.561 sec/batch)
2016-11-27 11:25:43.922104: step 20, loss = 14.60 (1.5 examples/sec; 21.275 sec/batch)
2016-11-27 11:29:19.665863: step 30, loss = 14.95 (1.5 examples/sec; 21.557 sec/batch)
2016-11-27 11:33:00.637729: step 40, loss = 14.24 (1.4 examples/sec; 22.077 sec/batch)
2016-11-27 11:36:42.248699: step 50, loss = 14.00 (1.5 examples/sec; 21.922 sec/batch)
2016-11-27 11:40:25.607910: step 60, loss = 13.31 (1.4 examples/sec; 22.319 sec/batch)
2016-11-27 11:44:07.525535: step 70, loss = 13.11 (1.5 examples/sec; 21.972 sec/batch)
2016-11-27 11:47:48.913615: step 80, loss = 13.21 (1.4 examples/sec; 22.079 sec/batch)
2016-11-27 11:51:29.875606: step 90, loss = 13.14 (1.5 examples/sec; 21.937 sec/batch)
2016-11-27 11:55:08.308093: step 100, loss = 13.13 (1.5 examples/sec; 21.951 sec/batch)
...
```

### p2.xlarge
```
2016-11-27 11:03:30.950642: step 0, loss = 13.07 (0.7 examples/sec; 43.646 sec/batch)
2016-11-27 11:04:17.764336: step 10, loss = 13.76 (21.6 examples/sec; 1.484 sec/batch)
2016-11-27 11:04:32.590020: step 20, loss = 14.28 (21.4 examples/sec; 1.497 sec/batch)
2016-11-27 11:04:47.657033: step 30, loss = 14.63 (21.2 examples/sec; 1.511 sec/batch)
2016-11-27 11:05:02.499948: step 40, loss = 14.06 (21.6 examples/sec; 1.480 sec/batch)
2016-11-27 11:05:17.538775: step 50, loss = 13.49 (21.3 examples/sec; 1.504 sec/batch)
2016-11-27 11:05:32.363192: step 60, loss = 13.07 (22.1 examples/sec; 1.449 sec/batch)
2016-11-27 11:05:47.280413: step 70, loss = 13.21 (21.7 examples/sec; 1.472 sec/batch)
2016-11-27 11:06:02.230082: step 80, loss = 13.34 (22.3 examples/sec; 1.434 sec/batch)
2016-11-27 11:06:17.052023: step 90, loss = 13.01 (21.5 examples/sec; 1.491 sec/batch)
2016-11-27 11:06:32.107453: step 100, loss = 13.12 (20.4 examples/sec; 1.567 sec/batch)
...
```

### 評価
<del>15倍程度の速度差。。
こんな重いjobを投げてすみませんでした、g2.2xlargeさん。
今後、g2インスタンスを使うことはないでしょう。</del>

GRID K520がCompute Capability 3.0であることでも、今後、g2インスタンスを使うことはないでしょう。

# あとがき
現時点では、p2だと、p2.xlargeしかスポットインスタンスが使えないので、しばらくはp2.xlargeでいこうかと。(p2.8xlarge, p2.16.xlargeもちょっと試してみようかなぁ)
Inception v3 model on Imagenetが学習できそうなので、数日以上回して、[Inception v3 pre-trained model](https://www.tensorflow.org/versions/master/tutorials/image_recognition/index.html)と比較してうまくいってそうだったら、Imagenetに頼らずに、手持ちのデータだけで学習してみようかと。でも、データ作るの大変そう・・。