マルチモデルサーバーで独自のコンテナを構築する - Amazon SageMaker

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

マルチモデルサーバーで独自のコンテナを構築する

Amazon SageMaker にデプロイされたカスタム Elastic Container Registry (ECR) イメージは、ホスティングサービスでの独自の推論コードの使用は、SageMaker が独自の推論コードを実行する Docker コンテナとやり取りする方法を管理します。コンテナが複数のモデルを同時にロードして処理できるようにするには、追加の API と動作に従う必要があります。この追加の規約には、モデルをロード、一覧表示、取得、アンロードするための新しい API と、モデルを呼び出すための別の API が含まれます。エラーシナリオに対して API が従う必要のあるさまざまな動作も含まれます。コンテナが追加の要件に準拠していることを示すために、以下のコマンドを Docker ファイルに追加できます。

LABEL com.amazonaws.sagemaker.capabilities.multi-models=true

また、SageMaker は、コンテナに環境変数を挿入します。

SAGEMAKER_MULTI_MODEL=true

シリアル推論パイプラインのマルチモデルエンドポイントを作成する場合、Docker ファイルには、マルチモデルとシリアル推論パイプラインの両方の必須ラベルが必要です。シリアル情報パイプラインの詳細については、「Runリアルタイム予測w推論パイプライン」を参照してください。

カスタムコンテナにこれらの要件を実装するために、2 つのライブラリが利用できます。

  • Multi Model Server は、コンテナにインストールできる機械学習モデルを提供するためのオープンソースフレームワークであり、新しいマルチモデルエンドポイントコンテナ API の要件を満たすフロントエンドを提供します。このライブラリは、1 つのコンテナ内で複数のモデルをホストし、コンテナに対してモデルを動的にロードおよびアンロードするために、マルチモデルエンドポイントに必要になる HTTP フロントエンドおよびモデル管理機能を備え、指定されてロードされたモデルで推論を実行します。また、独自のアルゴリズムを実装できるプラガブルなカスタムバックエンドハンドラをサポートする、プラガブルなバックエンドも提供します。

  • SageMaker 推論ツールキットは、SageMaker マルチモデルエンドポイントと互換性のある構成と設定で Multi Model Server をブートストラップするライブラリです。また、シナリオのニーズに応じて、モデルごとのワーカー数などの重要なパフォーマンスパラメータを調整できます。

SageMaker 推論ツールキットの使用

現在、マルチモデルエンドポイントをサポートする構築済みコンテナは、MXNet 推論コンテナと PyTorch 推論コンテナだけです。他のフレームワークやアルゴリズムを使用する場合は、コンテナを構築する必要があります。これを行う最も簡単な方法は、使用することです。SageMaker 推論ツールキット既存の構築済みコンテナを拡張します。SageMaker 推論ツールキットは、SageMaker にデプロイできるエンドポイントを作成するマルチモデルサーバー (MMS) の実装です。SageMaker でマルチモデルエンドポイントをサポートするカスタムコンテナを設定およびデプロイする方法を示すサンプルノートブックについては、マルチモデルエンドポイントのBYOCサンプルノートブック

注記

SageMaker 推論ツールキットは Python モデルハンドラのみをサポートします。他の言語でハンドラを実装する場合は、追加のマルチモデルエンドポイント API を実装する独自のコンテナを構築する必要があります。詳細については、「複数のモデルを提供するカスタムコンテナの契約」を参照してください。

SageMaker 推論ツールキットを使用してコンテナを拡張するには

  1. モデルハンドラを作成します。MMS は、前処理、モデルからの事前エディションの取得、およびモデルハンドラでの出力処理のための関数を実装する Python ファイルである、モデルハンドラを想定しています。モデルハンドラの例については、サンプルノートブックの model_handler.py を参照してください。

  2. 推論ツールキットをインポートし、その model_server.start_model_server 関数を使用して MMS を起動します。次の例は、サンプルノートブックの dockerd-entrypoint.py ファイルからのものです。model_server.start_model_server を呼び出すと、前のステップで説明したモデルハンドラが 渡されます。

    import subprocess import sys import shlex import os from retrying import retry from subprocess import CalledProcessError from sagemaker_inference import model_server def _retry_if_error(exception): return isinstance(exception, CalledProcessError or OSError) @retry(stop_max_delay=1000 * 50, retry_on_exception=_retry_if_error) def _start_mms(): # by default the number of workers per model is 1, but we can configure it through the # environment variable below if desired. # os.environ['SAGEMAKER_MODEL_SERVER_WORKERS'] = '2' model_server.start_model_server(handler_service='/home/model-server/model_handler.py:handle') def main(): if sys.argv[1] == 'serve': _start_mms() else: subprocess.check_call(shlex.split(' '.join(sys.argv[1:]))) # prevent docker exit subprocess.call(['tail', '-f', '/dev/null']) main()
  3. Dockerfile では、最初のステップからのモデルハンドラをコピーし、前のステップの Python ファイルを Dockerfile のエントリポイントとして指定します 。次の行は、サンプルノートブックで使用されている Dockerfile からのものです。

    # Copy the default custom service file to handle incoming data and inference requests COPY model_handler.py /home/model-server/model_handler.py # Define an entrypoint script for the docker image ENTRYPOINT ["python", "/usr/local/bin/dockerd-entrypoint.py"]
  4. コンテナを構築して登録します。サンプルノートブックの次のシェルスクリプトは、コンテナを構築し、アカウントの Amazon Elastic コンテナレジストリリポジトリにアップロードします。AWSアカウント:

    %%sh # The name of our algorithm algorithm_name=demo-sagemaker-multimodel cd container account=$(aws sts get-caller-identity --query Account --output text) # Get the region defined in the current configuration (default to us-west-2 if none defined) region=$(aws configure get region) region=${region:-us-west-2} fullname="${account}.dkr.ecr.${region}.amazonaws.com/${algorithm_name}:latest" # If the repository doesn't exist in ECR, create it. aws ecr describe-repositories --repository-names "${algorithm_name}" > /dev/null 2>&1 if [ $? -ne 0 ] then aws ecr create-repository --repository-name "${algorithm_name}" > /dev/null fi # Get the login command from ECR and execute it directly $(aws ecr get-login --region ${region} --no-include-email) # Build the docker image locally with the image name and then push it to ECR # with the full name. docker build -q -t ${algorithm_name} . docker tag ${algorithm_name} ${fullname} docker push ${fullname}

これで、このコンテナを使用して SageMaker でマルチモデルエンドポイントをデプロイできるようになりました。