

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

# 使用部署模型 TorchServe
<a name="deploy-models-frameworks-torchserve"></a>

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

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

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


| 实例类型 | SageMaker AI PyTorch DLC 链接 | 
| --- | --- | 
| CPU 和 GPU | [SageMaker AI PyTorch 容器](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#sagemaker-framework-containers-sm-support-only) | 
| Neuron | [PyTorch 神经元容器](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#neuron-containers) | 
| Graviton | [SageMaker AI PyTorch Graviton 容器](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#sagemaker-framework-graviton-containers-sm-support-only) | 

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

## 开始使用
<a name="deploy-models-frameworks-torchserve-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)
   + [AWS ServiceRoleForAmazonEKSNodegroup](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AWSServiceRoleForAmazonEKSNodegroup)
   + [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. 在本地配置您的依赖项，如以下示例所示：

   ```
   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}")
   ```

1. 检索 PyTorch DLC 镜像，如以下示例所示。

   SageMaker AI PyTorch DLC 镜像在所有 AWS 地区都可用。有关更多信息，请参阅 [DLC 容器映像列表](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#sagemaker-framework-containers-sm-support-only)。

   ```
   baseimage = sagemaker.image_uris.retrieve(
           framework="pytorch",
           region="<region>",
           py_version="py310",
           image_scope="inference",
           version="2.0.1",
           instance_type="ml.g4dn.16xlarge",
       )
   ```

1. 创建本地工作区。

   ```
   mkdir -p workspace/
   ```

## 添加软件包
<a name="deploy-models-frameworks-torchserve-package"></a>

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

**BYOC 使用场景**

以下步骤概述了如何向 PyTorch DLC 图像添加软件包。有关自定义容器的更多信息，请参阅[构建 Dee AWS p Learning Containers 自定义镜像](https://github.com/aws/deep-learning-containers/blob/master/custom_images.md)。

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
   ```

1. 使用以下 [build\$1and\$1push.sh](https://github.com/aws/amazon-sagemaker-examples/blob/main/inference/torchserve/mme-gpu/workspace/docker/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 模型工件
<a name="deploy-models-frameworks-torchserve-artifacts"></a>

在以下示例中，我们使用预先训练的 [MNIST 模型](https://github.com/pytorch/serve/tree/master/examples/image_classifier/mnist)。我们创建一个目录`workspace/mnist`，按照[TorchServe 自定义服务说明](https://github.com/pytorch/serve/blob/master/docs/custom_service.md#custom-service)实现 [mnist\$1handler.py](https://github.com/pytorch/serve/blob/master/examples/image_classifier/mnist/mnist_handler.py)，然后[在 [model-](https://github.com/aws/amazon-sagemaker-examples/blob/main/inference/torchserve/mme-gpu/workspace/lama/model-config.yaml) config.yaml 中配置模型参数](https://github.com/pytorch/serve/tree/master/model-archiver#config-file)（例如批次大小和工作程序）。然后，我们使用该 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
   ```

1. 使用构建模型工件[torch-model-archiver ](https://github.com/pytorch/serve/tree/master/model-archiver#torch-model-archiver-for-torchserve)。

   ```
   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 .
   ```

1. 将 `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 name="deploy-models-frameworks-torchserve-single-model"></a>

以下示例向您展示如何使用 A [maz SageMaker on Python SDK](https://sagemaker.readthedocs.io/en/stable/) 创建[单个模型实时推理](https://docs.aws.amazon.com/sagemaker/latest/dg/realtime-endpoints-deployment.html)终端节点、将模型部署到终端节点以及测试终端节点。

```
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
<a name="deploy-models-frameworks-torchserve-multi-model"></a>

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

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

以下示例向您展示如何使用 [Amaz SageMaker on Python SDK](https://sagemaker.readthedocs.io/en/stable/) 创建多模型终端节点、将模型部署到终端节点以及测试终端节点。此[笔记本示例](https://github.com/aws/amazon-sagemaker-examples/blob/main/inference/torchserve/mme-gpu/torchserve_multi_model_endpoint.ipynb)中提供了更多详细信息。

```
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")
```

## 指标
<a name="deploy-models-frameworks-torchserve-metrics"></a>

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

您可以通过 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
```