Amazon Web Services ブログ

Amazon TensorFlow を使用した Amazon Elastic Inference でのコストの最適化

Amazon Elastic Inference を使用すると、低コストの GPU によるアクセラレーションを Amazon EC2 および Amazon SageMaker インスタンスに適用して、深層学習推論の実行コストを最大 75% 削減できます。EIPredictorAPI を使うと、Elastic Inference を簡単に使用できます。

この記事では、EIPredictor を使用し、Elastic Inference で TensorFlow を使用するための段階的なサンプルを説明します。さらに、TensorFlow とともに Elastic Inference を使用することによるコストとパフォーマンスの利点についても説明します。40 ビデオフレームに対する FasterRCNN-ResNet50 の総推論時間を以上で ~113.699 秒から ~8.883 秒に改善し、コスト効率を 78.5% 向上させた方法について丁寧に説明します。

EIPredictor は TensorFlow Predictor API に基づいています。EIPredictor は TensorFlow Predictor API と一貫性があるように設計されているので、2 つのデータ構造間ではコードの移植性があります。EIPredictor は、単一の Python スクリプトまたはノートブック内で Elastic Inference を簡単に使用できる方法であることを意図しています。TensorFlow Predictor をすでに使用しているフローでは、コードを 1 つ変更するだけで済みます。EIPredictorをインポートして指定するだけです。この手順は、後で示します。

Elastic Inference の利点

それでは、Elastic Inference とその他の Amazon EC2 のオプションをパフォーマンスとコストの点で比較してみましょう。

インスタンスタイプ vCPU CPU メモリ (GB) GPU メモリ (GB) FP32 TFLOPS USD/時間 TFLOPS/USD/時間
1 m5.large 2 8 0.07 0.10 USD 0.73
2 m5.xlarge 4 16 0.14 0.19 USD 0.73
3 m5.2xlarge 8 32 0.28 0.38 USD 0.73
4 m5.4xlarge 16 64 0.56 0.77 USD 0.73
5 c5.4xlarge 16 32 0.67 0.68 USD 0.99
6 p2.xlarge (K80) 4 61 12 4.30 0.90 USD 4.78
7 p3.2xlarge (V100) 8 61 16 15.70 3.06 USD 5.13
8 eia.medium 1 1.00 0.13 USD 7.69
9 eia.large 2 2.00 0.26 USD 7.69
10 eia.xlarge 4 4.00 0.52 USD 7.69
11 m5.xlarge + eia.xlarge 4 16 4 4.14 0.71 USD 5.83

コンピューティング能力 (teraFLOPS または浮動小数点演算毎秒) に注目すると、m5.4xlarge は0.56 TFLOPS の性能が 1 時間あたり 0.77 USD である一方、eia.medium は 1.00 TFLOPS がほんの 0.13 USD のコストです。パフォーマンスだけが目的の場合 (コストを無視)、p3.2xlarge インスタンスが 15.7 TFLOPS と最も高いコンピューティングを提供することは明らかです。

ただし、1 ドルあたりの TFLOPS という最後の列を見ると、Elastic Inference が最も大きな価値を提供していることがわかります。Elastic Inference Accelerator (EIA) は、EC2 インスタンスにアタッチする必要があります。最後の行は、1 つの可能な組み合わせを示しています。m5.xlarge + eia.xlarge は、p2.xlarge と同量の vCPU と TFLOPS がありますが、1 時間あたり 0.19 USD 割安です。Elastic Inference を使用すると、コンピューティングインスタンス、メモリ、GPU コンピューティングを選択して、コンピューティングのニーズに合ったサイズにすることができます。このアプローチで、支出 1 ドルあたりの価値を最大にすることができます。CPU への GPU アタッチメントはフレームワークライブラリによって抽象化されているため、基盤となる GPU ハードウェアを気にすることなく簡単に推論を呼び出すことができます。

EIPredictor を使用したビデオオブジェクト検出の例

以下は、EIPredictor で Elastic Inference を使用する段階的なサンプルです。この例では、FasterRCNN-ResNet50 モデル、m5.large CPU インスタンス、eia.large アクセラレータを使用します。

