翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
ホスティングサービスでのカスタム推論コードの使用
このセクションでは、Amazon SageMaker AI がホスティングサービス用の独自の推論コードを実行する Docker コンテナとやり取りする方法について説明します。この情報を使用して、推論コードを書き込み、Docker イメージを作成します。
トピック
SageMaker AI が推論イメージを実行する方法
コンテナを実行可能ファイルとして実行するように設定するには、Dockerfile で ENTRYPOINT 命令を使用します。次の点に注意してください。
-
モデル推論の場合、SageMaker AI はコンテナを次のように実行します。
docker runimageserveSageMaker AI はイメージ名の後に
serve引数を指定して、コンテナ内のデフォルトのCMDステートメントを上書きします。serve引数は、Dockerfile のCMDコマンドで指定した引数よりも優先されます。 -
SageMaker AI では、すべてのコンテナがルートユーザーで実行されることを想定しています。ルートユーザーのみを使用するようにコンテナを作成します。SageMaker AI がコンテナを実行する際、ルートレベルのアクセス権を持たないユーザーによって権限の問題が発生する場合があります。
-
exec命令のENTRYPOINTフォームを使用することをお勧めします。ENTRYPOINT ["executable", "param1", "param2"]例:
ENTRYPOINT ["python", "k_means_inference.py"]exec命令のENTRYPOINTフォームは、/bin/shの子としてではなく、直接実行ファイルを開始します。これにより、SageMaker API オペレーションからSIGTERMやSIGKILLのようなシグナルを受信できます。これは要件です。例えば、エンドポイントを作成する
CreateEndpointAPI を使用する場合に、SageMaker AI はリクエストで指定するエンドポイント設定で必要な ML コンピューティングインスタンスの数をプロビジョニングします。SageMaker AI はそれらのインスタンスで Docker コンテナを実行します。エンドポイントをバックアップするインスタンスの数を減らす場合 (
UpdateEndpointWeightsAndCapacitiesAPI の呼び出しによって)、SageMaker AI は終了するインスタンスの Docker コンテナを停止するコマンドを実行します。コマンドは、SIGTERMシグナルを送信し、30 秒後にSIGKILLシグナルを送信します。エンドポイントを更新する場合 (
UpdateEndpointAPI の呼び出しによって)、SageMaker AI は別の一連の ML コンピューティングインスタンスを起動して、推論コードを含む Docker コンテナを実行します。次に、前の Docker コンテナを停止するコマンドを実行します。Docker コンテナを停止するために、コマンドは、SIGTERMシグナルを送信し、30 秒後にSIGKILLシグナルを送信します。 -
SageMaker AI は
CreateModelリクエストで指定したコンテナ定義を使用してコンテナの環境変数と DNS ホスト名を次のように設定します。-
ContainerDefinition.Environment文字列間マップを使用して環境変数を設定します。 -
ContainerDefinition.ContainerHostnameを使用して DNS ホスト名を設定します。
-
-
モデル推論に GPU デバイスを使用 (
CreateEndpointConfigリクエストで GPU ベースの ML コンピューティングインスタンスを指定) する予定の場合は、コンテナがnvidia-docker互換であることを確認してください。NVIDIA ドライバーをイメージにバンドルしないでください。nvidia-dockerの詳細については、NVIDIA/nvidia-dockerを参照してください。 -
tini引数とtrain引数で混乱が生じるため、SageMaker AI コンテナでは、serveイニシャライザをエントリポイントとして使用することはできません。
SageMaker AI がモデルアーティファクトをロードする方法
CreateModel API リクエストでは、ModelDataUrl または S3DataSource パラメータを使用して、モデルアーティファクトが保存されている S3 の場所を特定することができます。SageMaker AI は、推論コードで使用するために、モデルアーティファクトを S3 の場所から /opt/ml/model ディレクトリにコピーします。コンテナは /opt/ml/model に読み取り専用でアクセスできます。このディレクトリには書き込まないでください。
ModelDataUrl は tar.gz ファイルを指す必要があります。この情報がないと、SageMaker AI はファイルをダウンロードできません。
モデルを SageMaker AI でトレーニングした場合、モデルアーティファクトは Amazon S3 の単一の圧縮 tar ファイルとして保存されます。SageMaker AI の外部でモデルをトレーニングした場合は、この単一の圧縮 tar ファイルを作成して S3 の場所に保存する必要があります。コンテナが起動する前に、SageMaker AI は、この tar ファイルを /opt/ml/model ディレクトリに解凍します。
大規模なモデルをデプロイする場合は、非圧縮モデルのデプロイ の配置に従うことをお勧めします。
コンテナが推論リクエストに応答する方法
推論を取得するため、クライアントアプリケーションは POST リクエストを SageMaker AI エンドポイントに送信します。SageMaker AI はリクエストをコンテナに渡し、推論結果をコンテナからクライアントに返します。
コンテナが受け取る推論リクエストの詳細については、Amazon SageMaker AI API リファレンスの以下のアクションを参照してください。
推論コンテナの要件
推論リクエストに応答するには、コンテナが次の要件を満たしている必要があります。
-
InvokeEndpointでサポートされているものを除き、SageMaker AI はすべてのPOSTヘッダーを削除します。SageMaker AI は追加のヘッダーを追加する場合があります。推論コンテナはこれらの追加ヘッダーを安全に無視できる必要があります。 -
推論リクエストを受信するには、コンテナにポート 8080 でリッスンするウェブサーバーが必要であり、
/invocationsおよび/pingエンドポイントへのPOSTリクエストを受け入れる必要があります。 -
顧客のモデルコンテナは、250 ミリ秒以内にソケット接続リクエストを受け入れる必要があります。
-
顧客のモデルコンテナは、60 秒以内にリクエストに応答する必要があります。モデル自体は、
/invocationsに応答するまで 60 秒の最大処理時間をかけることができます。モデルの処理時間が 50 ~ 60 秒かかる場合は、SDK ソケットタイムアウトを 70 秒に設定する必要があります。 -
双方向ストリーミングをサポートする顧客のモデルコンテナは、以下を行う必要があります。
-
は、デフォルトでポート 8080 から /invocations-bidirectional-stream への WebSockets 接続をサポートします。 invocations-bidirectional-stream
-
ポート 8080 でリッスンしているウェブサーバーがあり、/ping エンドポイントへの POST リクエストを受け入れる必要があります。
-
HTTP 経由のコンテナヘルスチェックに加えて、コンテナは送信される WebSocket Ping Frame の (RFC6455
) に従って Pong Frame で応答する必要があります。
-
例呼び出し関数
以下の例は、コンテナ内のコードで推論リクエストを処理する方法を示しています。これらの例は、InvokeEndpoint アクションを使用してクライアントアプリケーションが送信するリクエストを処理します。
例ストリーミングリクエストの呼び出し関数
以下の例は、推論コンテナ内のコードで推論リクエストを処理する方法を示しています。これらの例は、InvokeEndpointWithResponseStream アクションを使用してクライアントアプリケーションが送信するリクエストを処理します。
コンテナがストリーミング推論リクエストを処理すると、モデルが推論を生成する際に、モデルの推論は一連のパーツとして段階的に返されます。レスポンスが利用可能になると、クライアントアプリケーションはすぐに受信し始めます。クライアントアプリケーションは、モデルがレスポンス全体を生成するのを待つ必要はありません。ストリーミングを実装し、チャットボット、仮想アシスタント、ミュージックジェネレーターなどの高速でインタラクティブな体験をサポートできます。
例双方向ストリーミングの呼び出し関数の例
次の例は、コンテナ内のコードがストリーミング推論リクエストとレスポンスを処理する方法を示しています。これらの例では、InvokeEndpointWithBidirectionalStream アクションを使用してクライアントアプリケーションが送信するストリーミングリクエストを処理します。
双方向ストリーミング機能を備えたコンテナは、パートがクライアントで段階的に生成され、コンテナにストリーミングされるストリーミング推論リクエストを処理します。モデルの推論は、モデルが生成する一連のパートとしてクライアントに返されます。レスポンスが利用可能になると、クライアントアプリケーションはすぐに受信し始めます。クライアントで完全に生成された へのリクエストや、モデルがレスポンス全体を生成するのを待つ必要はありません。双方向ストリーミングを実装して、チャットボット、インタラクティブな音声 AI アシスタント、リアルタイム翻訳などの高速なインタラクティブエクスペリエンスをサポートし、よりリアルタイムのエクスペリエンスを実現できます。
コンテナがヘルスチェック (Ping) リクエストに応答する方法
SageMaker AI は、以下の状況で新しい推論コンテナを起動します。
-
CreateEndpoint、UpdateEndpoint、およびUpdateEndpointWeightsAndCapacitiesAPI 呼び出しへの応答 -
セキュリティパッチ
-
異常のあるインスタンスの置き換え
コンテナの起動直後に、SageMaker AI は定期的に GET リクエストを /ping エンドポイントに送信し始めます。
コンテナの最も単純な要件は、HTTP 200 のステータスコードと空の本文で応答することです。これにより SageMaker AI に対し、コンテナが /invocations エンドポイントでの推論リクエストを受け入れる準備ができていることを示されます。
コンテナがスタートアップ後 8 分間に、常に 200 秒で応答しヘルスチェックを通過しない場合、新しいインスタンスの起動は失敗します。これにより CreateEndpoint は失敗し、エンドポイントは障害状態のままになります。UpdateEndpoint によって要求された更新は完了せず、セキュリティパッチは適用されず、異常のあるインスタンスは置き換えられません。
コンテナが静的な 200 を返す最小限のバーがありますが、コンテナ開発者はこの機能を使用してより深いチェックを実行できます。/ping 試行のリクエストのタイムアウトは 2 秒です。
さらに、双方向ストリーミングリクエストを処理できるコンテナは、Pong フレーム (WebSocket プロトコル RFC6455
双方向ストリーミング機能をサポートするコンテナ契約
双方向ストリーミング機能をサポートする SageMaker AI エンドポイントとしてモデルコンテナをホストする場合は、モデルコンテナが以下の契約をサポートしている必要があります。
1. 双方向 Docker ラベル
モデルコンテナには、このコンテナで双方向ストリーミング機能がサポートされていることを SageMaker AI プラットフォームに示す Docker ラベルが必要です。
com.amazonaws.sagemaker.capabilities.bidirectional-streaming=true
2. 呼び出しの WebSocket 接続のサポート
双方向ストリーミングをサポートする顧客のモデルコンテナは/invocations-bidirectional-stream、デフォルトでポート 8080 から への WebSockets 接続をサポートする必要があります。
このパスは、InvokeEndpointWithBidirectionalStream API を呼び出すときに X-Amzn-SageMaker-Model-Invocation-Path ヘッダーを渡すことで上書きできます。さらに、ユーザーは InvokeEndpointWithBidirectionalStream API を呼び出すときに X-Amzn-SageMaker-Model-Query-String ヘッダーを渡すことで、このパスに追加するクエリ文字列を指定できます。
3. リクエストストリームの処理
InvokeEndpointWithBidirectionalStream API 入力ペイロードは、バイナリチャンク (「バイト」: <Blob>) のラッパーにすぎない一連の PayloadParts として にストリーミングされます。
{ "PayloadPart": { "Bytes": <Blob>, "DataType": <String: UTF8 | BINARY>, "CompletionState": <String: PARTIAL | COMPLETE> "P": <String> } }
3.1。データフレーム
SageMaker AI が入力 PayloadParts をモデルコンテナに WebSocket データフレームとして渡す (RFC6455-Section-5.6
-
SageMaker AI はバイナリチャンクを検査しません。
-
入力 PayloadPart の受信時
-
SageMaker AI は、 から WebSocket データフレームを 1 つだけ作成し
PayloadPart.Bytes、それをモデルコンテナに渡します。 -
の場合
PayloadPart.DataType = UTF8、SageMaker AI はテキストデータフレームを作成します -
PayloadPart.DataTypeに または が存在しない場合PayloadPart.DataType = BINARY、SageMaker AI はバイナリデータフレームを作成します。
-
-
を使用した一連の PayloadParts で
PayloadPart.CompletionState = PARTIAL、 を使用した PayloadPart によって終了された場合PayloadPart.CompletionState = COMPLETE、SageMaker AI はそれらを WebSocket フラグメント化メッセージ RFC6455-Section-5.4: フラグメント化に変換します。 -
を使用した最初の PayloadPart は、FIN ビットがクリアされた WebSocket データフレームに変換
PayloadPart.CompletionState = PARTIALされます。 -
を使用した後続の PayloadParts は、FIN ビットクリアの WebSocket 継続フレームに変換
PayloadPart.CompletionState = PARTIALされます。 -
を使用した最終的な PayloadPart は、FIN ビットが設定された WebSocket 継続フレームに変換
PayloadPart.CompletionState = COMPLETEされます。
-
-
SageMaker AI は入力 PayloadPart からバイナリチャンクをエンコードまたはデコードせず、バイトはそのままモデルコンテナに渡されます。
-
SageMaker AI は、複数の入力 PayloadParts を 1 つの BinaryDataFrame に結合しません。
-
SageMaker AI は、1 つの入力 PayloadPart を複数の BinaryDataFrames にチャンクしません。
例: フラグメント化されたメッセージフロー
Client sends: PayloadPart 1: {Bytes: "Hello ", DataType: "UTF8", CompletionState: "PARTIAL"} PayloadPart 2: {Bytes: "World", DataType: "UTF8", CompletionState: "COMPLETE"} Container receives: Frame 1: Text Data Frame with "Hello " (FIN=0) Frame 2: Continuation Frame with "World" (FIN=1)
3.2。コントロールフレーム
データフレームに加えて、SageMaker AI はコントロールフレームをモデルコンテナ (RFC6455-Section-5.5
-
Close Frame: 何らかの理由で接続が閉じられた場合、SageMaker AI は Close Frame (RFC6455-Section-5.5.1
) をモデルコンテナに送信することがあります。 -
Ping フレーム: SageMaker AI は 60 秒に 1 回 Ping フレーム (RFC6455-Section-5.5.2
) を送信します。モデルコンテナは Pong フレームで応答する必要があります。連続 5 回の Ping で Pong Frame (RFC6455-Section-5.5.3 ) を受信しない場合、接続は SageMaker AI によって閉じられます。 -
Pong Frame: SageMaker AI は、Pong Frames を持つモデルコンテナから Ping Frames に応答します。
4. レスポンスストリームの処理
出力は、一連の PayloadParts、ModelStreamErrors、または InternalStreamFailures としてストリーミングされます。
{ "PayloadPart": { "Bytes": <Blob>, "DataType": <String: UTF8 | BINARY>, "CompletionState": <String: PARTIAL | COMPLETE>, }, "ModelStreamError": { "ErrorCode": <String>, "Message": <String> }, "InternalStreamFailure": { "Message": <String> } }
4.1。データフレーム
SageMaker AI は、モデルコンテナから受信したデータフレームを出力 PayloadParts に変換します。
-
モデルコンテナから WebSocket Text Data Frame を受信すると、SageMaker AI は Text Data Frame から raw バイトを取得し、それをレスポンス PayloadPart にラップし、同時に を設定します
PayloadPart.DataType = UTF8。 -
モデルコンテナから WebSocket バイナリデータフレームを受信すると、SageMaker AI はデータフレームからのバイトをレスポンス PayloadPart に直接ラップし、同時に を設定します
PayloadPart.DataType = BINARY。 -
RFC6455-Section-5.4: Fragmentation
で定義されているフラグメント化されたメッセージの場合: -
FIN ビットがクリアされた最初のデータフレームは、 の PayloadPart に変換されます
PayloadPart.CompletionState = PARTIAL。 -
FIN ビットがクリアされた後続の継続フレームは、 で PayloadParts に変換されます
PayloadPart.CompletionState = PARTIAL。 -
FIN ビットが設定された最後の継続フレームは、 を使用して PayloadPart に変換されます
PayloadPart.CompletionState = COMPLETE。
-
-
SageMaker AI はモデルコンテナから受信したバイトをエンコードまたはデコードせず、バイトはそのままモデルコンテナに渡されます。
-
SageMaker AI は、モデルコンテナから受信した複数のデータフレームを 1 つのレスポンス PayloadPart に結合しません。
-
SageMaker AI は、モデルコンテナから受信したデータフレームを複数のレスポンス PayloadParts にチャンクしません。
例: ストリーミングレスポンスフロー
Container sends: Frame 1: Text Data Frame with "Generating" (FIN=0) Frame 2: Continuation Frame with " response..." (FIN=1) Client receives: PayloadPart 1: {Bytes: "Generating", DataType: "UTF8", CompletionState: "PARTIAL"} PayloadPart 2: {Bytes: " response...", DataType: "UTF8", CompletionState: "COMPLETE"}
4.2。コントロールフレーム
SageMaker AI は、モデルコンテナから次のコントロールフレームに応答します。
-
モデルコンテナからクローズフレーム (RFC6455-Section-5.5.1
) を受信すると、SageMaker AI はステータスコード (RFC6455-Section-7.4 ) と失敗メッセージを ModelStreamError にラップし、エンドユーザーにストリーミングします。 -
モデルコンテナから Ping フレーム (RFC6455-Section-5.5.2
) を受信すると、SageMaker AI は Pong Frame で応答します。 -
Pong Frame(RFC6455-Section-5.5.3
): Pong Frame が 5 回連続して受信されない場合、接続は SageMaker AI によって閉じられます。