AWS GPUインスタンスの性能検証（OpenPoseで実アプリベンチマーク）

# TL;DR

* AWSのGPUインスタンスの性能を知りたくなったので，[OpenPose](https://github.com/CMU-Perceptual-Computing-Lab/openpose)での姿勢検知で性能評価を行いました
* 他のg3インスタンスに比べてg3sインスタンスのコストパフォーマンスが約3割，良いことが明らかになりました
* openposeは並列効果の高いアプリケーションで，GPU数に比例した性能向上が得られました

# モチベーション

* AWS EC2のGPUインスタンスの性能と費用の関係を可視化します

# 実験概要

## 実験手順

* AWSのGPUを持つインスタンスタイプで，Openposeの姿勢検知処理を実行し，計算時間を計測しました
    * 処理は，[OpenPoseをコンテナ実行するDockerfile](https://qiita.com/myoshimi/items/cf64c91cd22c516bb49b)で実行しました

## 実験対象データ

* 1名の人間が，比較的ゆっくりした動作を行う様子を，定点から撮影した動画
* FHD(1920x1080), 30fps
* 103 MB
* 8分53秒(533秒)

## 計測GPUインスタンスタイプ

| インスタンスタイプ | vCPU数 | GPU数 | GPU Model | メモリ[GB] | 費用[USD/hour] |
|:---|---:|:---|---:|---:|---:|
| g3s.xlarge | 4 | 1 | Tesla M60 | 30.5 | 0.75 |
| g3.4xlarge | 16 | 1 | Tesla M60 |  122 | 1.14 |
| g3.8xlarge | 32 | 2 | Tesla M60 | 244 | 2.28 |
| g3.16xlarge | 64 | 4 | Tesla M60 | 488 | 4.56 |

* 費用は，米国東部（バージニア北部）リージョン，オンデマンド料金，Linuxイメージの場合(2019/04/08時点)です
    * [https://aws.amazon.com/jp/about-aws/whats-new/2018/10/introducing-a-new-size-for-amazon-ec2-g3-graphics-accelerated-instances/]
    * VMの稼働コスト以外にも，EBS（ストレージ）の費用，通信費用が掛かりますが，ここでは省略します

## 実行コマンド

* [OpenPoseをコンテナ実行するDockerfile](https://qiita.com/myoshimi/items/cf64c91cd22c516bb49b) に書かれた，動画解析コマンド
    * 顔検出，手検出，パーツ推定オプション込み

```bash
docker run --rm --runtime=nvidia \
    -v ${PWD}:/tmp/ openpose:latest \
    --face --hand --part_candidates \
    --display 0 \
    --model_folder /usr/local/openpose/models \
    --video       /tmp/input.avi \
    --write_json  /tmp/outputJSON \
    --write_video /tmp/output.avi
```

# 実行結果

## 計算時間

* 計測された計算時間を以下にまとめました．

| インスタンスタイプ | vCPU数 | GPU数 | GPU Model | メモリ[GB] | 費用[USD/hour] | 計算時間[sec] |
|:---|---:|:---|---:|---:|---:|---:|
| g3s.xlarge | 4 | 1 | M60 | 30.5 | 0.75 | **5776.87** |
| g3.4xlarge | 16 | 1 | M60 |  122 | 1.14 | **5769.03** |
| g3.8xlarge | 32 | 2 | M60 | 244 | 2.28 | **2924.84** |
| g3.16xlarge | 64 | 4 | M60 | 488 | 4.56 | **1520.76** |

* 上記表の計算時間をグラフ化すると，下図になります．
    * ![comptime.png](https://qiita-image-store.s3.amazonaws.com/0/309617/e8903590-9186-b544-e9ec-2516599bcceb.png)

## パフォーマンス比

* g3sを1.0としたときの計算性能のグラフを以下に示します
    * 同じ問題を解くのに要した時間の逆数を取り，g3sを1.0として正規化したグラフです
    * ![compRatio.png](https://qiita-image-store.s3.amazonaws.com/0/309617/9345859f-9776-0ee6-1da1-e22ca6940e7f.png)

## 費用比

* g3sの費用(0.75USD/hour)と比較して，投入コストあたりで得られるパフォーマンスを示すグラフを以下に示します
    * パフォーマンス比と料金表をもとに，1ドルあたりで得られる性能をもとめ，g3sの性能を1として正規化しました．
    * ![compCost.png](https://qiita-image-store.s3.amazonaws.com/0/309617/cddf1bbb-ef8d-a454-56c2-7fb450cdddbb.png)

# 考察

## 結果のまとめ

OpenPoseでの重たい計算をするときのコストと性能についてまとめます．

| インスタンスタイプ | vCPU数 | GPU数 | 費用[USD/hour] | 計算時間[sec] | 性能比率 | 費用比率 |
|:---|---:|:---|---:|---:|---:|---:|---:|---:|
| g3s.xlarge | 4 | 1 | 0.75 | 5776.87 | 1.0 | 1.0 |
| g3.4xlarge | 16 | 1 | 1.14 | 5769.03 | 1.001 | 0.659 |
| g3.8xlarge | 32 | 2 | 2.28 | 2924.84 | 1.975 | 0.650 |
| g3.16xlarge | 64 | 4 | 4.56 | 1520.76 | 3.798 | 0.625 |

## g3sのコスパが良い

* 費用比では，g3sの性能がコストがもっとも良いことが示されました
    * g3.4xlargeが活かせる場面は，メモリを多く使用するアプリケーションであり，OpenposeのようなGPU演算がメインの場合は，使用するメリットがほとんどないと言えます
* 計算性能はGPU数に応じて向上することが示されました
    * 4つのGPUを使用するg3.16xlargeでは，1つのGPUでの実行に比べて約3.8倍と，Openposeは比較的良い並列化効果が得られるアプリケーションであると言えます

# その他

* Openposeのベンチマークは，[OpenPose - Maximizing the OpenPose Speed](https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/doc/speed_up_openpose.md)にも説明があります
* GPUとしてKepler K80を持つP2インスタンスもあるので，こちらの評価も取りたいです．

# 参考

* [OpenPose本家](https://github.com/CMU-Perceptual-Computing-Lab/openpose)
* [OpenPoseで姿勢解析環境のセットアップ Ubuntu18.04LTS](https://qiita.com/myoshimi/items/cf64c91cd22c516bb49b)
* [OpenPoseをコンテナ実行するDockerfile](https://qiita.com/myoshimi/items/cf64c91cd22c516bb49b)
* [OpenPose - Maximizing the OpenPose Speed](https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/doc/speed_up_openpose.md)