前提条件

  • 設定スクリプトを使用して Elastic Inference を起動している。
  • m5.large インスタンスに eia.large アクセラレータがアタッチされている。
  • AMI に Docker がインストールされている。この記事では、DLAMI を使用します。Docker なしで AMI を選択することもできますが、先に進む前に Docker を最初にインストールしてください。
  • IAM ロールに ECRFullAccess がある。
  • VPC セキュリティグループには、インバウンドトラフィックとアウトバウンドトラフィックの両方に対して開いているポート 80 と 443、およびインバウンドトラフィックのために開いているポート 22 があります。

TensorFlow での Elastic Inference の使用

  1. Jupyter ノートブック用のポート転送でインスタンスへ SSH。Ubuntu AMI の場合:
    ssh -i {/path/to/keypair} -L 8888:localhost:8888 ubuntu@{ec2 instance public DNS name}

    Amazon Linux AMI の場合:

    ssh -i {/path/to/keypair} -L 8888:localhost:8888 ec2-user@{ec2 instance public DNS name} 
  2. コードをローカルでコピーします。
    git clone https://github.com/aws-samples/aws-elastic-inference-tensorflow-examples   
  3. Jupyter ノートブックを実行して接続します。
    cd aws-elastic-inference-tensorflow-examples; ./build_run_ei_container.sh

    Jupyter ノートブックが起動するまで待ちます。localhost:8888 に移動し、端末で指定されているトークンを入力します。

  4. オブジェクト検出の例のベンチマークバージョンを実行します。
    1. elastic_inference_video_object_detection_tutorial.ipynb を開いて、ノートブックを実行します。
    2. 生成されるセッションランタイムに注意してください。次の 2 つの例は、Elastic Inference なしの場合、Elastic Inference ありの場合を示しています。
      1. 1 つめは、Elastic Inference を使用せずに、インスタンスの CPU でモデルを実行する TensorFlow です。
        モデルのロード時間 (秒): 8.36566710472
        ビデオフレーム数: 40
        平均推論時間 (秒): 2.86271090508
        合計推論時間 (秒): 114.508436203
      2. 2 つ目のレポートは、Elastic Inference アクセラレータを使用しています。
        モデルのロード時間 (秒): 21.4445838928
        ビデオフレーム数: 40
        平均推論時間 (秒): 0.23773444891
        合計推論時間 (秒): 9.50937795639
    3. 2 つの実行の結果、パフォーマンス、およびコストを比較してみましょう。
      • 上に掲載されたスクリーンショットでは、Elastic Inference は平均推論を約 12 倍スピードアップしています。
      • ストリーミングフレームをシミュレートする 340 フレームの形状 (1、1080、1920、3) のこのビデオで、モデルの 1 回の読み込みを考慮すると、m5.large+eia.large を使用して 1 時間に約 44 のフルビデオを推論できます。
      • eia.large Elastic Inference アクセラレータを除いて同じである環境では、1 時間に推論できるのは 3 つまたは 4 つのビデオだけです。したがって、同じ作業を完了するには 12〜15 時間かかります。
      • m5.large は 1 時間あたり 0.096 USD、eia.large スロットタイプは 1 時間あたり 0.26 USD です。このビデオの 44 のレプリカを推論するためのコストを比較すると、この例で設定した Elastic Inference を使用して、1 時間に 44 のビデオに対して推論を実行するには 0.356 USD が必要です。eia.large アクセラレータを使用せずに 12〜15 時間で同じ推論ジョブを実行するには、1.152 USD〜1.44 USD が必要です。
      • 上記の数字を使用すると、eia.large アクセラレータを使用している場合、1/15〜1/12 の時間、約 27.5% のコストで同じタスクを実行できます。eia.large アクセラレータは、毎秒約 4.2 フレームの処理を可能にします。
      • 完全なビデオは、340 フレームです。完全なビデオでオブジェクト検出を実行するには、def extract_video_frames 関数から「and count < 40」を削除します。
    4. 最後に、annotated_dog_park.mp4 のようなビデオを制作する必要があります。
    5. また、アクセラレータを使用し (use_ei=True)、同じタスクをローカルで実行する (use_ei=False) ための EIPredictor の使用法にも注意してください。
      ei_predictor = EIPredictor(
                      model_dir=PATH_TO_FROZEN_GRAPH,
                      input_names={"inputs":"image_tensor:0"},
                      output_names={"detections_scores":"detection_scores:0",
                                    "detection_classes":"detection_classes:0",
                                    "detection_boxes":"detection_boxes:0",
                                    "num_detections":"num_detections:0"},
                      use_ei=True)
      

