使用 DJL Serving 部署模型 - 亚马逊 SageMaker AI
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

使用 DJL Serving 部署模型

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

你可以使用其中一个 DJL Serving Dee p Learning Containers (DLCs) 来为你的模型提供服务。 Amazon要了解支持的模型类型和框架,请参阅 DJL 服务 GitHub存储库

DJL Serving 提供了许多功能,可协助部署高性能的模型:

  • 易于使用 – DJL Serving 无需任何修改即可为大多数模型提供服务。您可以自带构件,然后用 DJL Serving 来托管。

  • 支持多种设备和加速器 — DJL Serving 支持在 CPUs GPUs、和 Amazon Inferentia 上部署模型。

  • 性能 – DJL Serving 在单个 Java 虚拟机 (JVM) 中运行多线程推理以提高吞吐量。

  • 动态批处理 – DJL Serving 支持动态批处理以提高吞吐量。

  • 自动扩缩 – DJL Serving 会根据流量负载自动扩展或缩减工作线程。

  • 多引擎支持 — DJL Serving 可以同时托管使用不同框架(例如 PyTorch 和 TensorFlow)的模型。

  • Ensemble 和工作流程模型 — DJL Serving 支持部署由多个模型组成的复杂工作流程, CPUs 并且可以在上面执行部分工作流程和其他部分。 GPUs工作流中的模型可以利用不同的框架。

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

入门

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

  1. 确保您有权访问 Amazon 账户。设置您的环境,以便 Amazon CLI 可以通过 Amazon IAM 用户或 IAM 角色访问您的账户。我们建议使用 IAM 角色。为了在您的个人账户中进行测试,您可以将以下托管权限策略附加到 IAM 角色:

  2. 确保在您的系统上设置了 docker 客户端。

  3. 登录 Amazon Elastic Container Registry 并设置以下环境变量:

    export ACCOUNT_ID=<your_account_id> export REGION=<your_region> aws ecr get-login-password --region $REGION | docker login --username Amazon --password-stdin $ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com
  4. 拉取 Docker 映像。

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

    有关所有可用 DJL Serving 容器映像的信息,请参阅大型模型推理容器DJL Serving CPU 推理容器。从上述链接中的表格中选择图片时,请将示例 URL 列中的 Amazon 区域替换为您所在的区域。在 “可用 DLCs 的 Dee p Learning Containers 镜像” 页面顶部的表格中列出的区域中可用

自定义容器

您可以将软件包添加到基本 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
  2. 从您的 Dockerfile 构建 Docker 映像。指定您的 Amazon ECR 存储库、基础映像的名称和映像的标签。如果您没有 Amazon ECR 存储库,请参阅《Amazon ECR 用户指南》中的将 Amazon ECR 与 Amazon CLI结合使用,获取有关如何创建存储库的说明。

    docker build -f Dockerfile -t <registry>/<image_name>:<image_tag>
  3. 将 Docker 映像推送到您的 Amazon ECR 存储库。

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

现在,您应该有一个自定义容器映像,可用于模型服务。有关自定义容器的更多示例,请参阅构建 Dee Amazon p Learning Containers 自定义镜像

准备模型构件

在 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 操作模式

使用单模型端点通过 DJL Serving 进行部署

准备好模型构件后,您可以将模型部署到 A SageMaker I 端点。此部分介绍如何使用 DJL Serving 将单个模型部署到端点。如果您要部署多个模型,请跳过此部分并转至 使用多模型端点通过 DJL Serving 进行部署

以下示例向您展示了一种使用 Amaz SageMaker on Python 软件开发工具包创建模型对象的方法。您需要指定以下字段:

  • image_uri:您可以检索一个基础 DJL Serving 映像,如本示例所示,也可以指定 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 进行部署

如果您想将多个模型部署到一个端点, SageMaker AI 提供了多模型端点,这是一种可扩展且经济实惠的解决方案,可以部署大量模型。DJL Serving 还支持同时加载多个模型,并可同时对每个模型运行推理。DJL 服务容器遵守 SageMaker AI 多模型端点合同,可用于部署多模型端点。

每个单独的模型构件都需要按照上一部分准备模型构件中所述的相同方式进行打包。您可以在 serving.properties 文件中设置特定于模型的配置,在 model.py 中设置特定于模型的推理处理程序代码。对于多模型端点,需要按以下方式排列模型:

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

Amaz SageMaker on Python 软件开发工具包使用该MultiDataModel对象来实例化多模型终端节点。根目录的 Amazon S3 URI 应作为 model_data_prefix 参数传递给 MultiDataModel 构造函数。

DJL Serving 还提供了多个配置参数来管理模型内存需求,例如 required_memory_mbreserved_memory_mb,可在 serving.properties 文件中为每个模型进行配置。这些参数对于更平稳地处理内存不足错误很有用。有关所有可配置的参数,请参阅 djl 服务中的OutofMemory 处理

利用 DJL Serving 的自动扩缩功能,您可以轻松地确保根据传入流量相应地缩放模型。默认情况下,DJL Serving 会根据可用的硬件(例如 CPU 核心或 GPU 设备)确定模型可以支持的最大工作线程数。您可以为每个模型设置下限和上限,以确保始终可以提供最低流量水平,并且单个模型不会占用全部可用资源。您可在 serving.properties 文件中设置以下属性:

  • gpu.minWorkers: 最低工人人数 GPUs。

  • gpu.maxWorkers:的最大工作人员人数 GPUs。

  • cpu.minWorkers: 最低工人人数 CPUs。

  • cpu.maxWorkers:的最大工作人员人数 CPUs。

有关如何使用 DJL 服务容器在 SageMaker AI 上部署多模型端点的示例,请参阅 end-to-end示例笔记本 multi-model-inference-demo.ipynb。