

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

# SageMaker AI マルチモデルエンドポイント用の独自のコンテナを構築する
<a name="build-multi-model-build-container"></a>

独自のコンテナと依存関係をマルチモデルエンドポイントに導入する方法については、以下のセクションを参照してください。

**Topics**
+ [CPU ベースのインスタンスにマルチモデルエンドポイント用の独自の依存関係を持たせる](#build-multi-model-container-cpu)
+ [GPU ベースのインスタンスにマルチモデルエンドポイント用の独自の依存関係を持たせる](#build-multi-model-container-gpu)
+ [SageMaker AI 推論ツールキットを使う](#multi-model-inference-toolkit)
+ [マルチモデルエンドポイント用のカスタムコンテナの規約](mms-container-apis.md)

## CPU ベースのインスタンスにマルチモデルエンドポイント用の独自の依存関係を持たせる
<a name="build-multi-model-container-cpu"></a>

ビルド済みのコンテナイメージがどれもニーズを満たさない場合は、CPU ベースのマルチモデルエンドポイントで使用する独自のコンテナを構築できます。

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

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

また、SageMaker AI によって環境変数がコンテナに挿入されます。

```
SAGEMAKER_MULTI_MODEL=true
```

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

カスタムコンテナにこれらの要件を実装するために、2 つのライブラリが利用できます。
+ [Multi Model Server](https://github.com/awslabs/multi-model-server) は、コンテナにインストールできる機械学習モデルを提供するためのオープンソースフレームワークであり、新しいマルチモデルエンドポイントコンテナ API の要件を満たすフロントエンドを提供します。このライブラリは、1 つのコンテナ内で複数のモデルをホストし、コンテナに対してモデルを動的にロードおよびアンロードするために、マルチモデルエンドポイントに必要になる HTTP フロントエンドおよびモデル管理機能を備え、指定されてロードされたモデルで推論を実行します。また、独自のアルゴリズムを実装できるプラガブルなカスタムバックエンドハンドラをサポートする、プラガブルなバックエンドも提供します。
+ [SageMaker AI Inference Toolkit](https://github.com/aws/sagemaker-inference-toolkit) は、SageMaker AI マルチモデルエンドポイントと互換性のある構成と設定で Multi Model Server をブートストラップするライブラリです。また、シナリオのニーズに応じて、モデルごとのワーカー数などの重要なパフォーマンスパラメータを調整できます。

## GPU ベースのインスタンスにマルチモデルエンドポイント用の独自の依存関係を持たせる
<a name="build-multi-model-container-gpu"></a>

GPU ベースのインスタンスを備えたマルチモデルエンドポイントでの独自のコンテナの持ち込み (BYOC) 機能は、マルチモデルサーバーおよび SageMaker AI Inference Toolkit ライブラリでは現在サポートされていません。

GPU ベースのインスタンスでマルチモデルエンドポイントを作成するには、SageMaker AI がサポートする [NVIDIA Triton 推論サーバー](https://docs.aws.amazon.com/sagemaker/latest/dg/triton.html)と [NVIDIA Triton 推論コンテナ](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#nvidia-triton-inference-containers-sm-support-only)を使用できます。独自の依存関係を持たせるには、SageMaker AI がサポートする [NVIDIA Triton 推論サーバー](https://docs.aws.amazon.com/sagemaker/latest/dg/triton.html)を Docker ファイルのベースイメージとして使用して独自のコンテナを構築できます。

```
FROM 301217895009.dkr.ecr.us-west-2.amazonaws.com/sagemaker-tritonserver:22.07-py3
```

**重要**  
GPU ベースのマルチモデルエンドポイントに使用できるコンテナは、Triton Inference Server を備えたコンテナだけです。

## SageMaker AI 推論ツールキットを使う
<a name="multi-model-inference-toolkit"></a>

**注記**  
SageMaker AI 推論ツールキットは CPU ベースのマルチモデルエンドポイントでのみサポートされます。SageMaker AI 推論ツールキットは現在 GPU ベースのマルチモデルエンドポイントではサポートされていません。

マルチモデルエンドポイントをサポートするビルド済みコンテナは、「[マルチモデルエンドポイントでサポートされるアルゴリズム、フレームワーク、インスタンス](multi-model-support.md)」に記載されています。他のフレームワークやアルゴリズムを使用する場合は、コンテナを構築する必要があります。これを行う最も簡単な方法は、[SageMaker AI 推論ツールキット](https://github.com/aws/sagemaker-inference-toolkit)を使って既存の構築済みコンテナを拡張することです。SageMaker AI 推論ツールキットは、SageMaker AI にデプロイできるエンドポイントを作成するマルチモデルサーバー (MMS) の実装 です。SageMaker AI のマルチモデルエンドポイントをサポートするカスタムコンテナを設定およびデプロイする方法を示すサンプルノートブックについては、[マルチモデルエンドポイント BYOC のサンプルノートブック](https://github.com/awslabs/amazon-sagemaker-examples/tree/master/advanced_functionality/multi_model_bring_your_own)を参照してください。

**注記**  
SageMaker AI 推論ツールキットは Python のモデルハンドラのみをサポートします。他の言語でハンドラを実装する場合は、追加のマルチモデルエンドポイント API を実装する独自のコンテナを構築する必要があります。詳細については、「[マルチモデルエンドポイント用のカスタムコンテナの規約](mms-container-apis.md)」を参照してください。

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

1. モデルハンドラを作成します。MMS は、前処理、モデルからの事前エディションの取得、およびモデルハンドラでの出力処理のための関数を実装する Python ファイルである、モデルハンドラを想定しています。モデルハンドラの例については、サンプルノートブックの [model\$1handler.py](https://github.com/awslabs/amazon-sagemaker-examples/blob/master/advanced_functionality/multi_model_bring_your_own/container/model_handler.py) を参照してください。

1. 推論ツールキットをインポートし、その `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()
   ```

1. `Dockerfile` では、最初のステップからのモデルハンドラをコピーし、前のステップの Python ファイルを `Dockerfile` のエントリポイントとして指定します 。次の行は、サンプルノートブックで使用されている [Dockerfile](https://github.com/awslabs/amazon-sagemaker-examples/blob/master/advanced_functionality/multi_model_bring_your_own/container/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"]
   ```

1. コンテナを構築して登録します。サンプルノートブックの次のシェルスクリプトは、コンテナを構築し、 AWS アカウントの Elastic Container Registry リポジトリにアップロードします。

   ```
   %%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 AI でマルチモデルエンドポイントをデプロイできるようになりました。

**Topics**
+ [CPU ベースのインスタンスにマルチモデルエンドポイント用の独自の依存関係を持たせる](#build-multi-model-container-cpu)
+ [GPU ベースのインスタンスにマルチモデルエンドポイント用の独自の依存関係を持たせる](#build-multi-model-container-gpu)
+ [SageMaker AI 推論ツールキットを使う](#multi-model-inference-toolkit)
+ [マルチモデルエンドポイント用のカスタムコンテナの規約](mms-container-apis.md)