DeepLearningを回すもっとも効率的なAWSインスタンスは？

# 目的
GPU、CPU、FPGAとDeepLearningを回すオプションは複数AWS上にあるが、最適なインスタンスはどれかな？
ここで最適・効率的というのは安い単位時間コスト（例えばAWS一時間のコスト）で多くの演算を達成できるインスタンスを考える。特に\$1で得られる演算量（ここでは1TOPS,つまり10^12演算動作）を求める。
Warehouse Scale Computingを考える場合、コンピュータアーキテクトはコスト効果を考えなければいけないというのは興味深い。


# 出展
**Computer Architecture: A Quantitative Approach (6th edition)**の7章、**ケーススタディ7.8**に興味深い問題があったのでそれを元に考察する。めっちゃ良書なのでみんな買おう！**重いので筋肉も付きます。**
![51N2Qq7HjtL.jpg](https://qiita-image-store.s3.amazonaws.com/0/171915/6820fcc2-8b1b-b2eb-a3f9-159ab6d7a80e.jpeg)

https://www.amazon.co.jp/dp/B078MFDTX4/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1
**Kindle版は買うなよ！図がぐちゃぐちゃだぞ！**


(ケーススタディはGoogleのCliff Youngによって執筆され、何故GoogleがASICであるTPU開発に踏み切ることになったか暗示されていて興味深い。)

>以下CaseStudy文。
AWS offers a wide variety of instances, which are machines configured to target different applications. AWS prices tell up useful data about the Total Cost of Ownership(TCO) of various computing devices, particularly as a computer equipment is often depreciated on a 3-year schedule. AS of July 2017, a dedicated, compute-oriented "c4 computing instance" includes two x86 chips with 20 physiscal cores in total. It rents on-demand for \$1.75/hour, or \$17,962 for 3 years. 
In contrast, a dedicated "p2" instance also has two x86 chips but with 36 cores in total and adds 16 NVIDIA K80 GPUs. A p2 rents on-demand for \$15.84/hour, or \$184,780 for 3 years. The peak throughput for K80 is 3 TFLOPS. 
AWS also offers "f1" instances that include 8 XILINX Ultrascale +VU9P FPGAs. They rent at \$13.20/hour, or \$165,758 for 3 years. Each includes 6840 DSP slices.

## アメリカ語を要約すると

AWSにはCPUを使うC4インスタンス、GPUを使うP2インスタンス、そしてFPGAを使うF1インスタンスがある。
例えばDNNのような演算が支配的なタスクを行うアプリケーションを立ち上げる場合、どのインスタンスを使うのがもっとも効率的か？

## 結果
上記3つのインスタンスの性能やコストをまとめると下記になる。
インスタンスのコスト、CPUとGPU演算量は2017 7月調べで上記本に載っているものです。
またFPGA演算量は本記事執筆者の導出なので注意。

|インスタンス |コンピューティングユニット |単位時間コスト（1時間あたり） | 演算量 (TOPSまたはTFLOPS) |\$1で得られるTOPS|
|----|----|---|---|---|
|C4 |CPU(E5-2660)x2|\$1.75|2(1x2)|1.14|
|P2 |GPU(K80)x16|\$15.84|48(3x16)|3.03|
|F1 |FPGA(USVU9P)x8|\$13.20|54 (導出は下記)|4.09|

**結果だけ**みると**FPGAが最高**じゃん。。となる。

## 導出
ここでは浮動小数点演算（FLOPS)も固定小数点演算（OPS）も同一として扱っている。そのためGPU、CPUに不利にFPGAに有利となっている。

・**CPU**はチップあたりのPeak FLOPSが1TFLOPSのため、それを2つ用いるC4インスタンスのピークTFLOPSは**2TFLOPS**となる。
・**GPU**はK80のPeak FLOPSが3TFLOPSで16個用いるP2インスタンスは3*16=**48TFLOPS**となる。

・そして**FPGA**はUltraScale+VU9Pが6840個のDSPスライス（積和演算回路）を持ち、それが500MHzで動作する。
1MAC動作はhigh performance computingでは2OPSとしてカウントするため、FPGA一台あたりのPeak OPSは
500M*6840*2=6.84TOPSとなる。

F1インスタンスは8個のFPGAを持つため、Peak TOPSは
6.84*8=**54TOPS**となる。

**これを一時間あたりの利用料で割ると\$1あたりのTOPS（TFLOPS)が導出できる。**

##結局どれがいいの？
\$1あたりの演算量はFPGAが最も優れる。(GPU比で33%）
ただFPGAにてDNNを効率的に回すためにはソフトウェアスタック（CuDNN的なもの）を自前で用意しなければ性能はでない。
そのような**ソフトウェアスタックの開発コストを考えると、FPGAとGPUのコスト比はほぼない**のではないかと考えている。
ただ**CPUを使うよりはGPU，FPGAを用いたほうがよい。(3-4倍のメリット）**

Googleは上記のような考えのもと、GPU比で更に大きくコストを下げられるASIC開発に踏み切ったのではないかと妄想している。 (妄想です）
また結果は自分が計算したもので引用元の書に載っているものではありません。間違いなどあるかもしれないということで。

##備考
FPGAをデータセンターで使う取り組みにはMicrosoftのCatapultがある。Bing検索はFPGAで行われているとのこと。

>**A Cloud-Scale Acceleration Architecture**
A. Caufiled 
https://www.microsoft.com/en-us/research/wp-content/uploads/2016/10/Cloud-Scale-Acceleration-Architecture.pdf