Amazon SageMakerのTorchServeで動的バッチ推論を使用して、推論ジョブを最適化します

ソースノード: 1884601

ディープ ラーニングでは、バッチ処理とは、複数の入力をモデルに供給することを指します。 トレーニング中には不可欠ですが、コストを管理し、推論時にスループットを最適化することも非常に役立ちます。 ハードウェア アクセラレータは並列処理用に最適化されており、バッチ処理は計算能力を飽和させ、多くの場合、スループットの向上につながります。

バッチ処理は、運用環境でモデルをデプロイする際のいくつかのシナリオで役立ちます。 ここでは、それらを XNUMX つのユース ケースに大まかに分類します。

  • 複数の推論リクエストが異なるクライアントから受信され、動的にバッチ処理されてサービング モデルに供給されるリアルタイム アプリケーション。 通常、これらのユースケースではレイテンシーが重要です。
  • 複数の入力または要求がクライアント側でバッチ処理され、サービス モデルに送信されるオフライン アプリケーション。 多くの場合、これらのユース ケースではより高いスループットが目標となり、コストの管理に役立ちます。 ユースケースの例には、ビデオ分析とモデル評価が含まれます。

アマゾンセージメーカー は、推論ジョブに XNUMX つの一般的なオプションを提供します。 リアルタイム アプリケーションの場合、SageMaker Hosting は TorchServe を、受信したリクエストの動的バッチ処理を処理するバックエンド サービス ライブラリとして使用します。 オフライン アプリケーションの場合、SageMaker バッチ変換ジョブを使用できます。 この投稿では、開始するのに役立つ各オプションの例を紹介します。

TorchServe はネイティブであるため SageMaker と統合 ビア SageMaker PyTorch 推論ツールキット、SageMaker Hosting を使用して、PyTorch モデルを TorchServe に簡単にデプロイできます。 カスタム Docker イメージを使用して環境をさらにカスタマイズする必要がある場合もあります。 この投稿では、ネイティブの SageMaker PyTorch 推論ツールキットを使用してリアルタイム エンドポイントをデプロイし、バッチ サイズを構成してスループットを最適化する方法を最初に示します。 XNUMX 番目の例では、カスタム Docker イメージを使用して、環境変数として利用できない高度な TorchServe 構成を構成して、バッチ推論ジョブを最適化する方法を示します。

バッチ推論のベスト プラクティス

バッチ処理は、待ち時間を犠牲にして一定時間内により多くの推論を完了するのに役立つため、スループットを向上させ、リソースを最適化できます。 モデルのデプロイを最適化してスループットを向上させるための一般的なガイドラインは、スループットが低下するまでバッチ サイズを大きくすることです。 これは多くの場合、複数の入力 (ビデオ フレーム、画像、テキストなど) をバッチ処理して予測出力を取得するオフライン アプリケーションに適しています。

リアルタイム アプリケーションの場合、多くの場合、レイテンシが主な懸念事項です。 スループットの向上と、バッチ サイズとレイテンシの増加との間にはトレードオフがあります。 レイテンシ SLA を満たすために、必要に応じて調整が必要になる場合があります。 クラウドでのベスト プラクティスに関しては、特定の数の推論あたりのコストは、ビジネス ニーズを満たす十分な情報に基づいた意思決定を行う際に役立つガイドラインです。 コストを管理する要因の XNUMX つは、適切なアクセラレータを選択することです。 詳細については、次を参照してください。 Amazon SageMaker を使用したコンピュータービジョン推論に最適な AI アクセラレーターとモデルのコンパイルを選択する.

SageMaker での TorchServe 動的バッチ処理

トーチサーブ 本番環境でモデルを大規模に提供するためのネイティブ PyTorch ライブラリです。 Facebook と AWS の共同開発です。 TorchServe を使用すると、監視、カスタム メトリクスの追加、複数のモデルのサポート、安全な管理 API によるワーカー数のスケールアップとスケールダウン、および推論と説明のエンドポイントの提供が可能になります。

バッチ処理をサポートするために、TorchServe は動的バッチ処理機能を提供します。 指定された時間枠内で受信したリクエストを集約し、それらをまとめてバッチ化し、推論のためにバッチを送信します。 受信したリクエストは、 ハンドラー トーチサーブで。 TorchServe にはいくつかのデフォルト ハンドラーがあり、ユース ケースがカバーされていない場合はカスタム ハンドラーを作成できます。 カスタム ハンドラーを使用する場合は、バッチ推論ロジックがハンドラーに実装されていることを確認してください。 バッチ推論をサポートするカスタム ハンドラーの例は、 GitHubの.

XNUMX つの設定を使用して動的バッチ処理を構成できます。 batch_size & max_batch_delay、SageMaker の環境変数または config.properties TorchServe のファイル (カスタム コンテナーを使用している場合)。 TorchServe は、最大バッチ サイズ (batch_size) または指定された時間ウィンドウを介して要求のバッチを待機する max_batch_delay.

