ホスティングサービスでのカスタム推論コードの使用 - Amazon SageMaker AI

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

ホスティングサービスでのカスタム推論コードの使用

このセクションでは、Amazon SageMaker AI がホスティングサービス用の独自の推論コードを実行する Docker コンテナとやり取りする方法について説明します。この情報を使用して、推論コードを書き込み、Docker イメージを作成します。

SageMaker AI が推論イメージを実行する方法

コンテナを実行可能ファイルとして実行するように設定するには、Dockerfile で ENTRYPOINT 命令を使用します。次の点に注意してください:

  • モデル推論の場合、SageMaker AI はコンテナを次のように実行します。

    docker run image serve

    SageMaker 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 オペレーションから SIGTERMSIGKILL のようなシグナルを受信できます。これは要件です。

     

    例えば、 CreateEndpoint API を使用してエンドポイントを作成すると、SageMaker AI はリクエストで指定したエンドポイント設定に必要な ML コンピューティングインスタンスの数をプロビジョニングします。SageMaker AI は、それらのインスタンスで Docker コンテナを実行します。

     

    ( UpdateEndpointWeightsAndCapacities API を呼び出して) エンドポイントをバックアップするインスタンスの数を減らすと、SageMaker AI は終了するインスタンスで Docker コンテナを停止するコマンドを実行します。コマンドは、SIGTERM シグナルを送信し、30 秒後に SIGKILL シグナルを送信します。

     

    エンドポイントを更新すると ( UpdateEndpoint API を呼び出すことで)、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 を参照してください。

     

  • 引数と trainserve引数によって混乱するので、SageMaker AI コンテナのエントリポイントとしてtiniイニシャライザを使用することはできません。

SageMaker AI がモデルアーティファクトをロードする方法

CreateModel API リクエストでは、ModelDataUrl または S3DataSource パラメータを使用して、モデルアーティファクトが保存されている S3 の場所を特定することができます。SageMaker AI は、モデルアーティファクトを S3 の場所から /opt/ml/model ディレクトリにコピーして、推論コードで使用します。コンテナは /opt/ml/model に読み取り専用でアクセスできます。このディレクトリには書き込まないでください。

ModelDataUrl は tar.gz ファイルを指す必要があります。それ以外の場合、SageMaker AI はファイルをダウンロードしません。

SageMaker AI でモデルをトレーニングした場合、モデルアーティファクトは 1 つの圧縮 tar ファイルとして Amazon S3 に保存されます。SageMaker AI の外部でモデルをトレーニングした場合は、この単一の圧縮 tar ファイルを作成し、S3 の場所に保存する必要があります。SageMaker AI は、コンテナが起動する前に、この tar ファイルを /opt/ml/model ディレクトリに解凍します。

大規模なモデルをデプロイする場合は、非圧縮モデルのデプロイ の配置に従うことをお勧めします。

コンテナが推論リクエストに応答する方法

推論を取得するために、クライアントアプリケーションは SageMaker AI エンドポイントに POST リクエストを送信します。SageMaker AI はリクエストをコンテナに渡し、コンテナからクライアントに推論結果を返します。

コンテナが受け取る推論リクエストの詳細については、Amazon SageMaker AI API リファレンス」の以下のアクションを参照してください。

推論コンテナの要件

推論リクエストに応答するには、コンテナが次の要件を満たしている必要があります。

  • SageMaker AI は、 でサポートされているヘッダーを除くすべてのPOSTヘッダーを削除しますInvokeEndpoint。SageMaker AI はヘッダーを追加する場合があります。推論コンテナはこれらの追加ヘッダーを安全に無視できる必要があります。

  • 推論リクエストを受信するには、コンテナにポート 8080 でリッスンするウェブサーバーが必要であり、/invocations および /ping エンドポイントへの POST リクエストを受け入れる必要があります。

  • 顧客のモデルコンテナは、250 ミリ秒以内にソケット接続リクエストを受け入れる必要があります。

  • 顧客のモデルコンテナは、60 秒以内にリクエストに応答する必要があります。モデル自体は、/invocations に応答するまで 60 秒の最大処理時間をかけることができます。モデルの処理時間が 50 ~ 60 秒かかる場合は、SDK ソケットタイムアウトを 70 秒に設定する必要があります。

例 呼び出し関数

以下の例は、コンテナ内のコードで推論リクエストを処理する方法を示しています。これらの例は、InvokeEndpoint アクションを使用してクライアントアプリケーションが送信するリクエストを処理します。

