

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 DJL Serving 部署模型
<a name="deploy-models-frameworks-djl-serving"></a>

DJL Serving 是一種高效能通用獨立模型服務解決方案。它需要深度學習模型、數個模型或工作流程，並透過 HTTP 端點提供這些模型。

您可以使用其中一個 DJL Serving [Deep Learning Containers (DLCs)](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 Service 提供許多功能，可協助您以高效能部署模型：
+ 易於使用–DJL Serving 可以為大多數模型提供服務，而無需任何修改。您自帶模型成品，DJL Serving 可以進行託管。
+ 多個裝置和加速器支援 – DJL Serving 支援在 CPUs、GPUs 和 AWS Inferentia 上部署模型。
+ 效能–DJL Serving 會在單一 Java 虛擬機器 (JVM) 執行多執行緒推斷，以提高輸送量。
+ 動態批次處理–DJL Serving 支援動態批次處理，以增加輸送量。
+ 自動擴展 – DJL Service 會根據流量負載自動擴展或縮減工作者。
+ 多引擎支援–DJL Serving 可以同時使用不同的架構託管模型 (例如，PyTorch 及 TensorFlow)。
+ 整合與工作流程模型–DJL Service 支援部署由多個模型組成的複雜工作流程，並且可在 CPU 與 GPU 的其他部分執行部分工作流程。工作流程的模型可以利用不同的架構。

下列各節描述如何在 SageMaker AI 使用 DJL Serving 設定端點。

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

首先，請務必確認您已進行下列事前準備：

1. 確定您能夠存取 AWS 帳戶。設定您的環境，讓 AWS CLI 可以透過 IAM AWS 使用者或 IAM 角色存取您的帳戶。我們建議使用 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 可在 [Available Deep Learning Containers 映像檔](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 使用者指南*中的[將 Amazon ECR 與 AWS CLI結合使用](https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html)，以瞭解如何建立儲存庫的說明。

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

1. 將 Docker 映像檔推送至您的 Amazon ECR 儲存庫。

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

您現在應該擁有可用於模型服務的自訂容器映像檔。如需自訂容器的更多範例，請參閱[建置 AWS 深度學習容器自訂映像](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 會使用其中一個預設處理常式。

以下是 `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 映像檔，也可以從 Amazon ECR 儲存庫指定自訂 Docker 映像檔 (如果您按照 [自訂您的容器](#deploy-models-frameworks-djl-byoc) 的說明進行操作)。
+ `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 Service 的自動擴展功能可讓您輕鬆確保模型能夠針對傳入流量進行適當擴展。根據預設，DJL Serving 會根據可用的硬體 (例如 CPU 核心或 GPU 裝置) 來決定模型可支援的最大工作者數量。您可以為每個模型設定下限和上限，以確保始終可以提供最低流量層級，而且單一模型不會消耗所有可用資源。您可以在 [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 Serving 容器在 SageMaker AI 部署多模型端點的端對端範例，請參閱範例筆記本 [Multi-Model-Inference-Demo.ipynb](https://github.com/deepjavalibrary/djl-demo/blob/master/aws/sagemaker/Multi-Model-Inference-Demo.ipynb)。