技業LOG
本記事は2部構成の第2部です。
第1部: 『AWSの推論用EC2インスタンス Inf1について(part1)』
AIサービスを提供するにあたり、推論にかかる速度は非常に大事な要素です。本記事では、NTTPCの新規サービスである「AnyMotion」において使用している姿勢推定モデル(AnyMotionモデル)を用いて、inf1インスタンスを利用した場合の推論性能及びコストパフォーマンスを、GPUインスタンスやElastic inference を利用した場合と比較して検証を行いました。
1. 検証環境
検証環境の構成図
client
本検証では、クライアントサーバーとして、c5.18xlargeを採用しています。c5.18xlargeインスタンスは72コアのvCPU・144GiBのメモリ・固定25Gbpsのネットワークパフォーマンスを持つインスタンスです。servingを行うコンテナと同一のVPC内の public network にクライアントサーバーを配置し、grpcによる推論リクエストを行います。
serving
本検証では、ECSのコンテナによりservingを提供する構成を採用しています。VPC 内のprivate subnetに Inf1 コンテナインスタンスを1台構築し、Tensorflow serving により AnyMotionモデルの推論を提供するタスクを1つ配置します。このタスクには、ホストであるInf1インスタンスが持つInferentia チップに含まれる全てのNeuronコアを割り当てます。また、AnyMotionモデルのコンパイル環境は1本目の記事と同様です。
ECSによるInferentiaチップを用いた推論環境の構築手順はこちらから確認できます。
Note1. ECS構成におけるタスク定義
Inf1インスタンスでは与えられたモデルを複数のInferentiaチップ、Neuronコア上にロードし、並列にデータを処理することが可能です。
本検証ではインスタンスに搭載されている全てのNeuronコア上にモデルをロードするため、タスク定義の中で次の環境変数を設定しています。
"environment": [ { "name": "NEURONCORE_GROUP_SIZES", "value": "4x1" } ]
"NEURONCORE_GROUP_SIZES"はタスクに割り当てるNeuronコアの数であり、デフォルトで"4x1"が指定されています。複数のInferentiaチップを持つインスタンスではこの値を明示的に指定する必要があります。例えば、4枚のチップを持つinf1.6xlargeの場合には、"16x1"等の値を指定します。
また、複数のInferentiaチップを持つインスタンスにおいては、それぞれのチップへのパスを通す必要があります。Inferentiaチップを4枚使用する場合は、タスク定義の中に次の記述することでパスを通すことが可能です。
"devices": [ { "containerPath": "/dev/neuron0", "hostPath": "/dev/neuron0", "permissions": [ "read", "write" ] },{ "containerPath": "/dev/neuron1", "hostPath": "/dev/neuron1", "permissions": [ "read", "write" ] },{ "containerPath": "/dev/neuron2", "hostPath": "/dev/neuron2", "permissions": [ "read", "write" ] },{ "containerPath": "/dev/neuron3", "hostPath": "/dev/neuron3", "permissions": [ "read", "write" ] } ]
2. 検証項目(スループットとレイテンシ)
本検証ではスループットとレイテンシの2項目についての検証を行います。
スループット
スループットの測定では、1秒間で推論を行うことができる画像枚数 [images/sec] を算出します。計200回の推論リクエストを16コアに分散して送信し、推論した画像の枚数と推論に要した時間からスループットを測定します。
上記の測定を計10回行い、平均のスループットを算出します。
レイテンシ
レイテンシの測定では、1リクエストの処理にかかった時間 [msec] を計測します。計1000回の測定を行い、50パーセンタイル(p50)、90パーセンタイル(p90)の値を算出します。
3. inf1インスタンスの性能検証
まずはinf1.2xlargeに焦点を当て、インスタンスの性能を検証してみましょう。第一部で触れましたが、inf1インスタンスで動作する推論モデルにはコンパイルバッチサイズ という概念があります。この値をそれぞれ1,2,4,8に設定した4種類のNeuronモデルを作成し、推論バッチサイズ をパラメータとした検証を行いました。
なお推論バッチサイズ はコンパイルバッチサイズ以上の値を指定する必要があるため、これを満たす条件のみ検証を行いました。
スループットは、いずれのモデルにおいても推論バッチサイズとコンパイルバッチサイズが同じ場合に最大値に近い値を取ります。モデル間で比較すると、コンパイルバッチサイズに比例して大きくなっており、8の場合に最大値を取りました。ただしバッチサイズ を4とした推論を行なっている時点でNeuronコアの使用率が100%に近い値を取っているため、線形に上がり続けるわけではないことに注意が必要です。
またレイテンシについては、いずれのモデルにおいても推論バッチサイズに応じて増加しています。
以上の結果から、inf1.2xlargeを用いてAnyMotionモデルの推論を行う際には、コンパイルバッチサイズ・推論バッチサイズ を共に8に設定した場合に、いたずらにレイテンシをあげることなくスループットを最大にすることができることがわかります。
4. GPU・EIA・CPUとの比較検証
以上の結果を踏まえ、他タイプリソースとの比較を行います。比較対象は、Inf1インスタンス2種 (inf1.xlarge / inf1.2xlarge) 、GPUインスタンス2種(g4dn.xlarge / p3.2xlarge)、Elastic Inference 3種(eia1.medium / eia1.large / eia1.xlarge)、CPUインスタンス1種(c5.2xlarge) を用意しました。
G4dnインスタンス、P3インスタンスはそれぞれNVIDIA T4 GPU 、NVIDIA V100 Tensor Core GPU を搭載した機械学習に適したインスタンスであり、Elastic Inference はEC2またはECSのタスクに対してアタッチされる、ディープラーニングの推論に適したGPUアクセラレータです。
各リソースの詳細は次のとおりです。
インスタンス仕様
リソース種別 | タイプ | GPUコア | vCPU | メモリ [GiB] |
GPUメモリ [GiB] |
Inferential チップ |
NW帯域幅 [Gbps] |
時間単価 [USD]※ |
---|---|---|---|---|---|---|---|---|
Inf1 | Inf1.xlarge | - | 4 | 8 | - | 1 | 最大25 | 0.308 |
Inf1.2xlarge | - | 8 | 16 | - | 1 | 最大25 | 0.489 | |
GPU | g4dn.xlarge | 1 | 4 | 16 | 16 | - | 最大25 | 0.71 |
p3.2xlarge | 1 | 8 | 61 | 16 | - | 最大10 | 4.194 | |
Elastic | eia1.medium | - | - | 1 | - | - | - | 0.220 |
Inference | eia1.large | - | - | 2 | - | - | - | 0.450 |
eia1.xlarge | - | - | 4 | - | - | - | 0.890 | |
CPU | c5.2xlarge | - | 8 | 16 | - | - | 最大10 | 0.428 |
- ※2021/7/1時点のアジアパシフィック(東京)リージョンにおける料金
実行環境
infインスタンス
リージョン | ap-north-east1 |
---|---|
AMI | amzn2-ami-ecs-inf-hvm-2.0.20210520-x86_64-ebs |
コンテナイメージ | 763104351884.dkr.ecr.ap-north-east-1.amazonaws.com/tensorflow-inference-neuron:1.15.5-neuron-py37-ubuntu18.04※ |
neuron-rtd バージョン | 1.5.0.0 |
GPUインスタンス
リージョン | ap-north-east1 |
---|---|
AMI | amzn2-ami-ecs-gpu-hvm-2.0.20210331-x86_64-ebs |
コンテナイメージ | 763104351884.dkr.ecr.ap-north-east-1.amazonaws.com/tensorflow-inference:1.15.5-gpu-py36-cu100-ubuntu18.04※ |
cuda バージョン | 10.0 |
cuDNN バージョン | 7.4.1 |
Elastic inference
リージョン | ap-north-east1 |
---|---|
AMI | amzn2-ami-ecs-hvm-2.0.20210301-x86_64-ebs |
コンテナイメージ | 763104351884.dkr.ecr.ap-north-east-1.amazonaws.com/tensorflow-inference-eia:1.15.0-cpu-py36-ubuntu18.04※ |
CPUインスタンス
リージョン | ap-north-east1 |
---|---|
AMI | amzn2-ami-ecs-hvm-2.0.20210301-x86_64-ebs |
コンテナイメージ | tensorflow/serving:1.15.0 |
client
リージョン | ap-north-east1 |
---|---|
AMI | Deep Learning AMI (Ubuntu 18.04) Version 44.0 |
pythonバージョン | Python 3.6.13 |
tensorflowバージョン | 1.15.5 |
- ※2021/7/1時点のAWS Deep Learning Containersに掲載されているコンテナイメージを使用
検証内容
上記の各リソースについて、前述のinf1の場合と同様にECSのコンテナによりservingを行う環境を構築し、推論バッチサイズ をそれぞれ 1, 2 , 4, 8, 16, 32 ,64 に設定してスループット及びレイテンシの測定を行いました。測定したスループットと時間単価から単位金額(0.0001USD)あたりの処理可能画像枚数をコストパフォーマンとして算出します。
なお、本検証においてElastic InferenceをアタッチするEC2インスタンスは m5.xlarge を採用していますが、EC2インスタンスにかかる金額は考慮していません。
コストパフォーマンスは、2つの軸について比較を行いました。
1つ目は"条件A"として、各インスタンスについて推論バッチサイズ を1に設定した場合の値を比較しています。この場合レイテンシが小さくなることが見込まれ、高いリアルタイム性が求められる環境を想定した条件となります。
2つ目は"条件B"として、設定した条件の中で各インスタンスのスループットが最も高かった場合の値を比較しています。こちらは大きなデータを効率よく処理する必要がある環境を想定した条件です。
検証結果
条件A におけるスループットは inf1.2xlarge が 516.80[images/sec] と最も高く、g4dn.xlarge と比較すると約501%、eia1.xlargeと比較すると約662%と大きく上回っています。
レイテンシのp50値は inf1.xlarge が 7.38 [ms]と最も小さく、g4dn.xlarge と比較すると約73%、eia1.xlargeと比較すると約47%に抑えられています。
コストパフォーマンスはinf1.xlargeが 604.05 [images/0.0001USD] と最も高く、g4dn.xlargeと比較すると約1049%、eia1.xlargeと比較すると1738%という結果となりました。
条件Bにおけるスループットについても inf1.2xlarge が 1147.46 [images/sec] と最も高く、g4dn.xlarge と比較すると約510%、eia1.xlargeと比較すると約381%と大きく上回っています。
推論バッチサイズ が異なるため単純な比較はできませんが、レイテンシについてもInf1の各種インスタンスは非常に小さい値となっています。
コストパフォーマンスはinf1.xlargeが 1182.71 [images/0.0001USD] であり最も高く、g4dn.xlargeと比較すると約1038%、eia1.xlargeと比較すると972%という結果となりました。
条件Bにおいて、p3.2xlarge及びg4dn.xlargeについては、推論バッチサイズが64の場合に最大値を取りました。このため、さらに推論バッチサイズ を大きくするとコストパフォーマンスがより高くなる可能性があります。ただしg4dnについては推論バッチサイズ 16から64までのスループット の上昇幅が非常に小さいため、大幅な上昇は見込めないと考えられます。
また、eia1.mediumについては推論バッチサイズ 16以上、eia1.xlargeについては推論バッチサイズ 64における推論の際に Accelerator out of memory のエラーとなったため、測定不能となっています。
いずれの条件においても、スループット、レイテンシ及びコストパフォーマンス共にInf1インスタンス2種は優れた結果を示しており、高性能かつ低コストの推論環境であることが確認されました。
本検証で設定した条件においては、特にinf1.xlargeのコストパフォーマンスが優れているという結果となりました。しかし、異なる条件下ではこの限りではありません。想定する規模やモデルの特性に応じて、適切なインスタンスを選択する必要があります。
Note2. Neuronコアの使用率
Inf1インスタンスでは neuron-top コマンドにより、各Neuronコアの使用率を確認することができます。
$ /opt/aws/neuron/bin/neuron-top -v # neuron-topのバージョン neuron-top 1.6.1.0 built on 2021-05-28T02:16:45Z
推論バッチサイズ = 8 とした検証開始5秒後における各Neuronコアの使用率は次の通りとなります。
Inf1.xlarge
Models: 4 loaded, 4 running. NeuronCores: 4 used. Utilizations: NC0 87.73%, NC1 88.53%, NC2 87.83%, NC3 88.50%, Model ID Device NeuronCore% Device Mem Host Mem Model Name 10004 nd0:nc3 88.50 91 MB 12 MB
p/tmprcufup3i/neuron_op_1c4670d98d4e6f86 10003 nd0:nc2 87.83 91 MB 12 MB
p/tmprcufup3i/neuron_op_1c4670d98d4e6f86 10001 nd0:nc0 87.73 91 MB 12 MB
p/tmprcufup3i/neuron_op_1c4670d98d4e6f86 10002 nd0:nc1 88.53 91 MB 12 MB
p/tmprcufup3i/neuron_op_1c4670d98d4e6f86
Inf1.2xlarge
Models: 4 loaded, 4 running. NeuronCores: 4 used. Utilizations: NC0 99.91%, NC1 99.72%, NC2 99.93%, NC3 99.90%, Model ID Device NeuronCore% Device Mem Host Mem Model Name 10004 nd0:nc3 99.41 76 MB 2 MB
p/tmps5ca7mg3/neuron_op_1c4670d98d4e6f86
10003 nd0:nc2 100.00 76 MB 2 MB
p/tmps5ca7mg3/neuron_op_1c4670d98d4e6f86
10001 nd0:nc0 99.92 76 MB 2 MB
p/tmps5ca7mg3/neuron_op_1c4670d98d4e6f86
10002 nd0:nc1 100.00 76 MB 2 MB
p/tmps5ca7mg3/neuron_op_1c4670d98d4e6f86
記録するタイミングにより多少前後しますが、xlarge・2xlargeともに100%に近い使用率となっており、十分にNeuronコアが活用されていることがわかります。
なお、同様に測定したGPUインスタンス2種のGPU使用率は下記のとおりであり、ともに100%近い使用率となっています。
% nvidia-smi --query-
gpu=name,utilization.gpu,utilization.memory,memory.used,memory.free --format=csv -l 1
name, utilization.gpu [%], utilization.memory [%], memory.used [MiB], memory.free [MiB] Tesla T4, 100 %, 94 %, 14694 MiB, 415 MiB #g4dn.xlarge Tesla V100-SXM2-16GB, 90 %, 74 %, 15721 MiB, 439 MiB # p3.2xlarge
5. コンパイルしたモデルの推論精度検証
また、モデルのコンパイル前後において精度が異なるかを検証しました。
[coco dataset] に含まれる、人物が写っている3枚の画像に対してコンパイル前後のAnyMotionモデルにて推論を実行し、出力される座標値を画像中に描画して比較した結果を次に示します。それぞれ左から元画像、コンパイル前のモデルを用いた座標位置の描画、コンパイル後のモデルを用いた座標位置の描画となっています。
多少の差異はあるものの、推論結果はコンパイル前後でおおよそ同じものとなりました。
この差異の原因としては、AnyMotionモデルはもともとFP32にて構築されていますが、コンパイルの際にBFloat16に変換していることが考えられます。
しかし、特にスコアの高い部分については推定された座標の値にほとんど差異はなく、姿勢推定の精度に影響を与えないことが確認できました。
6. AnyMotionモデルによる各検証のまとめ
本記事では、Inf1インスタンスを利用したAnyMotionモデルによる推論の性能及びコストパフォーマンスを、GPUインスタンスやElastic Inference を利用した場合と比較して検証しました。
検証の結果、Inf1インスタンスは推論の性能、コストともに優れていることが確認できました。AnyMotionのサービス品質向上のため、Inf1インスタンスを十分に採用する価値があると判断できます。
実際の導入に向けては冗長化のための構成や最適なLBやproxyの検証等解決しなければならない課題もありますが、導入を前向きに検討していく所存です。
また1部2部通して、問題解決及び性能検証に当たってはAWSに支援を頂戴しました。特にInf1及びNeuron SDKは新しい技術ということもあり、AWSからの支援は大変助かりました。この場を借りて改めてお礼申し上げます。
技業LOG
この記事で紹介しているサービスは
こちら
Anymotion
静止画や動画を撮影するだけで 身体動作を可視化 / 定量化するAPI