使用 TorchServe 部署模型 - 亚马逊 SageMaker AI

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

使用 TorchServe 部署模型

TorchServe 是推荐用于 PyTorch 的模型服务器,预装在 AWS PyTorch 深度学习容器 (DLC) 中。这款强大的工具为客户提供一致且用户友好的体验,能够在各种 AWS 实例上(包括 CPU、GPU、Neuron 和 Graviton)部署多个 PyTorch 模型,从而提供出色的性能,而不受模型大小或分布方式的限制。

TorchServe 支持各种高级功能,包括动态批处理、微批处理、模型 A/B 测试、流式处理、torch XLA、tensorRT、ONNX 和 IPEX。此外,它还无缝集成了 PyTorch 的大型模型解决方案 PiPPy,实现了对大型模型的高效处理。而且 TorchServe 还扩展了对流行开源库的支持,例如 DeepSpeed、Accelerate、Fast Transformers 等,进一步扩大了其功能。借助 TorchServe,AWS 用户可以放心地部署和提供其 PyTorch 模型,充分利用其多功能性,以及针对各种硬件配置和模型类型而优化的性能。有关更多详细信息,请参阅 PyTorch 文档GitHub 上的 TorchServe

下表列出了 TorchServe 支持的 AWS PyTorch DLC。

实例类型 SageMaker AI PyTorch DLC 链接

CPU 和 GPU

SageMaker AI PyTorch 容器

Neuron

PyTorch Neuron 容器

Graviton

SageMaker AI PyTorch Graviton 容器

以下各个部分介绍了在 Amazon SageMaker AI 上构建和测试 PyTorch DLC 的设置。

入门

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

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

  2. 在本地配置您的依赖项,如以下示例所示:

    from datetime import datetime import os import json import logging import time # External Dependencies: import boto3 from botocore.exceptions import ClientError import sagemaker sess = boto3.Session() sm = sess.client("sagemaker") region = sess.region_name account = boto3.client("sts").get_caller_identity().get("Account") smsess = sagemaker.Session(boto_session=sess) role = sagemaker.get_execution_role() # Configuration: bucket_name = smsess.default_bucket() prefix = "torchserve" output_path = f"s3://{bucket_name}/{prefix}/models" print(f"account={account}, region={region}, role={role}")
  3. 检索 PyTorch DLC 映像,如以下示例中所示。

    SageMaker AI PyTorch DLC 映像在所有 AWS 区域中可用。有关更多信息,请参阅 DLC 容器映像列表

    baseimage = sagemaker.image_uris.retrieve( framework="pytorch", region="<region>", py_version="py310", image_scope="inference", version="2.0.1", instance_type="ml.g4dn.16xlarge", )
  4. 创建本地工作区。

    mkdir -p workspace/

添加软件包

以下部分介绍如何在 PyTorch DLC 映像中添加和预安装软件包。

BYOC 使用场景

以下步骤概括了如何将软件包添加到 PyTorch DLC 映像。有关自定义容器的更多信息,请参阅构建 AWS Deep Learning Containers 自定义映像

  1. 假设您希望在 PyTorch DLC Docker 映像中添加一个软件包。在 docker 目录下创建 Dockerfile,如以下示例所示:

    mkdir -p workspace/docker cat workspace/docker/Dockerfile ARG BASE_IMAGE FROM $BASE_IMAGE #Install any additional libraries RUN pip install transformers==4.28.1
  2. 使用以下 build_and_push.sh 脚本构建并发布自定义 Docker 映像。

    # Download script build_and_push.sh to workspace/docker ls workspace/docker build_and_push.sh Dockerfile # Build and publish your docker image reponame = "torchserve" versiontag = "demo-0.1" ./build_and_push.sh {reponame} {versiontag} {baseimage} {region} {account}

SageMaker AI 预安装使用案例

以下示例展示了如何将软件包预安装到 PyTorch DLC 容器中。您必须在本地 workspace/code 目录下创建 requirements.txt 文件。

mkdir -p workspace/code cat workspace/code/requirements.txt transformers==4.28.1

创建 TorchServe 模型构件

