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

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

使用部署模型 TorchServe

TorchServe 是推荐的服务器模型 PyTorch,已预先安装在 Amazon PyTorch 深度学习容器中 (DLC)。这款强大的工具为客户提供一致且用户友好的体验,无论模型大小或分布如何,都能在各种 Amazon 实例上部署多个 PyTorch模型,包括CPU、GPU、Neuron 和 Graviton,都能提供高性能。

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

下表列出了所 Amazon PyTorch DLCs支持的 TorchServe。

实例类型 SageMaker PyTorch DLC链接

CPU和 GPU

SageMaker PyTorch 容器

Neuron

PyTorch 神经元容器

Graviton

SageMaker PyTorch Graviton 容器

以下各节描述了在 Amazon PyTorch DLCs 上进行构建和测试的设置 SageMaker。

开始使用

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

  1. 确保您有权访问 Amazon 账户。设置您的环境,以便 Amazon CLI 可以通过 Amazon 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 PyTorch DLC图片在所有 Amazon 地区都可用。有关更多信息,请参阅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/

添加软件包

以下各节介绍如何在 PyTorchDLC映像中添加和预安装软件包。

BYOC用例

以下步骤概述了如何向 PyTorch DLC图像添加软件包。有关自定义容器的更多信息,请参阅构建 Dee Amazon p 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 预安装用例

以下示例向您展示了如何将软件包预安装到 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

以下示例向您展示如何使用 A maz SageMaker on Python SDK 创建单个模型实时推理终端节点、将模型部署到终端节点以及测试终端节点。

from sagemaker.model import Model from sagemaker.predictor import Predictor # create the single model endpoint and deploy it on SageMaker 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 管理动态加载和卸载模型,并根据流量模式扩展资源。多模型端点对于需要加速计算能力的深度学习和生成式人工智能模型特别有用。

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

以下示例向您展示如何使用 Amaz SageMaker on 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 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")

指标

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

您可以通过 Amazon 日志筛选器访问与 StatSD 格式相似的 TorchServe 指标 CloudWatch 日志。以下是 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