Amazon Web Services ブログ

Amazon SageMaker の NVIDIA Triton Inference Server を使用して高速でスケーラブルな AI をデプロイする

機械学習 (ML) とディープラーニング (DL) は、医療診断における画像分類、チャットボットにおける会話型 AI、e コマースにおけるレコメンデーションシステムに至るまで、さまざまなコンピューティングの問題を解決するための効果的なツールになりつつあります。ただし、特定のレイテンシーまたは高スループットの要件を持つ ML モデルは、一般的なコンピューティングインフラストラクチャで大規模に実行するには莫大なコストがかかる可能性があります。企業や顧客が期待する厳しいスループット、スケール、レイテンシーでの推論を最小限のコストで実行するために、ML モデルは GPU などの推論アクセラレータを必要とします。

トレーニング済みのモデルとそれに付随するコードをデータセンター、パブリッククラウド、またはエッジにデプロイすることを、推論サービング と呼びます。 Amazon SageMaker での NVIDIA Triton Inference Server の統合を発表できることを嬉しく思います。 SageMaker の Triton Inference Server コンテナは、複数のフレームワークを利用したモデルを高性能の CPU または GPU にデプロイするのに役立ちます。

この投稿では、NVIDIA Triton Inference Server と SageMaker の概要、Triton Inference Server コンテナを使用する利点や、独自の ML モデルをデプロイすることがいかに簡単かを紹介します。この投稿内容のサンプルノートブックをお試しする場合は、こちらからダウンロードしてください

NVIDIA Triton 推論サーバーの概要

NVIDIA Triton Inference Server は、モデルをスケーラブル、迅速、簡単にプロダクション環境にデプロイするために開発されました。 Triton は、推論サービングプロセスを簡素化し、高い推論パフォーマンスを提供するオープンソースの推論サービングソフトウェアです。 Triton は、金融、通信、小売、製造、公共、医療など、あらゆる主要業種の業界で広く導入されています。

Triton の主な機能の一部を次に示します。

  • 複数のフレームワークのサポート – Triton を使用して、すべての主要なフレームワークからモデルをデプロイできます。 Triton は、TensorFlow GraphDef および SavedModel、ONNX、PyTorch TorchScript、TensorRT、ツリーベース モデル用の RAPIDS FIL、OpenVINO、およびカスタム Python/C++ モデル形式をサポートしています。
  • モデルパイプライン – Triton モデルアンサンブルは、1 つ以上のモデルまたは、前処理と後処理のロジックのパイプラインと、それらの間の入出力テンソルの接続を表します。アンサンブルへの単一の推論リクエストが、パイプライン全体をトリガーします。
  • モデルの同時実行 – 複数のモデル (異なるモデルの同時実行のサポートがまもなく追加されます、訳注:2022/08/16 時点で追加されています。 Concurrent Model Execution) または同じモデルの複数のインスタンスを、同じ GPU または異なるモデル管理のニーズに合わせて複数の GPU で同時に実行できます。
  • 動的バッチ処理 – バッチ処理をサポートするモデルの場合、Triton には複数の組み込みのスケジューリングおよびバッチ処理アルゴリズムがあり、個々の推論リクエストをまとめて推論スループットを向上させます。これらのスケジューリングとバッチ処理の決定は、推論をリクエストするクライアントに対して透過的に行われます。
  • 多様な CPU と GPU のサポート – CPU または GPU 上でモデルを実行して、柔軟性を最大限に高め、多様なコンピューティング要件をサポートできます。