すべての可能性を探る

ここで、Elastic Inference についてさらに調査を進め、インスタンスの組み合わせをいくつか試してみました。FasterRCNN-ResNet 50、バッチサイズ 1、入力画像サイズ (1080、1920、3) を試しました。

モデルは、形状 (1、100、100、3) のランダム入力を使用した初期推論でメモリにロードされます。最初のノートブックを再実行した後、Elastic Inference アクセラレータ eia.medium、eia.large、eia.xlarge を使用して、m5.large、m5.xlarge、m5.2xlarge、m5.4xlarge との組み合わせから始めました。以下の表を作成しました。

A B C D E
1 クライアントのインスタンスタイプ Elastic Inference アクセラレータのタイプ 時間あたりのコスト 推論のレイテンシー AWS Managed Services 推論 10 万回のコスト
2 m5.large eia.medium 0.23 USD 353.53 2.22 USD
3 eia.large 0.36 USD 222.78 2.20 USD
4 eia.xlarge 0.62 USD 140.96 2.41 USD
5 m5.xlarge eia.medium 0.32 USD 357.70 3.20 USD
6 eia.large 0.45 USD 224.81 2.82 USD
7 eia.xlarge 0.71 USD 150.29 2.97 USD
8 m5.2xlarge eia.medium 0.51 USD 350.38 5.00 USD
9 eia.large 0.64 USD 229.65 4.11 USD
10 eia.xlarge 0.90 USD 142.55 3.58 USD
11 m5.4xlarge eia.medium 0.90 USD 355.53 8.87 USD
12 eia.large 1.03 USD 222.53 6.35
13 eia.xlarge 1.29 USD 149.17 5.34 USD

eia.medium (上の表で黄色で強調表示されている) のクライアントインスタンスタイプを見ると、同様の結果が表示されています。これはクライアント側での処理はあまりなく、より大きなクライアントインスタンスに移行してもパフォーマンスが改善しないことを意味します。より小さいインスタンスを選択することで、コストを節約できます。

同様に、一番大きな eia.xlarge アクセラレータ (青色で強調表示) を使用するクライアントインスタンスを見ても、大きなパフォーマンスの差は見られません。これは、m5.large クライアントインスタンスタイプを使い続けることで、同様のパフォーマンスを達成しながら、より少ない費用で済むことを意味します。さまざまなクライアントインスタンスタイプを設定する方法については、Amazon EC2 用の Amazon Elastic Inference 設定ツールを使用してアクセラレータを数分で起動するを参照してください。

M5、P2、P3 と EIA インスタンスの比較

さまざまなインスタンスタイプでの実行から収集したデータをプロットすると、GPU のパフォーマンスが CPU よりも優れていることがわかります (予想通り)。EC2 P3 インスタンスは、EC2 P2 インスタンスより 3.34 倍高速です。この前に、P2 と P3 の間で選択する必要がありました。Elastic Inferenceは、より高い粒度、より低いコストで別の選択肢を提供します。

1 時間あたりのインスタンスコスト (EIA および EC2 の場合は us-west-2) に基づき、TensorFlow EIPredictor の例で、m5.2xlarge + eia.medium のコストは P2 と P3 の間のインスタンスコスト (次の表を参照) になります 。10 万回の推論を実行するためのコストを考慮すると、P2 と P3 のコストは似ていますが、m5.large+eia.large を使用すると、半分以下の価格でほぼ P2 と同等のパフォーマンスを達成できます。

A B C D
1 インスタンスタイプ 時間あたりのコスト 推論のレイテンシー AWS Managed Services 推論 10 万回のコスト
2 m5.4xlarge 0.77 USD 415.87 8.87 USD
3 c5.4xlarge 0.68 USD 363.45 6.87 USD
4 p2.xlarge 0.90 USD 197.68 4.94 USD
5 p3.2xlarge 3.06 USD 61.04 5.19 USD
6 m5.large+eia.large 0.36 USD 222.78 2.20 USD
7 m5.large+eia.xlarge 0.62 USD 140.96 2.41 USD