FastAPI

FastAPI は Python を使用して API を構築するためのウェブフレームワークです。

from fastapi import FastAPI, status, Request, Response . . . app = FastAPI() . . . @app.post('/invocations') async def invocations(request: Request): # model() is a hypothetical function that gets the inference output: model_resp = await model(Request) response = Response( content=model_resp, status_code=status.HTTP_200_OK, media_type="text/plain", ) return response . . .

この例では、 invocations関数は SageMaker AI が/invocationsエンドポイントに送信する推論リクエストを処理します。

Flask

Flask は、Python を使用してウェブアプリケーションを開発するためのフレームワークです。

import flask . . . app = flask.Flask(__name__) . . . @app.route('/invocations', methods=["POST"]) def invoke(request): # model() is a hypothetical function that gets the inference output: resp_body = model(request) return flask.Response(resp_body, mimetype='text/plain')

この例では、 invoke関数は SageMaker AI が/invocationsエンドポイントに送信する推論リクエストを処理します。

例 ストリーミングリクエストの呼び出し関数

以下の例は、推論コンテナ内のコードで推論リクエストを処理する方法を示しています。これらの例は、InvokeEndpointWithResponseStream アクションを使用してクライアントアプリケーションが送信するリクエストを処理します。

コンテナがストリーミング推論リクエストを処理すると、モデルが推論を生成する際に、モデルの推論は一連のパーツとして段階的に返されます。レスポンスが利用可能になると、クライアントアプリケーションはすぐに受信し始めます。クライアントアプリケーションは、モデルがレスポンス全体を生成するのを待つ必要はありません。ストリーミングを実装し、チャットボット、仮想アシスタント、ミュージックジェネレーターなどの高速でインタラクティブな体験をサポートできます。

FastAPI

FastAPI は Python を使用して API を構築するためのウェブフレームワークです。

from starlette.responses import StreamingResponse from fastapi import FastAPI, status, Request . . . app = FastAPI() . . . @app.post('/invocations') async def invocations(request: Request): # Streams inference response using HTTP chunked encoding async def generate(): # model() is a hypothetical function that gets the inference output: yield await model(Request) yield "\n" response = StreamingResponse( content=generate(), status_code=status.HTTP_200_OK, media_type="text/plain", ) return response . . .

この例では、 invocations関数は SageMaker AI が/invocationsエンドポイントに送信する推論リクエストを処理します。この例ではレスポンスをストリーミングするために、Starlette フレームワークの StreamingResponse クラスを使用しています。

Flask

Flask は、Python を使用してウェブアプリケーションを開発するためのフレームワークです。

import flask . . . app = flask.Flask(__name__) . . . @app.route('/invocations', methods=["POST"]) def invocations(request): # Streams inference response using HTTP chunked encoding def generate(): # model() is a hypothetical function that gets the inference output: yield model(request) yield "\n" return flask.Response( flask.stream_with_context(generate()), mimetype='text/plain') . . .

この例では、 invocations関数は SageMaker AI が/invocationsエンドポイントに送信する推論リクエストを処理します。この例ではレスポンスをストリーミングするために、Flask フレームワークの flask.stream_with_context 関数を使用しています。

コンテナがヘルスチェック (Ping) リクエストに応答する方法

SageMaker AI は、次の状況で新しい推論コンテナを起動します。

  • CreateEndpointUpdateEndpoint、および UpdateEndpointWeightsAndCapacities API 呼び出しへの応答

  • セキュリティパッチ

  • 異常のあるインスタンスの置き換え

コンテナの起動直後に、SageMaker AI は/pingエンドポイントへの定期的な GET リクエストの送信を開始します。

コンテナの最も単純な要件は、HTTP 200 のステータスコードと空の本文で応答することです。これは、コンテナが/invocationsエンドポイントで推論リクエストを受け入れる準備ができていることを SageMaker AI に示しています。

コンテナがスタートアップ後 8 分間に、常に 200 秒で応答しヘルスチェックを通過しない場合、新しいインスタンスの起動は失敗します。これにより CreateEndpoint は失敗し、エンドポイントは障害状態のままになります。UpdateEndpoint によって要求された更新は完了せず、セキュリティパッチは適用されず、異常のあるインスタンスは置き換えられません。

コンテナが静的な 200 を返す最小限のバーがありますが、コンテナ開発者はこの機能を使用してより深いチェックを実行できます。/ping 試行のリクエストのタイムアウトは 2 秒です。