TensorFlow 各環境でのCPU / GPUベンチマーク結果 (ラズパイ4追加)

**Raspberry Pi4 追加 7/7/2019**
**TensorFlow1.5 最適化済みバイナリ効果検証, Mac Pro追加 2/6/2018**
**GeForce GTX1080 Ti の検証 10/3/2017**
**MacBook Pro Core i7 の検証 10/1/2017**
**Amazon EC2 / Microsoft Azure 環境の検証 9/17/2017**
**TensorFlow 1.0/XLA での導入効果 仮検証 2/24/2017**
**CPU / GPU 性能やOSによる違い検証 1/19/2017**
**Windows環境下 (正式版 / docker / bash on Ubuntu) での違い検証 1/19/2017**

-----

TensorFlowのmnistでの CPU / GPU 計算速度について自分の実測値を載せておきます。5000回のトレーニングにかかった時間です。3回の計測値の平均を四捨五入してます。

## ラズベリーパイ4 ($35) vs. MacBook Pro ($2,500)

| Machine | CPU | Memory | GPU | Environment | TensorFlow version | time (sec) |
|:-------:|:---:|:------:|:---:|:-----------:|:------------------:|:---------:|
|Mac Book Pro|i5 2.4GHz 2Core|8GB 1600MHz DDR3|無し|Mac OSX|1.13.1|705|
|Mac Book Pro|i7 2.8GHz 4Core|16GB 1600MHz DDR3|無し|Mac OSX|1.13.1|326|
|Raspberry Pi4|A72 1.5GHz 4Core|2GB 2400MHz LPDDR4|無し|Raspbian|1.13.1|3,380|
|Raspberry Pi4 with cooling fan|A72 1.5GHz 4Core|2GB 2400MHz LPDDR4|無し|Raspbian|1.13.1|2,863|

* 性能 (1/326 vs 1/2,863) 対 価格 (2,500 vs 35)比 で考えるとラズパイは約8倍お得?

##TensorFlow1.5 最適化済みバイナリ
1.5以前の配布バイナリでは最適化が含まれていませんでしたが、1.5よりSSE4.1を使用し最適化つきでビルドされたバイナリが配布版となりました。（但しSSE4.2 AVX AVX2 FMAは含まれず）

これにより自前でビルドしなくても多少の高速化が望めることとなります。大抵の方はGPUを使っているでしょうが、CPUで手軽に利用するケースも増えて来たみたいです。特にMacユーザーはCPUメインとなるのでMacで検証しておきます。

| Machine | CPU | Memory | GPU | Environment | TensorFlow version | time (sec) |
|:-------:|:---:|:------:|:---:|:-----------:|:------------------:|:---------:|
|Mac Book Pro (Late 2013)|i5 2.4GHz 2Core|8GB 1600MHz DDR3|無し|Mac OSX|1.5.0配布版 (SSE4.1最適化)|849|
|Mac Book Pro (Mid 2014)|i7 2.8GHz 4Core|16GB 1600MHz DDR3|無し|Mac OSX|1.5.0配布版 (SSE4.1最適化)|392|
|Mac Pro (Late 2013)|XEON 3.5GHz 6Core|32GB 1866MHz DDR3|無し|Mac OSX|1.5.0配布版 (SSE4.1最適化)|342|
|Mac Pro (Late 2013)|XEON 3.5GHz 6Core|32GB 1866MHz DDR3|無し|Mac OSX|1.5.0自家版 (SSE4.1/4.2/AVX最適化)|288|

##Amazon EC2 / Microsoft Azure 環境の検証

| Machine | vCPU | vMemory | vGPU | Environment | TensorFlow version | time (sec) |
|:-------:|:---:|:------:|:---:|:-----------:|:------------------:|:---------:|
|EC2 g2.2xlarge|8Core|15GB|1 x K520?|Ubuntu 16|0.9.0|83.86|
|EC2 g2.2xlarge|8Core|15GB|1 x K520?|Ubuntu 16|1.0.0|81.93|
|EC2 g2.8xlarge|32Core|60GB|2 x K520?|Ubuntu 16|1.0.0|82.05|
|EC2 p2.xlarge|4Core|61GB|1 x K80?|Ubuntu 16|1.0.0|48.34|
|EC2 p2.8xlarge|32Core|488GB|8 x K80?|Ubuntu 16|1.0.0|57.91|
|Azure DS11_V2|2Core|14GB|無し|Ubuntu 16|1.1.0|958|

AzureではGPUインスタンスがメニューから利用できず、問い合わせが必要だったので残念ながら試していません。結果については2017年5-6月頃に試したものです。