TorchServe と SageMaker の統合により、SageMaker PyTorch モデルを定義できる SageMaker に PyTorch モデルをネイティブにデプロイできるようになりました。 SageMaker PyTorch へのエントリ ポイントとして渡されるスクリプトに、カスタム モデルの読み込み、推論、および前処理と後処理のロジックを追加できます (次のサンプル コードを参照)。 または、カスタム コンテナーを使用してモデルをデプロイすることもできます。 詳細については、次を参照してください。 SageMaker PyTorch モデル サーバー.

環境変数を使用して、SageMaker で PyTorch モデルのバッチ サイズを設定できます。 カスタム コンテナの使用を選択した場合は、バンドルできます。 設定 in config.properties TorchServe でモデルをパッケージ化するときにモデルと一緒に。 次のコード スニペットは、環境変数を使用してバッチ サイズを設定する方法と、SageMaker に PyTorch モデルをデプロイする方法の例を示しています。

from SageMaker.pytorch.model import PyTorchModel env_variables_dict = { "SAGEMAKER_TS_BATCH_SIZE": "3", "SAGEMAKER_TS_MAX_BATCH_DELAY": "100000"
} pytorch_model = PyTorchModel( model_data=model_artifact, role=role, source_dir="code", framework_version='1.9', entry_point="inference.py", env=env_variables_dict
) predictor = pytorch_model.deploy(initial_instance_count=1, instance_type="ml.c5.2xlarge", serializer=SageMaker.serializers.JSONSerializer(), deserializer=SageMaker.deserializers.BytesDeserializer())

コード スニペットでは、 model_artifact .tar ファイルにアーカイブされ、 Amazon シンプル ストレージ サービス (Amazon S3) バケット。 inference.py は TorchServe カスタム ハンドラーに似ています。 モデルの初期化、受信したリクエストの前処理と後処理、および推論ロジックに対応するためにオーバーライドできる関数がいくつかあります。

以下 ノート Hugging Face BERT モデルを展開する完全な例を示します。

カスタム コンテナが必要な場合は、カスタム コンテナ イメージをビルドして、 Amazon エラスティック コンテナ レジストリ (Amazon ECR) リポジトリ。 この場合のモデル アーティファクトは、ハンドラーとともにモデル アーティファクトをバンドルする TorchServe .mar ファイルにすることができます。 SageMaker バッチ変換ジョブを使用する次のセクションでこれを示します。

SageMaker バッチ変換ジョブ

データセットなどのデータソースからリクエストがバッチ処理されるオフラインのユースケースでは、SageMaker が提供します。 バッチ変換ジョブ. これらのジョブを使用すると、S3 バケットからデータを読み取り、結果をターゲット S3 バケットに書き込むことができます。 詳細については、次を参照してください。 バッチ変換を使用して大規模なデータセットから推論を取得する. バッチ変換ジョブを使用したバッチ推論の完全な例は、次のとおりです。 ノートここでは、FLORES コンペティションの機械翻訳モデルを使用しています。 この例では、カスタム コンテナを使用して、SageMaker を使用してモデルにスコアを付ける方法を示します。 カスタム推論コンテナーを使用すると、TorchServe 構成をさらにカスタマイズできます。 この例では、TorchServe を介して実行できる JSON デコードを変更して無効にします。 config.properties ファイルにソフトウェアを指定する必要があります。

TorchServe のカスタム ハンドラーを使用する場合、ハンドラーがバッチ推論ロジックを実装していることを確認する必要があります。 各ハンドラーには、前処理、推論、および後処理を実行するためのカスタム関数を含めることができます。 バッチ推論をサポートするカスタム ハンドラーの例は、 GitHubの.

TorchServe (.mar ファイルの作成)。 また、バッチ サイズと JSON デコードを設定して TorchServe を開始する Docker コンテナへのエントリ ポイントも必要です。 config.properties. 例でこれを示します ノート.

SageMaker バッチ変換ジョブでは、S3 バケットから入力ファイルにアクセスする必要があります。ここで、入力ファイルをミニバッチに分割し、推論のために送信します。 バッチ変換ジョブを構成するときは、次の点を考慮してください。

  • 入力ファイル (データセットなど) を S3 バケットに配置し、ジョブ設定でデータ ソースとして設定します。
  • バッチ変換ジョブの結果を保存する S3 バケットを割り当てます。
  • 作成セッションプロセスで バッチ戦略 〜へ MultiRecord & SplitType 〜へ Line 入力ファイルからミニバッチを作成するためにバッチ変換ジョブが必要な場合。 データセットをミニ バッチに自動的に分割できない場合は、データ ソース S3 バケットに配置された個別の入力ファイルに各バッチを配置することで、ミニ バッチに分割できます。
  • バッチ サイズがメモリに収まるようにしてください。 通常、SageMaker はこれを自動的に処理します。 ただし、バッチを手動で分割する場合は、メモリに基づいて調整する必要があります。

次のコードは、バッチ変換ジョブの例です。

