CPU/GPU/AWSでのTensorflow実行速度比較

この記事は
===

* Tensorflowを使って大量の画像データの学習をしています
* 収束までとにかく時間がかかるので学習環境をアップグレードしてきました
* 各環境でTensorflowの処理速度がどの位出たのかがベンチマーク的な意味合いを持ちそうなので公開しておきます
  * OS含めて諸々環境のバージョン類が異なるのであくまで参考としてみていただければ

実行処理内容
===

* Tensorflow上でCNNの最高峰、[Inception-v3](https://github.com/tensorflow/models/tree/master/research/inception)を使ってオリジナルの画像でトレーニングします
  * 枚数は数十万オーダ（性能には影響しないはず）
  * 1000カテゴリへの分類器
* 実行コマンドは下記

```
$ bazel-bin/inception/imagenet_train --num_gpus=[gpu数] --batch_size=32 --train_dir=/share/train/ --data_dir=/share/tfrecord/ --max_steps=1000000
```

その１：ローカルMacのCPUで学習
===

環境
---

* 普通のiMacのCPUで実行
* Intel(R) Core(TM) i5-5575R CPU @ 2.80GHz
  * 4コア
  * GPUはIntel製なのでディープラーニング用途には使えません
* 価格：普通に使ってるPCなのである意味無料

実行結果
---

* 1バッチあたり30秒前後

```
2016-09-26 17:56:45.949423: step 30, loss = 13.59 (1.1 examples/sec; 29.730 sec/batch)
2016-09-26 18:01:42.534258: step 40, loss = 13.25 (1.1 examples/sec; 29.905 sec/batch)
2016-09-26 18:06:38.385538: step 50, loss = 12.30 (1.1 examples/sec; 29.519 sec/batch)
2016-09-26 18:11:30.349846: step 60, loss = 12.23 (1.1 examples/sec; 29.360 sec/batch)
2016-09-26 18:16:23.778464: step 70, loss = 12.23 (1.1 examples/sec; 29.447 sec/batch)
```

その２：AWSのg2.2xlarge
===

環境
---

* AWSのちょっと古めのGPU特化インスタンス
  * 公式情報によると```1,536 CUDA コアと 4GB のビデオメモリを搭載した高パフォーマンスの NVIDIA GPU```とのこと
  * 実際にはTesla GRID K520が入っている
* 価格：$0.65/hour => 月55000円くらい

実行結果
---

* 1バッチあたり3秒程度
* CPUの約10倍

```
2016-09-28 05:42:09.139757: step 30, loss = 14.32 (10.9 examples/sec; 2.940 sec/batch)
2016-09-28 05:42:38.594894: step 40, loss = 13.47 (10.9 examples/sec; 2.938 sec/batch)
2016-09-28 05:43:08.045541: step 50, loss = 13.50 (10.8 examples/sec; 2.953 sec/batch)
2016-09-28 05:43:37.505273: step 60, loss = 12.33 (10.9 examples/sec; 2.948 sec/batch)
2016-09-28 05:44:07.017434: step 70, loss = 12.46 (10.9 examples/sec; 2.948 sec/batch)
```

その３：AWSのp2.xlarge
===

環境
---

* AWSの今年の秋に出たばかりのGPU特化インスタンス
  * 公式によると```それぞれ 2,496 個の並列処理コアと 12 GiB の GPU メモリが搭載された高性能な NVIDIA K80 GPU```とのこと
  * Tesla K80が入っている
* 価格：$0.9/hour => 月77000円くらい

実行結果
---

* 1バッチあたり1.5秒程度
* CPUの約20倍, g2インスタンスの2倍

```
2016-10-26 03:25:52.783221: step 960, loss = 12.68 (19.9 examples/sec; 1.612 sec/batch)
2016-10-26 03:26:08.821457: step 970, loss = 12.76 (20.0 examples/sec; 1.599 sec/batch)
2016-10-26 03:26:24.932045: step 980, loss = 12.82 (21.1 examples/sec; 1.518 sec/batch)
2016-10-26 03:26:41.364723: step 990, loss = 12.62 (19.8 examples/sec; 1.620 sec/batch)
```


その４：TITAN X(Pascal) のサーバ
===

環境
---

* ディープラーニング用に構築した物理サーバ
  * TITAN X (Pascal世代)
* 価格：サーバ代金 50万円位

実行結果
---

* 1バッチあたり0.7秒程度
* CPUの約40倍, g2インスタンスの4倍, p2インスタンスの2倍

```
2016-12-16 03:34:36.980520: step 60, loss = 13.75 (41.7 examples/sec; 0.767 sec/batch)
2016-12-16 03:34:44.441697: step 70, loss = 13.13 (42.3 examples/sec; 0.757 sec/batch)
2016-12-16 03:34:52.268679: step 80, loss = 13.02 (38.8 examples/sec; 0.824 sec/batch)
2016-12-16 03:34:59.539936: step 90, loss = 13.12 (48.0 examples/sec; 0.667 sec/batch)
2016-12-16 03:35:06.701569: step 100, loss = 12.96 (45.8 examples/sec; 0.698 sec/batch)
```

（2016/12/23追記)
---

* [こちら](http://qiita.com/shouta-dev/items/a12b0ca3838ebe6e176f)の記事で書いたのですが、TitanXレベルの爆速学習の場合、前処理のCPUがボトルネックになって計算性能を落としてしまうことがわかりました。
* 上記記事でボトルネックを解消した結果、TitanX * 1基でも下記の性能が出ましたので念のためここにも記載しておきます。
* これだとcpuの約60倍ですね。

```
2016-12-21 12:20:44.338667: step 20, loss = 14.27 (69.2 examples/sec; 0.462 sec/batch)
2016-12-21 12:20:48.906566: step 30, loss = 14.48 (69.4 examples/sec; 0.461 sec/batch)
2016-12-21 12:20:53.492054: step 40, loss = 13.77 (69.6 examples/sec; 0.459 sec/batch)
```

終わりに
===

* TITAN X(Pascal) 1枚分の性能がAWSだと月7～8万円
  * TITANは3～4か月位使うと元が取れる位の計算ですかね
* ちなみに今の画像量だと500000stepくらいトレーニングしないと収束しません
  * TITANだと4.5日くらいで終わりますが、CPUだと半年くらい掛かる計算になります
  * NVIDIAは人類の進歩に非常に貢献してますね！