推論のレイテンシーの比較

これで、m5.large クライアントインスタンスタイプに決定したので、アクセラレータタイプ (オレンジ色のバー) を見てみましょう。推論のレイテンシーに関して、222.78 ms から 140.96 へと進歩しています。 これは、Elastic Inference アクセラレータが、低コストで、レイテンシーに関して P2 と P3 の間のオプションを提供することを示しています。

推論のコスト効率の比較

上の表の最後の列、10 万回の推論あたりのコストは、組み合わせのコスト効率を示しています。 m5.large と eia.large の組み合わせが最高のコスト効率です。m5.large + eia.large の組み合わせは、m5.4xlarge および P2/P3 インスタンスと比較して、55%~75% の節約で最高のコスト効率を実現しています。

m5.large および eia.xlarge の組み合わせは、m5.4xlarge (CPU のみ) に対して 73% の節約で 2.95 倍のスピードアップ、p2.xlargeに対して 51% の節約で 1.4 倍のスピードアップとなっています。

結果

これまでにわかったことは以下の通りです。

  • Elastic Inference アクセラレータをどのクライアント EC2 インスタンスタイプと組み合わせても、クライアント計算やメモリ等の量は、構成可能な GPU のメモリと計算量に応じて選択できる。
  • Elastic Inference アクセラレータは、低コストでさまざまなメモリおよび GPU アクセラレーションのオプションを提供できる。
  • Elastic Inference アクセラレータは、M5、C5、および P2/P3 インスタンスよりも高いコスト効率を達成できる。

ここでの分析では、TensorFlow で使いやすさを増すことはEIPredictor オブジェクトを作成して呼び出すのと同じくらい簡単であることがわかりました。これにより、TensorFlow を使用してCPU、GPU、および CPU + EIA 環境でほぼ同じテストノートブックを使用でき、テストとパフォーマンス分析が簡単になりました。

ここでは、415.87 ms の推論レイテンシーで m5.4xlarge インスタンスで実行されている FasterRCNN-ResNet50 モデルから始めました。m5.large および eia.large に移行することで推論レイテンシーを 140.96 ms に短縮することができました。その結果、速度を 2.95 倍高速化し、1 時間あたり 0.15 USD のコスト削減を達成しました。また、m5.large および eia.large を使用すると、1 時間あたり 0.41 USD のコスト削減を達成でき、優れたパフォーマンスが得られることもわかりました (416 ms 対 223 ms)。

結論

Elastic Inference で TensorFlow を試し、モデルの推論のパフォーマンスを上げながらどの程度のコスト削減が可能か確認できます。下記は、深層学習推論のために設計スペースを分析した際のステップです。使用中のモデルでこのステップをフォローすることもできます。

  1. CPU コンテキストの推論パフォーマンスを分析するためのテストスクリプトまたはノートブックを作成します。
  2. GPU および EIA 用に微調整を加えてスクリプトのコピーを作成します。
  3. M5、P2、P3 インスタンスタイプでスクリプトを実行してパフォーマンスのベースラインを取得します。
  4. パフォーマンスを分析します。
    1. 最大の Elastic Inference アクセラレータタイプと大きなクライアントインスタンスタイプから始めます。
    2. 小さすぎるコンボを発見できるまで逆行解析を行います。
  5. 10 万回の推論を実行するためのコストを計算することで、分析にコスト効率を導入します。 

著者について

Cory Pruce は、AWS AI TensorFlow のソフトウェア開発エンジニアです。彼は、特に TensorFlow を使って、AI 分野で AWS のサービスを構築することに取り組んでいます。自由時間には、データサイエンス/機械学習のコンテストに参加したり、最先端の技術について学んだり、プロジェクトに取り組んだりしています。

 

 

 

Srinivas Hanabe は、AWS AI で Elastic Inference 担当の主席プロダクトマネージャです。現在の職に就く前は、Amazon VPC の PM リーダーでした。Srinivas は、長距離を走ること、さまざまなトピックについて本を読むこと、家族と過ごすことが大好きで、キャリアの指導者でもあります。