次の図は、NVIDIA Triton 推論サーバーのアーキテクチャを示しています。(訳注:最新のアーキテクチャ図

SageMaker は、データサイエンスと ML ワークフロー向けのフルマネージドサービスです。 ML 専用に構築された幅広い目的別の機能セットをまとめることで、データサイエンティストと開発者が高品質の ML モデルを迅速に準備、構築、トレーニング、デプロイするのに役立ちます。

SageMaker は、NVIDIA Triton Inference Server を統合して、SageMaker での推論用のモデルを提供するようになりました。新しい Triton Inference Server コンテナのおかげで、モデルを簡単に提供し、Triton が提供するパフォーマンスの最適化、動的バッチ処理、およびマルチフレームワークサポートの恩恵を受けることができます。 Triton は、GPU と CPU の使用率を最大化し、推論のコストを削減します。

この SageMaker と NVIDIA Triton Inference Server の組み合わせにより、あらゆる業界の開発者がモデルをプロダクション環境へ大規模かつ迅速にデプロイできます。

以降のセクションでは、モデルのパッケージ化、SageMaker エンドポイントの作成、およびパフォーマンスのベンチマークに必要な手順について詳しく説明します。 Triton Inference Server コンテナの最初のリリースでは、単一のモデルを一つ以上のインスタンス上で動かす場合のみサポートされることに注意してください。今後のリリースでは、マルチモデルもサポートされる予定です。

モデルを準備する

モデルを Triton デプロイ用に準備するには、Triton サービング ディレクトリを次の形式で配置する必要があります。

triton_serve
 └── model
 	└── config.pbtxt
 	└── 1
     	         └── model.plan

この形式では、triton_serve はすべてのモデルを含むディレクトリ、model はモデル名、1 はバージョン番号です。

ユーザーが 必要とする実際のワークロードに基づいて、config.pbtxt ファイルには最適な構成を使用することをお勧めします。

たとえば、組み込みのサーバーサイド動的バッチ処理を有効にするには、4 行のコードしか必要ありません。

dynamic_batching {
   preferred_batch_size: 16
   max_queue_delay_microseconds: 1000
 }

ここで、preferred_batch_size オプションは、入力リクエストを結合する希望バッチサイズを意味します。 max_queue_delay_microseconds オプションは、使用可能なリクエストから希望サイズを作成できない場合に NVIDIA Triton サーバーが待機する時間です。

モデルの同時実行の場合、instance_groupcount 数を変更して GPU ごとのモデル同時実行数を直接指定すると、同じモデルの複数のコピーを簡単に実行して、コンピューティングリソースをより効率的に活用できます。

instance_group {
   count: 1
   kind: KIND_GPU
 }

構成ファイルの詳細については、モデル構成を参照してください。

モデルディレクトリを作成したら、次のコマンドを使用して、後で Amazon Simple Storage Service (Amazon S3) バケットにアップロードするために、モデルを .tar ファイルに圧縮します。

tar -C triton-serve/ -czf model.tar.gz model

SageMaker エンドポイントを作成する

作成したモデルリポジトリで SageMaker エンドポイントを作成するには、SageMaker エンドポイント作成 UI、AWS Command Line Interface (AWS CLI)、および SageMaker Python SDK を使用するなど、いくつかの異なるオプションがあります。

このノートブックの例では、SageMaker Python SDK を使用します。

  1. Triton サーバー コンテナと S3 バケットにアップロードしたモデルアーティファクトの両方を使用して、コンテナ定義を作成します。
    container = {
        'Image': triton_image_uri,
        'ModelDataUrl': model_uri,
        'Environment': {
            'SAGEMAKER_TRITON_DEFAULT_MODEL_NAME': 'resnet'
        }
    }
  2. 前のステップで作成したコンテナ定義を使用して SageMaker モデル定義を作成します。
    create_model_response = sm.create_model(
        ModelName         = sm_model_name,
        ExecutionRoleArn  = role,
        PrimaryContainer  = container)
    print("Model Arn: " + create_model_response['ModelArn'])
  3. エンドポイントで必要なインスタンスタイプとインスタンス数を指定して、エンドポイントの設定を作成します。
    endpoint_config_name = 'triton-resnet-pt-' + time.strftime("%Y-%m-%d-%H-%M-%S", time.gmtime())
    
    create_endpoint_config_response = sm.create_endpoint_config(
        EndpointConfigName = endpoint_config_name,
        ProductionVariants = [{
            'InstanceType'        : 'ml.g4dn.4xlarge',
            'InitialVariantWeight': 1,
            'InitialInstanceCount': 1,
            'ModelName'           : sm_model_name,
            'VariantName'         : 'AllTraffic'}])
    
    print("Endpoint Config Arn: " + create_endpoint_config_response['EndpointConfigArn'])
  4. 次のコマンドを実行して、エンドポイントを作成します。
    endpoint_name = 'triton-resnet-pt-' + time.strftime("%Y-%m-%d-%H-%M-%S", time.gmtime())
    
    create_endpoint_response = sm.create_endpoint(
        EndpointName         = endpoint_name,
        EndpointConfigName   = endpoint_config_name)

結論

SageMaker は、使いやすいフルマネージド型の開発およびデプロイプラットフォームを提供することで、あらゆる業界の開発者や組織が AI モデルをアプリケーションに簡単に導入してデプロイできるように支援します。 Triton Inference Server コンテナを使用すると、高性能の GPU と CPU 上で複数のフレームワークのための単一の推論サービングソリューションを提供することで、組織は SageMaker でのモデルのデプロイをさらに簡素化できます。

SageMaker で Triton Inference Server コンテナを試して、コメントでフィードバックや質問を共有してください。

翻訳はソリューションアーキテクト赤澤が担当しました。原文はこちらです。