試しているのがMNISTの単純なモデルなので、もっと複雑なモデルでないとメモリやGPU性能の向上による恩恵は見えないのかもしれません。また、それぞれのGPUの上位モデル（GPU複数搭載モデル）を試した結果ではそのままでは速度向上効果がありませんでした。

分散環境を使うか、うまくタスクの振り分けを行わないといけないようです。


##TensorFlow 1.0以降 での最適化効果 検証
**1.0ではXLAの導入により大幅な高速化が期待できます。この効果を検証してみました**

| Machine | CPU | Memory | GPU | Environment | TensorFlow version | time (sec) |
|:-------:|:---:|:------:|:---:|:-----------:|:------------------:|:---------:|
|Mac Book Pro|i5 2.4GHz 2Core|8GB 1600MHz DDR3|無し|Mac OSX|0.12.1|983|
|Mac Book Pro|i5 2.4GHz 2Core|8GB 1600MHz DDR3|無し|Mac OSX|1.0.0|946|
|Mac Book Pro|i5 2.4GHz 2Core|8GB 1600MHz DDR3|無し|Mac OSX|1.0.0 自環境最適化|652|
|Mac Book Pro|i7 2.8GHz 4Core|16GB 1600MHz DDR3|無し|Mac OSX|1.0.1|441|
|Mac Book Pro|i7 2.8GHz 4Core|16GB 1600MHz DDR3|無し|Mac OSX|1.3.0|419|
|Mac Book Pro|i7 2.8GHz 4Core|16GB 1600MHz DDR3|無し|Mac OSX|1.3.0 自環境最適化|267|
|Mac Book Pro|i7 2.8GHz 4Core|16GB 1600MHz DDR3|無し|Mac OSX|1.13.1|326|
|Lenovo P910|Xeon Dual 2.1GHz 8Core|16GB 2400MHz|無し|Ubuntu|0.11.0|261|
|Lenovo P910|Xeon Dual 2.1GHz 8Core|16GB 2400MHz|無し|Ubuntu|1.0.0|423|
|Lenovo P910|Xeon Dual 2.1GHz 8Core|16GB 2400MHz|無し|Ubuntu|1.0.0 自環境最適化|281|
|Lenovo P910|Xeon Dual 2.1GHz 8Core|16GB 2400MHz|M6000|Ubuntu|0.11.0|28.7|
|Lenovo P910|Xeon Dual 2.1GHz 8Core|16GB 2400MHz|M6000|Ubuntu|1.0.0|28.3|
|Lenovo P910|Xeon Dual 2.1GHz 8Core|16GB 2400MHz|M6000|Ubuntu|1.0.0 自環境最適化|31.5|

ここで 自環境最適化とついているものは、TensorFlowのバイナリビルド時に `-march=native` として、SSEなどハードで使用できる高速化オプションを自分のマシン用に最適化してコンパイルしたものです。それ以外では普通にpipでインストールしたものを使っています。

* **MacBook Pro CPU版では各種高速化のオプションをつけてビルドすることでi5で946ms->652ms、i7で419ms->261ms と大幅(30%以上)に速度が上がりました。**
* Ubuntu CPU版では 1.0.0では逆に大幅に遅くなってしまいました。
* ただし Ubuntu CPU版でも最適化してコンパイルし直せばやはり同様に30%以上の高速化にはなります。ただし前バージョンと比べってやっと同程度ですが。
* Ubuntu GPU版(1.0.0)では今度は自前でコンパイルした方が遅くなってしまいました。コミュニティの話では標準のGPU版では既に最適化オプションはついている状態らしいので、GPU版の場合は速度面では自前でコンパイルするメリットはあまりなさそうです。

