

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

# DJL サービングを使用したモデルのデプロイ
<a name="deploy-models-frameworks-djl-serving"></a>

DJL Serving は、高性能のユニバーサルスタンドアロンモデル提供ソリューションです。深層学習モデル、複数のモデル、またはワークフローをとり、HTTP エンドポイントを介して利用できるようにします。

DJL Serving [深層学習コンテナ (DLC)](https://docs.aws.amazon.com/deep-learning-containers/latest/devguide/what-is-dlc.html) のいずれかを使用して、 AWS上でモデルを提供できます。サポートされているモデルタイプとフレームワークについては、「[DJL Serving GitHub リポジトリ](https://github.com/deepjavalibrary/djl-serving)」を参照してください。

DJL Serving は、モデルを高パフォーマンスでデプロイするのに役立つ多くの特徴量を提供します。
+ 使いやすさ — DJL Serving はほとんどのモデルを変更せずに使用できます。モデルのアーティファクトを持ち込むと、DJL Serving がそれらをホストできます。
+ 複数のデバイスとアクセラレーターのサポート – DJL Serving は CPUs、GPUs、および AWS Inferentia へのモデルのデプロイをサポートしています。
+ パフォーマンス — DJL Serving は 1 台の Java 仮想マシン (JVM) でマルチスレッド推論を実行し、スループットを向上させます。
+ 動的バッチ処理 — DJL Serving は動的バッチ処理をサポートし、スループットを向上させます。
+ 自動スケーリング — DJL Serving は、トラフィックの負荷に応じてワーカーを自動的にスケールアップまたはスケールダウンします。
+ マルチエンジンサポート — DJL Serving は、異なるフレームワーク (PyTorch や TensorFlow など) を使用してモデルを同時にホストできます。
+ アンサンブルモデルとワークフローモデル — DJL Serving は、複数のモデルで構成される複雑なワークフローのデプロイをサポートし、ワークフローの一部を CPU で、他の部分を GPU で実行できます。ワークフロー内のモデルは、さまざまなフレームワークを活用できます。

以下のセクションでは、SageMaker AI で DJL Serving を使用してエンドポイントを設定する方法について説明します。

## 開始方法
<a name="deploy-models-frameworks-djl-prereqs"></a>

開始するには、次の前提条件が整っていることを確認してください。

1.  AWS アカウントにアクセスできることを確認します。が IAM ユーザーまたは IAM AWS ロールを介してアカウント AWS CLI にアクセスできるように環境を設定します。IAM ロールの使用をお勧めします。個人アカウントでテストする目的で、以下の管理アクセス許可ポリシーを IAM ロールにアタッチできます。
   + [AmazonEC2ContainerRegistryFullAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryFullAccess)
   + [AmazonEC2FullAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AmazonEC2FullAccess)
   + [AmazonSageMakerFullAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AmazonSageMakerFullAccess)
   + [AmazonS3FullAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AmazonS3FullAccess)

1. システムに [Docker](https://docs.docker.com/get-docker/) クライアントがセットアップされていることを確認します。

1. Amazon Elastic Container Registry にログインし、以下の環境変数を設定します。

   ```
   export ACCOUNT_ID={{<your_account_id>}}
   export REGION={{<your_region>}}
   aws ecr get-login-password --region $REGION | docker login --username AWS --password-stdin $ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com
   ```

1. Docker イメージをプルします。

   ```
   docker pull 763104351884.dkr.ecr.us-west-2.amazonaws.com/djl-inference:0.22.1-deepspeed0.9.2-cu118
   ```

   使用可能なすべての DJL Serving コンテナイメージについては、「[大規模モデル推論コンテナ](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#large-model-inference-containers)」と「[DJL Serving CPU 推論コンテナ](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#djl-cpu-full-inference-containers)」を参照してください。上記のリンクのテーブルからイメージを選択するときは、URL 列の例の AWS リージョンを、現在使用しているリージョンに置き換えます。DLC は、「[使用可能な深層学習コンテナイメージ](https://github.com/aws/deep-learning-containers/blob/master/available_images.md)」ページの上部にある表に記載されているリージョンで使用できます。

## コンテナのカスタマイズ
<a name="deploy-models-frameworks-djl-byoc"></a>

ベース DLC イメージにパッケージを追加して、コンテナをカスタマイズできます。`763104351884.dkr.ecr.us-west-2.amazonaws.com/djl-inference:0.22.1-deepspeed0.9.2-cu118` Docker イメージにパッケージを追加したいとします。目的のイメージをベースイメージとして Dockerfile を作成し、必要なパッケージを追加して、そのイメージを Amazon ECR にプッシュする必要があります。

パッケージを作成するには、次のステップを実行します。

1. ベースイメージの Dockerfile に、目的のライブラリまたはパッケージを実行する手順を指定します。

   ```
   FROM 763104351884.dkr.ecr.us-west-2.amazonaws.com/djl-inference:0.22.1-deepspeed0.9.2-cu118
                           
   ## add custom packages/libraries
   RUN git clone https://github.com/awslabs/amazon-sagemaker-examples
   ```

1. Dockerfile から Docker イメージをビルドします。Amazon ECR リポジトリ、ベースイメージの名前、およびイメージのタグを指定します。Amazon ECR リポジトリがない場合は、「*Amazon ECR ユーザーガイド*」の「[AWS CLIで Amazon ECR を使用する](https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html)」を参照して、リポジトリを作成する方法を確認してください。

   ```
   docker build -f Dockerfile -t <registry>/<image_name>:<image_tag>
   ```

1. Amazon ECR リポジトリに Docker イメージをプッシュします

   ```
   docker push $ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com/<image_name>:<image_tag>
   ```

これで、モデル提供に使用できるカスタマイズされたコンテナイメージがあるはずです。コンテナをカスタマイズするその他の例については、「[Building AWS Deep Learning Containers Custom Images](https://github.com/aws/deep-learning-containers/blob/master/custom_images.md)」を参照してください。

## モデルのアーティファクトの準備
<a name="deploy-models-frameworks-djl-artifacts"></a>

SageMaker AI にモデルをデプロイする前に、モデルアーティファクトを `.tar.gz` ファイルにパッケージ化する必要があります。DJL Serving はアーカイブ内の以下のアーティファクトを受け入れます。
+ モデルチェックポイント: モデルの重みを格納するファイル。
+ `serving.properties`: モデルごとに追加できる設定ファイル。モデルファイルと同じディレクトリに `serving.properties` を置きます。
+ `model.py`: 推論ハンドラーコード。これは Python モードを使用する場合にのみ適用されます。`model.py` を指定しない場合、djl-serving はデフォルトハンドラーの 1 つを使用します。

以下は、`model.tar.gz` 構造の例です。

```
 - model_root_dir # root directory
    - serving.properties            
    - model.py # your custom handler file for Python, if you choose not to use the default handlers provided by DJL Serving
    - model binary files # used for Java mode, or if you don't want to use option.model_id and option.s3_url for Python mode
```

DJL Serving は、DJL または Python エンジンを搭載した Java エンジンをサポートします。前述のアーティファクトのすべてが必須というわけではありません。必要なアーティファクトは、選択するモードによって異なります。例えば、Python モードでは、`serving.properties` ファイル内で `option.model_id` を指定するだけでよく、LMI コンテナ内のモデルチェックポイントを指定する必要はありません。Java モードでは、モデルチェックポイントをパッケージ化する必要があります。`serving.properties` の設定とさまざまなエンジンの操作方法の詳細については、「[DJL Serving 操作モード](https://github.com/deepjavalibrary/djl-serving/blob/master/serving/docs/modes.md)」を参照してください。

## 単一モデルのエンドポイントを使用した DJL Serving でのデプロイ
<a name="deploy-models-frameworks-djl-single-model"></a>

モデルアーティファクトを準備したら、モデルを SageMaker AI エンドポイントにデプロイできます。このセクションでは、DJL Serving を使用して、単一モデルを、エンドポイントにデプロイする方法について説明します。複数のモデルをデプロイする場合は、このセクションをスキップして 「[マルチモデルのエンドポイントを使用して DJL Serving でデプロイする](#deploy-models-frameworks-djl-mme)」に進んでください。

次の例は、Amazon SageMaker Python SDK を使用してモデルオブジェクトを作成する方法を示します。以下のフィールドを指定する必要があります。
+ `image_uri`: この例で示すように、ベースの DJL Serving イメージの 1 つを取得することも、「[コンテナのカスタマイズ](#deploy-models-frameworks-djl-byoc)」の手順に従って Amazon ECR リポジトリからカスタム Docker イメージを指定することもできます。
+ `model_s3_url`: これは `.tar.gz` ファイルを指す Amazon S3 URI である必要があります。
+ `model_name`: モデルオブジェクトの名前を指定します。

```
import boto3
 import sagemaker
from sagemaker.model import Model
from sagemaker import image_uris, get_execution_role

aws_region = "aws-region"
sagemaker_session = sagemaker.Session(boto_session=boto3.Session(region_name=aws_region))
role = get_execution_role()

def create_model(model_name, model_s3_url):
    # Get the DJL DeepSpeed image uri
    image_uri = image_uris.retrieve(
        framework="djl-deepspeed",
        region=sagemaker_session.boto_session.region_name,
        version="0.20.0"
    )
    model = Model(
        image_uri=image_uri,
        model_data=model_s3_url,
        role=role,
        name=model_name,
        sagemaker_session=sagemaker_session,
    )
    return model
```

## マルチモデルのエンドポイントを使用して DJL Serving でデプロイする
<a name="deploy-models-frameworks-djl-mme"></a>

複数のモデルをエンドポイントにデプロイする場合、SageMaker AI はマルチモデルエンドポイントを提供しており、これは、多数のモデルをデプロイするためのスケーラブルで費用対効果の高いソリューションです。DJL Serving は、複数のモデルを同時にロードし、各モデルで同時に推論を実行することもサポートしています。DJL Serving コンテナは SageMaker AI マルチモデルエンドポイント契約に準拠しており、マルチモデルエンドポイントのデプロイに使用できます。

個々のモデルアーティファクトは、前のセクション「[モデルのアーティファクトの準備](#deploy-models-frameworks-djl-artifacts)」で説明したのと同じ方法でパッケージ化する必要があります。モデル固有の設定を `serving.properties` ファイルに、モデル固有の推論ハンドラーコードを `model.py` に設定できます。マルチモデルエンドポイントの場合、モデルは次のように配置する必要があります。

```
 root_dir
        |-- model_1.tar.gz
        |-- model_2.tar.gz
        |-- model_3.tar.gz
            .
            .
            .
```

Amazon SageMaker Python SDK は、[MultiDataModel](https://sagemaker.readthedocs.io/en/stable/api/inference/multi_data_model.html) オブジェクトを使用してマルチモデルエンドポイントをインスタンス化します。ルートディレクトリの Amazon S3 URI は、`model_data_prefix` 引数として `MultiDataModel` コンストラクターに渡す必要があります。

DJL Serving には、モデルのメモリ要件を管理するための複数の設定パラメータ (`required_memory_mb` や `reserved_memory_mb` など) も用意されており、[serving.properties](https://github.com/deepjavalibrary/djl-serving/blob/master/serving/docs/modes.md#servingproperties) ファイルでモデルごとに設定できます。これらのパラメータは、メモリ不足エラーをより適切に処理するのに役立ちます。設定可能なすべてのパラメータについては、「[djl-serving での OutofMemory 処理](https://github.com/deepjavalibrary/djl-serving/blob/master/serving/docs/out_of_memory_management.md)」を参照してください。

DJL Serving の自動スケーリング機能により、受信トラフィックに合わせてモデルが適切にスケールされることを簡単に確認できます。デフォルトでは、DJL Serving は、使用可能なハードウェア (CPU コアや GPU デバイスなど) に基づいて、サポート可能なモデルの最大ワーカー数を決定します。モデルごとに下限と上限を設定して、常にトラフィックの最小レベルを処理できるようにし、1 つのモデルが使用可能なリソースをすべて消費しないようにできます。[serving.properties](https://github.com/deepjavalibrary/djl-serving/blob/master/serving/docs/modes.md#servingproperties) ファイルでは、以下のプロパティを設定できます。
+ `gpu.minWorkers`: GPU の最小ワーカー数。
+ `gpu.maxWorkers`: GPU の最大ワーカー数。
+ `cpu.minWorkers`: CPU の最小ワーカー数。
+ `cpu.maxWorkers`: CPU の最大ワーカー数。

DJL サービングコンテナを使用して SageMaker AI にマルチモデルエンドポイントをデプロイする方法のエンドツーエンドの例については、サンプルノートブック「[Multi-model-Inference-Demo.ipynb](https://github.com/deepjavalibrary/djl-demo/blob/master/aws/sagemaker/Multi-Model-Inference-Demo.ipynb)」を参照してください。