

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

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

DJL Serving 是一款高性能的通用独立模型服务解决方案。它可以获取一个深度学习模型、多个模型或工作流，并通过 HTTP 端点提供它们。

你可以使用其中一个 DJL Serving Dee [p Learning Containers (DLCs)](https://docs.aws.amazon.com/deep-learning-containers/latest/devguide/what-is-dlc.html) 来为你的模型提供服务。 AWS要了解支持的模型类型和框架，请参阅 [DJL 服务 GitHub存储库](https://github.com/deepjavalibrary/djl-serving)。

DJL Serving 提供了许多功能，可协助部署高性能的模型：
+ 易于使用 – DJL Serving 无需任何修改即可为大多数模型提供服务。您可以自带构件，然后用 DJL Serving 来托管。
+ 支持多种设备和加速器 — DJL Serving 支持在 CPUs GPUs、和 AWS Inferentia 上部署模型。
+ 性能 – DJL Serving 在单个 Java 虚拟机 (JVM) 中运行多线程推理以提高吞吐量。
+ 动态批处理 – DJL Serving 支持动态批处理以提高吞吐量。
+ 自动扩缩 – DJL Serving 会根据流量负载自动扩展或缩减工作线程。
+ 多引擎支持 — DJL Serving 可以同时托管使用不同框架（例如 PyTorch 和 TensorFlow）的模型。
+ Ensemble 和工作流程模型 — DJL Serving 支持部署由多个模型组成的复杂工作流程， CPUs 并且可以在上面执行部分工作流程和其他部分。 GPUs工作流中的模型可以利用不同的框架。

以下各节介绍如何在 SageMaker AI 上使用 DJL 服务来设置终端节点。

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

要开始部署，请确保您具备以下先决条件：

1. 确保您有权访问 AWS 账户。设置您的环境，以便 AWS CLI 可以通过 AWS IAM 用户或 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)
   + [亚马逊 3 FullAccess](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 区域替换为您所在的区域。在 “可用 DLCs 的 Dee [p 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>
   ```

现在，您应该有一个自定义容器映像，可用于模型服务。有关自定义容器的更多示例，请参阅[构建 Dee AWS p Learning Containers 自定义镜像](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>

准备好模型工件后，您可以将模型部署到 A SageMaker I 端点。此部分介绍如何使用 DJL Serving 将单个模型部署到端点。如果您要部署多个模型，请跳过此部分并转至 [使用多模型端点通过 DJL Serving 进行部署](#deploy-models-frameworks-djl-mme)。

以下示例向您展示了一种使用 Amaz SageMaker on Python 软件开发工具包创建模型对象的方法。您需要指定以下字段：
+ `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 服务容器遵守 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
            .
            .
            .
```

Amaz SageMaker on Python 软件开发工具包使用该[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 服务中的OutofMemory 处理](https://github.com/deepjavalibrary/djl-serving/blob/master/serving/docs/out_of_memory_management.md)。

利用 DJL Serving 的自动扩缩功能，您可以轻松地确保根据传入流量相应地缩放模型。默认情况下，DJL Serving 会根据可用的硬件（例如 CPU 核心或 GPU 设备）确定模型可以支持的最大工作线程数。您可以为每个模型设置下限和上限，以确保始终可以提供最低流量水平，并且单个模型不会占用全部可用资源。您可在 [serving.properties](https://github.com/deepjavalibrary/djl-serving/blob/master/serving/docs/modes.md#servingproperties) 文件中设置以下属性：
+ `gpu.minWorkers`: 最低工人人数 GPUs。
+ `gpu.maxWorkers`：的最大工作人员人数 GPUs。
+ `cpu.minWorkers`: 最低工人人数 CPUs。
+ `cpu.maxWorkers`：的最大工作人员人数 CPUs。

[有关如何使用 DJL 服务容器在 SageMaker AI 上部署多模型端点的示例，请参阅 end-to-end示例笔记本 multi-model-inference-demo.ipynb。](https://github.com/deepjavalibrary/djl-demo/blob/master/aws/sagemaker/Multi-Model-Inference-Demo.ipynb)