##XLA検証 (TensorFlow 1.0.0)
* MBPでXLA (JITコンパイラ）を有効にしてビルドしても効果は変わらず。
* UbuntuでXLA (JITコンパイラ）を有効にしてビルドしようとしたらエラーでうまくコンパイルできず。

結論としては速度面ではまだあまり安定していない印象がありますが、CPU利用の場合は大幅に速度が上がる可能性は高いです。公式のサイトにコンパイルの仕方は書いてありますしそれほど難しくはないので是非挑戦してみて下さい。
 
##GPU 有り / 無し

| Machine | CPU | Memory | GPU | Environment | TensorFlow version | time (sec) |
|:-------:|:---:|:------:|:---:|:-----------:|:------------------:|:---------:|
|自作 ASUS P6T|i7 2.67GHz 4(8)Core|10GB 1600MHz|無し|Ubuntu|0.9.0|639|
|自作 ASUS P6T|i7 2.67GHz 4(8)Core|10GB 1600MHz|Geforce 1060|Ubuntu|0.9.0|34|
|自作 ASUS P6T|i7 2.67GHz 4(8)Core|10GB 1600MHz|Geforce 1080 Ti|Ubuntu|1.3.0|22|
|自作 ASUS P6T|i7 2.67GHz 4(8)Core|10GB 1600MHz|無し|Windows|0.12.1|937|
|自作 ASUS P6T|i7 2.67GHz 4(8)Core|10GB 1600MHz|Geforce 1060|Windows|0.12.1|35|
|Lenovo P910|Xeon Dual 2.1GHz 8Core|16GB 2400MHz|無し|Ubuntu|0.11.0|261|
|Lenovo P910|Xeon Dual 2.1GHz 8Core|16GB 2400MHz|M6000|Ubuntu|0.11.0|28|

* GPUにより 8倍 - 20倍くらいの差が出る
* デスクトップ最高峰性能のマシンならギリギリ実用できる速度は出るかも
* それでも3万円程度のGPUにさえ全ったく敵わない (Xeon Dualの8倍高速)


##各種 CPU/RAM 性能の影響、Mac OSX/Ubuntu/Winの違い

| Machine | CPU | Memory | GPU | Environment | TensorFlow version | time (sec) |
|:-------:|:---:|:------:|:---:|:-----------:|:------------------:|:---------:|
|Mac Book Pro|i5 2.4GHz 2Core|8GB 1600MHz DDR3|無し|Mac OSX|0.8.0|1148|
|Mac Book Pro|i5 2.4GHz 2Core|8GB 1600MHz DDR3|無し|Mac OSX|0.9.0|999|
|Mac Book Pro|i5 2.4GHz 2Core|8GB 1600MHz DDR3|無し|Mac OSX|0.12.1|983|
|Mac Book Pro|i7 2.8GHz 4Core|16GB 1600MHz DDR3|無し|Mac OSX|1.0.1|441|
|Mac Book Pro|i7 2.8GHz 4Core|16GB 1600MHz DDR3|無し|Mac OSX|1.14.0|353|
|Mac Pro|XEON 3.5GHz 6Core|32GB 1866MHz DDR3|無し|Mac OSX|1.5.0|342|
|自作 ASUS P6T|i7 2.67GHz 4(8)Core|2GB 1600MHz|無し|Ubuntu|0.8.0|828|
|自作 ASUS P6T|i7 2.67GHz 4(8)Core|2GB 1600MHz|無し|Ubuntu|0.9.0|639|
|自作 ASUS P6T|i7 2.67GHz 4(8)Core|8GB 1600MHz Single Channel|無し|Ubuntu|0.9.0|836|
|自作 ASUS P6T|i7 2.67GHz 4(8)Core|10GB 1600MHz|無し|Windows|0.12.1|937|

* CPUメインならCPU性能やメモリ速度は順当に影響が出る
* OSが違うことで利用している周辺ライブラリの差が出るせいか、思ったよりもOSや環境による速度差はある
* TensorFlow 0.8.0 -> 0.9.0 で1割ほど高速化したっぽい。バージョンが上がることで若干高速化することが多いので是非お試しあれ。

##Windows環境下の 0.12.0 / docker / bash on Ubuntu

| Machine | CPU | Memory | GPU | Environment | TensorFlow version | time (sec) |
|:-------:|:---:|:------:|:---:|:-----------:|:------------------:|:---------:|
|自作 ASUS P6T|i7 2.67GHz 4(8)Core|10GB 1600MHz|無し|Windows (docker) VirtualBox + Jupytor Notebook|0.8.0|2539|
|自作 ASUS P6T|i7 2.67GHz 4(8)Core|10GB 1600MHz|無し|Windows|0.12.1|937|
|ASUS K73SM (Laptop)|Core i7 2670QM (Mobile) 4(8)Core 2.2GHz|8GB 800MHz|無し|Windows (Bash on Ubuntu)|0.11.0|1437|

* Windows Docker環境はかなり遅い。本気でやるならせめて Bash on Ubuntu on Windowsで
* と、思っていたけど0.12.0でWindowsに対応しました。速度的にもかなりメリットがあるのでこれを使いましょう


-----
また上記の表には出していませんが、ある程度複雑なモデルを動かそうとした場合に3GBのGPUではメモリ不足で止まってしまうケースが幾つかありました。3GBのうち1GBをビデオに取られてしまうので実質2GBです。DLで使う予定の場合は6GB以上のモデルを考えた方が良いと思います。