在以下示例中,我们使用预先训练的 MNIST 模型。我们创建目录 workspace/mnist,按照 TorchServe 自定义服务说明实施 mnist_handler.py,然后在 model-config.yaml配置模型参数(例如批次大小和工作线程)。然后,我们使用 TorchServe 工具 torch-model-archiver 构建模型构件并上传到 Amazon S3。

  1. model-config.yaml 中配置模型参数。

    ls -al workspace/mnist-dev mnist.py mnist_handler.py mnist_cnn.pt model-config.yaml # config the model cat workspace/mnist-dev/model-config.yaml minWorkers: 1 maxWorkers: 1 batchSize: 4 maxBatchDelay: 200 responseTimeout: 300
  2. 使用 torch-model-archiver 构建模型构件。

    torch-model-archiver --model-name mnist --version 1.0 --model-file workspace/mnist-dev/mnist.py --serialized-file workspace/mnist-dev/mnist_cnn.pt --handler workspace/mnist-dev/mnist_handler.py --config-file workspace/mnist-dev/model-config.yaml --archive-format tgz

    如果您要预安装软件包,则必须在 tar.gz 文件中包含 code 目录。

    cd workspace torch-model-archiver --model-name mnist --version 1.0 --model-file mnist-dev/mnist.py --serialized-file mnist-dev/mnist_cnn.pt --handler mnist-dev/mnist_handler.py --config-file mnist-dev/model-config.yaml --archive-format no-archive cd mnist mv ../code . tar cvzf mnist.tar.gz .
  3. mnist.tar.gz 上传到 Amazon S3。

    # upload mnist.tar.gz to S3 output_path = f"s3://{bucket_name}/{prefix}/models" aws s3 cp mnist.tar.gz {output_path}/mnist.tar.gz

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

以下示例向您展示如何使用 Amazon SageMaker Python SDK 创建单模型实时推理端点、将模型部署到端点并对端点进行测试。

from sagemaker.model import Model from sagemaker.predictor import Predictor # create the single model endpoint and deploy it on SageMaker AI model = Model(model_data = f'{output_path}/mnist.tar.gz', image_uri = baseimage, role = role, predictor_cls = Predictor, name = "mnist", sagemaker_session = smsess) endpoint_name = 'torchserve-endpoint-' + time.strftime("%Y-%m-%d-%H-%M-%S", time.gmtime()) predictor = model.deploy(instance_type='ml.g4dn.xlarge', initial_instance_count=1, endpoint_name = endpoint_name, serializer=JSONSerializer(), deserializer=JSONDeserializer()) # test the endpoint import random import numpy as np dummy_data = {"inputs": np.random.rand(16, 1, 28, 28).tolist()} res = predictor.predict(dummy_data)

使用多模型端点通过 TorchServe 进行部署

多模型端点提供了经济高效的可扩展解决方案,用于在一个端点上托管大量的模型。它们通过分享相同的资源实例集来提高端点利用率,并提供容器来托管所有模型。它们还可以减少部署开销,因为 SageMaker AI 可以动态管理模型的加载和卸载,并根据流量模式扩展资源。多模型端点对于需要加速计算能力的深度学习和生成式人工智能模型特别有用。

通过在 SageMaker AI 多模型端点上使用 TorchServe,您可以使用熟悉的服务堆栈来加快开发速度,同时利用 SageMaker AI 多模型端点提供的资源共享功能以及简化的模型管理。

以下示例向您展示如何使用 Amazon SageMaker Python SDK 创建多模型端点、将模型部署到端点并测试端点。此笔记本示例中提供了更多详细信息。

from sagemaker.multidatamodel import MultiDataModel from sagemaker.model import Model from sagemaker.predictor import Predictor # create the single model endpoint and deploy it on SageMaker AI model = Model(model_data = f'{output_path}/mnist.tar.gz', image_uri = baseimage, role = role, sagemaker_session = smsess) endpoint_name = 'torchserve-endpoint-' + time.strftime("%Y-%m-%d-%H-%M-%S", time.gmtime()) mme = MultiDataModel( name = endpoint_name, model_data_prefix = output_path, model = model, sagemaker_session = smsess) mme.deploy( initial_instance_count = 1, instance_type = "ml.g4dn.xlarge", serializer=sagemaker.serializers.JSONSerializer(), deserializer=sagemaker.deserializers.JSONDeserializer()) # list models list(mme.list_models()) # create mnist v2 model artifacts cp mnist.tar.gz mnistv2.tar.gz # add mnistv2 mme.add_model(mnistv2.tar.gz) # list models list(mme.list_models()) predictor = Predictor(endpoint_name=mme.endpoint_name, sagemaker_session=smsess) # test the endpoint import random import numpy as np dummy_data = {"inputs": np.random.rand(16, 1, 28, 28).tolist()} res = predictor.predict(date=dummy_data, target_model="mnist.tar.gz")

Metrics

TorchServe 支持系统级和模型级的指标。您可以通过环境变量 TS_METRICS_MODE,在日志格式模式或 Prometheus 模式下启用指标。您可以使用 TorchServe 集中指标配置文件 metrics.yaml 来指定要跟踪的指标类型,例如请求计数、延迟、内存使用率、GPU 利用率等。通过参考此文件,您可以深入了解已部署模型的性能和运行状况,并高效地实时监控 TorchServe 服务器的行为。有关更多详细信息,请参阅 TorchServe 指标文档

您可以通过 Amazon CloudWatch 日志筛选条件,访问与 StatsD 格式相似的 TorchServe 指标日志。以下是 TorchServe 指标日志示例:

CPUUtilization.Percent:0.0|#Level:Host|#hostname:my_machine_name,timestamp:1682098185 DiskAvailable.Gigabytes:318.0416717529297|#Level:Host|#hostname:my_machine_name,timestamp:1682098185