s3_bucket_name= 'SageMaker-us-west-2-XXXXXXXX'
batch_input = f"s3://{s3_bucket_name}/folder/jobename_TorchServe_SageMaker/"
batch_output = f"s3://{s3_bucket_name}/folder/jobname_TorchServe_SageMaker_output/" batch_job_name = 'job-batch' + time.strftime("%Y-%m-%d-%H-%M-%S", time.gmtime())
batch_job_name request = { "ModelClientConfig": { "InvocationsTimeoutInSeconds": 3600, "InvocationsMaxRetries": 1, }, "TransformJobName": batch_job_name, "ModelName": model_name, "MaxConcurrentTransforms":1, "BatchStrategy": "MultiRecord", "TransformOutput": {"S3OutputPath": batch_output, "AssembleWith": "Line", "Accept": "application/json"}, "TransformInput": { "DataSource": { "S3DataSource": {"S3DataType": "S3Prefix", "S3Uri": batch_input} }, "SplitType" : "Line", "ContentType": "application/json", }, "TransformResources": {"InstanceType": "ml.p2.xlarge", "InstanceCount": 1},
}

上記の設定を使用して変換ジョブを起動すると、ソース S3 バケットから入力ファイルがバッチで読み取られ、推論のために送信されます。 結果は、出力に指定された S3 バケットに書き戻されます。

次のコード スニペットは、前述の設定を使用してジョブを作成および起動する方法を示しています。

sm.create_transform_job(**request) while True: response = sm.describe_transform_job(TransformJobName=batch_job_name) status = response["TransformJobStatus"] if status == "Completed": print("Transform job ended with status: " + status) break if status == "Failed": message = response["FailureReason"] print("Transform failed with the following error: {}".format(message)) raise Exception("Transform job failed") print("Transform job is still in status: " + status) time.sleep(30)

まとめ

この投稿では、SageMaker がオンラインとオフラインの推論のために提供する 3 つのモードを確認しました。 前者は、TorchServe で提供される動的バッチ処理を使用して、複数のクライアントからのリクエストをバッチ処理します。 後者は、SageMaker 変換ジョブを使用して、SXNUMX バケット内の入力ファイルからのリクエストをバッチ処理し、推論を実行します。

また、ネイティブの SageMaker PyTorch 推論ツールキット コンテナー イメージを使用して SageMaker でモデルを提供する方法と、高度な TorchServe 構成設定を必要とするユース ケースでカスタム コンテナーを使用する方法も示しました。

TorchServe は PyTorch コミュニティのニーズに対応するために進化を続けており、新しい機能が SageMaker に統合され、本番環境でモデルを提供するためのパフォーマンスの高い方法が提供されています。 詳細については、 トーチサーブ GitHub リポジトリSageMaker の例.


著者について

ピグエン はAWSのソリューションアーキテクトであり、データレイク、分析、セマンティクステクノロジー、機械学習に特に重点を置いて、お客様のクラウドジャーニーを支援しています。 余暇には、自転車で通勤したり、息子のサッカーチームを指導したり、家族と一緒に自然散策を楽しんだりしています。

ニキル・クルカルニ AWS Machine Learning のソフトウェア開発者であり、クラウド上で機械学習ワークロードのパフォーマンスを向上させることに重点を置いており、トレーニングと推論のための AWS Deep Learning Containers の共同作成者です。 彼は、分散ディープ ラーニング システムに情熱を注いでいます。 仕事以外では、本を読んだり、ギターをいじったり、ピザを作ったりしています。

ハミド・ショジャナゼリ Pytorch のパートナー エンジニアであり、OSS の高性能モデルの最適化とサービス提供に取り組んでいます。 Hamid はコンピューター ビジョンの博士号を取得しており、オーストラリア、マレーシアのマルチメディア ラボで研究者として働き、Opus.ai で NLP リーダーを務めました。 彼は難しい問題に対するより簡単な解決策を見つけるのが好きで、余暇には芸術愛好家です。

ギータ・チョーハン Meta AI で AI パートナー エンジニアリングをリードし、スタートアップやフォーチュン 500 企業向けの回復力があり、壊れにくい大規模な分散型プラットフォームを構築する専門知識を持っています。 彼女のチームは、戦略的パートナー、業界全体の機械学習リーダー、およびすべての主要なクラウド サービス プロバイダーと協力して、新しい AI 製品サービスとエクスペリエンスを構築および立ち上げています。 彼女は、Women in IT – Silicon Valley – CTO of the year 2019 の受賞者であり、ACM Distinguished Speaker であり、AI の倫理、ディープ ラーニング、ブロックチェーン、IoT に及ぶトピックのソート リーダーです。 彼女は、AI for Good の使用を促進することに情熱を注いでいます。

ソース: https://aws.amazon.com/blogs/machine-learning/optimize-your-inference-jobs-using-dynamic-batch-inference-with-torchserve-on-amazon-sagemaker/

タイムスタンプ:

より多くの AWS機械学習ブログ