AWS-GPUとスパコンを比較する方法(P3インスタンス編)-スパコン用ベンチマークソフトを動かす

前に、[AWS-GPUとスパコンを比較する方法(P2インスタンス編)-スパコン用ベンチマークソフトを動かしてみる](https://qiita.com/shibacow/items/ab6ed97dd94578cd1d0e)と言うなんともアホっぽい記事を書いた。

上の記事では、GPUがスパコンがどのくらい違うのか比較する意味で、スパコンのベンチマークで使われるLinpackをGPU搭載のマシンで動かしてみてどのくらいの性能が出るか評価した。
上の記事では、EC2のp2インスタンスで比較をしたが、最近EC2に登場したp3インスタンスでLINPACKを動かして評価してみようとという意味だ。スパコンは、メモリもストレージもネットワーク性能も段違いに高性能なので、真に受けないように。

先の記事と同じように、LINPACKベンチマークをaws p2インスタンス(CUDA)で動かしてみる。

ベンチマークの内容を詳しく分かっているわけではないので、間違っているかも知れない。
多くの仕組みは、前回の記事[AWS-GPUとスパコンを比較する方法](http://qiita.com/shibacow/items/aa83cfc81ed493a4c25d)を参考にしている。

# AWS p3.2xlargeでLINPACK ベンチマークを動かす。

という訳で、AWSで最もCPUが早そうなマシンを使って、スパコンと性能の比較をしてみる。

今回使用したマシンはこちら

p3.2xlarge

|モデル|vCPU|メモリ|GPU|
|:--:|:--:|:--:|:--:|
|p3.xlarge|8core|16GB|1(NVIDIA Tesla v100)|

NVidia Tesla v100はNVidiaの最新のGPUでその倍精度浮動小数点の演算能力は 7TelaFlopsあるそうだ。[^2]

[^2]: https://en.wikipedia.org/wiki/Nvidia_Tesla

# LINPACKベンチマーク環境の構築

CUDA実行環境の構築は結構大変だ。

大変なので、linpack実行用のdocker imageを用意してそれを導入すれば動くようにした。。
dockerから透過的にnvidaのGPUを操作する必要があるので、nvidia-dockerを利用する。

nvida-docker環境の作り方は、[こちらの記事](http://blog.amedama.jp/entry/2017/04/03/235901)を参考のこと。

作成したlinpack docker imageは[こちら](https://cloud.docker.com/swarm/shibacow/repository/docker/shibacow/linpack_base/general
)になる。

以下のようにすれば手に入る(CUDA環境での実行を想定している)。

```
sudo nvidia-docker pull shibacow/linpack_base
```
で実行環境が手に入る。`nvidia9.0-cnn7-devel`をbaseにしている。

# LINPACKのベンチマークを実行する。

次のようにして、Linpackを実行する。

```
root@*********:~/prog/hpl-2.0_FERMI_v15/bin/CUDA# mpirun -np 1  --allow-run-as-root -host localhost ./run_linpack
```

使った[HPL.dat](https://gist.github.com/shibacow/860f89f2b0f3cc5b30e64a97bc1d79e0)

[実行結果](https://gist.github.com/shibacow/860f89f2b0f3cc5b30e64a97bc1d79e0#file-linpack_result)

チャンピオンデータだけ表示すると

```
================================================================================
T/V                N    NB     P     Q               Time                 Gflops
--------------------------------------------------------------------------------
WR10L2L2       65536  1024     1     1             143.62              1.307e+03
--------------------------------------------------------------------------------
||Ax-b||_oo/(eps*(||A||_oo*||x||_oo+||b||_oo)*N)=        0.0044281 ...... PASSED
================================================================================
```

のようになり、倍精度の浮動小数点で、1307GFlops = 1.307TFlopsを達成した。前のp2.xlarge (Tesla k80)の時の成果が、800GFlopsだったので、大体1.4倍くらいにはなった。

ただ、Nvidia V100の理論性能では、7TFlops位出るので、それに比べればLinpack実行性能は、理論性能の18%程度に留まっている。
パラメータの与え方や、プログラムに問題があったのかも知れない。

このスレッドでNvidiaの人が書いているが、そもそも、Linpackで最新のGPUに対してチューニングしたものは非公開で、現在公開しているCUDA向けのLinpackは最適化されていないそうだ。

https://devtalk.nvidia.com/default/topic/991058/poor-results-from-cuda-linpack-on-k80/


>Yes, the best HPL performance will come from HPL code specifically provided on a case-by-case basis by NVIDIA. It is not publicly available, and the hpl-2.0_FERMI_v15 will not achieve highest performance on GPUs newer than FERMI.


# お手軽に爆速マシンに触る

現在のスパコンの性能が10PFlopsを超えるので、それらには当然太刀打ちできないが、[1997年(20年前)のTOP500](https://www.top500.org/lists/1997/11/)の一位のスパコンASCI(1.338TFlops/Rmax)には肩を並べるほどの性能がV100にはある(本当はもっと高い性能があるけど)。

そして、この実験は、aws オレゴンリージョンで行い、spot-instanceのp3.2xlargeを使い、かかった金額は、4時間で、3ドル程度だった。

このような最新のマシンを使って性能を評価することは昔だったら数百万はかかっただろうが本当に良い時代になったものである。

# (追記) NBodyでflopsを計測する。

LinpackではGPUのハードウェアの実効性能が出せなかった(２割程度)ので、違うプログラムをGPUの実効性能が出せないか調べてみた。

NBodyはCUDAのサンプルに入っている。場所は
```
/usr/local/cuda-9.0/samples/5_Simulations/nbody
```
になる(うろ覚え)。

倍精度と単精度でFLopsを調べられるので、調査してみた。
[実行結果](https://gist.github.com/shibacow/860f89f2b0f3cc5b30e64a97bc1d79e0#file-nbody)

抜粋すると、

### 単精度

```
ubuntu@***********:/usr/local/cuda-9.0/samples/5_Simulations/nbody$ ./nbody -benchmark -numbodies=8192000 -device=0
= 573.157 billion interactions per second
= 11463.142 single-precision GFLOP/s at 20 flops per interaction
```

単精度で、**11463.142 single-precision GFLOP/s** が出た。

### 倍精度

```
ubuntu@*********:/usr/local/cuda-9.0/samples/5_Simulations/nbody$ ./nbody -fp64 -benchmark -numbodies=8192000 -device=0
= 186.633 billion interactions per second
= 5599.003 double-precision GFLOP/s at 30 flops per interaction
```

倍精度で、**5599.003 double-precision GFLOP/s** が出た。

Nvidia Tesla V100(PCIe)のカタログスペックは、単精度 *14* TFlops 倍精度 *7* TFlopsとのことなので[^1]。

[^1]: https://www.nvidia.com/ja-jp/data-center/tesla-v100/

単精度、倍精度で実効性能80%を達成した(11.4/14,5.599/7)。

このくらいになると流石に**速い**って感じになる。

2007/06のTop500の中央値250位の性能は次のようなものだ。[^3]


|Rank | Site |System | Cores | Rmax (TFlop/s) | Rpeak (TFlop/s) | Power (kW) |
|:---:|:----:|:-----:|:-----:|:--------------:|:---------------:|:----------:|
|250 |Air Force Research Laboratory United States | Altix 4700 1.6 GHz HPE |1,024 |6.0|	6.6 | | 

[^3]: https://www.top500.org/list/2007/06/?page=3

Rmax(実効性能)が、6.0TFlops程度だ。大体2007年のスパコン250位位に性能を、それから10年後のGPUが持っていることになる。