ホスティングサービスを使用したカスタム推論コード - Amazon SageMaker

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

ホスティングサービスを使用したカスタム推論コード

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

推論イメージ SageMaker の実行方法

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

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

    docker run image serve

    SageMaker は、イメージ名の後に引serve数を指定することで、コンテナ内のデフォルトのCMDステートメントをオーバーライドします。serve 引数は、Dockerfile の CMD コマンドで指定した引数よりも優先されます。

     

  • SageMaker は、すべてのコンテナがルートユーザーで実行されることを期待します。ルートユーザーのみを使用するようにコンテナを作成します。がコンテナ SageMaker を実行すると、ルートレベルのアクセス権限を持たないユーザーがアクセス許可の問題を引き起こす可能性があります。

     

  • exec 命令の ENTRYPOINT フォームを使用することをお勧めします。

    ENTRYPOINT ["executable", "param1", "param2"]

    例:

    ENTRYPOINT ["python", "k_means_inference.py"]

    exec 命令の ENTRYPOINT フォームは、/bin/sh の子としてではなく、直接実行ファイルを開始します。これにより、 オペレーションSIGKILLから SageMaker API SIGTERMなどのシグナルを受信できます。これは必須です。

     

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

     

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

     

    エンドポイントを更新すると ( UpdateEndpoint を呼び出すことでAPI)、 は別の ML コンピューティングインスタンスのセット SageMaker を起動し、推論コードを含む Docker コンテナを実行します。次に、前の Docker コンテナを停止するコマンドを実行します。Docker コンテナを停止するために、コマンドは、SIGTERM シグナルを送信し、30 秒後に SIGKILL シグナルを送信します。

     

  • SageMaker は、CreateModelリクエストで指定したコンテナ定義を使用して、次のようにコンテナの環境変数とDNSホスト名を設定します。

     

    • ContainerDefinition.Environment string-to-string マップを使用して環境変数を設定します。

    • を使用してDNSホスト名を設定しますContainerDefinition.ContainerHostname

       

  • モデル推論にGPUデバイスを使用する場合は (CreateEndpointConfigリクエストで GPUベースの ML コンピューティングインスタンスを指定して)、コンテナにnvidia-docker互換性があることを確認してください。NVIDIA ドライバーをイメージにバンドルしないでください。の詳細についてはnvidia-dockerNVIDIA/nvidia-docker を参照してください。

     

  • tini 初期化子は、 train および 引serve数によって混乱するため、コンテナの SageMakerエントリポイントとして使用することはできません。

モデルアーティファクトの SageMaker ロード方法

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

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

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

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

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

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

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

推論コンテナの要件

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

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

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

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

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

例 呼び出し関数

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

FastAPI

FastAPI は、Python APIsで構築するためのウェブフレームワークです。

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関数は が/invocationsエンドポイント SageMaker に送信する推論リクエストを処理します。

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関数は が/invocationsエンドポイント SageMaker に送信する推論リクエストを処理します。

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

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

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

FastAPI

FastAPI は、Python APIsで構築するためのウェブフレームワークです。

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

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

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

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

  • セキュリティパッチ

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

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

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

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

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