使用 部署模型 TorchServe - Amazon SageMaker

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 部署模型 TorchServe

TorchServe 是 的建議模型伺服器 PyTorch,預先安裝在 AWS PyTorch 深度學習容器 () 中DLC。此功能強大的工具為客戶提供一致且易於使用的體驗,無論模型大小或分佈為何,都能在跨各種 AWS 執行個體部署多個 PyTorch模型時提供高效能,包括 CPU、、GPUNeuron 和 Graviton。

TorchServe 支援各種進階功能,包括動態批次處理、微批次處理、模型 A/B 測試、串流、火XLA炬 、tensorRTONNX和 IPEX。此外,它無縫整合了 PyTorch的大型模型解決方案 P iPPy,可有效處理大型模型。此外,將其支援 TorchServe 延伸至常見的開放原始碼程式庫,例如 DeepSpeed、 Accelerate、 Fast Transformers 等,進一步擴展其功能。透過 TorchServe, AWS 使用者可以放心地部署和提供 PyTorch 模型,充分利用其在各種硬體組態和模型類型中的多功能性和最佳化效能。如需更多詳細資訊,請參閱 PyTorch 文件TorchServe 上的 GitHub

下表列出 AWS PyTorch DLCs 支援的 TorchServe。

執行個體類型 SageMaker PyTorch DLC 連結

CPU 和 GPU

SageMaker PyTorch 容器

Neuron

PyTorch Neuron 容器

Graviton

SageMaker PyTorch Graviton 容器

下列各節說明在 Amazon 上建置和測試 PyTorch DLCs的設定 SageMaker。

開始使用

首先,請務必確認您已進行下列事前準備:

  1. 確保您可存取 AWS 帳戶。設定您的環境,讓 AWS CLI 可以透過使用者或IAM角色存取您的帳戶 AWS 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 影像適用於所有 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/

新增套件

下列各節說明如何將套件新增至DLC映像 PyTorch並預先安裝。

BYOC 使用案例

下列步驟概述如何將套件新增至映像 PyTorch DLC。如需自訂容器的詳細資訊,請參閱建置 AWS 深度學習容器自訂映像。

  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

下列範例示範如何建立單一模型即時推論端點 、將模型部署至端點,以及使用 Amazon SageMaker 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 會管理動態載入和卸載模型,並根據流量模式擴展資源。對於需要加速運算能力的深度學習及生成式 AI 模型,多模型端點特別有用。

透過 TorchServe 在 SageMaker 多模型端點上使用 ,您可以使用您熟悉的服務堆疊來加速開發,同時利用 SageMaker 多模型端點提供的資源共用和簡化模型管理。

下列範例示範如何建立多模型端點、將模型部署至端點,以及使用 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 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