

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

# 使用 Amazon SageMaker AI 進行模型部署的模型伺服器
<a name="deploy-model-frameworks"></a>

您可以使用熱門模型伺服器，例如 TorchServe、DJL Serving 和 Triton Inference Server，在 SageMaker AI 上部署模型。下列主題說明如何進行。

**Topics**
+ [使用 TorchServe 部署模型](deploy-models-frameworks-torchserve.md)
+ [使用 DJL Serving 部署模型](deploy-models-frameworks-djl-serving.md)
+ [使用 Triton Inference Server 進行模型部署](deploy-models-frameworks-triton.md)

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

TorchServe 是 PyTorch 推薦的模型伺服器，已預先安裝在 AWS PyTorch Deep Learning Container (DLC)。這個強大的工具為客戶提供一致且易於使用的體驗，無論模型大小或分佈為何，都能在各種 AWS 執行個體之間部署多個 PyTorch 模型時提供高效能，包括 CPU、GPU、Neuron 和 Graviton。

TorchServe 支援多種進階功能，包括動態批處理、微批處理、模型 A/B 測試、串流傳輸、Torch XLA、TensorRT、ONNX 及 IPEX。此外，它還流暢整合了 PyTorch 的大型模型解決方案 PiPPy，能夠有效處理大型模型。此外，TorchServe 還擴展了對 DeepSpeed、Accelerate、Fast Transformers 等熱門開放原始碼程式庫的支援，進一步擴展了其功能。使用 TorchServe， AWS 使用者可以放心地部署和提供 PyTorch 模型，利用其在各種硬體組態和模型類型中的多樣性和最佳化效能。有關詳細資訊，請參閱 [PyTorch 文件](https://pytorch.org/serve/)與 [GitHub 上的 TorchServe](https://github.com/pytorch/serve)。

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


| 執行個體類型 | 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 Neuron 容器](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 SageMaker AI 建立及測試 PyTorch DLC 的設定。

## 開始使用
<a name="deploy-models-frameworks-torchserve-prereqs"></a>

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

1. 確定您能夠存取 AWS 帳戶。設定您的環境，讓 AWS CLI 可以透過 IAM AWS 使用者或 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)
   + [AmazonS3FullAccess](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 映像檔。如需自訂容器的詳細資訊，請參閱[建置 AWS 深度學習容器自訂映像](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-config.yaml](https://github.com/aws/amazon-sagemaker-examples/blob/main/inference/torchserve/mme-gpu/workspace/lama/model-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>

下列範例說明如何建立[單一模型即時推斷端點](https://docs.aws.amazon.com/sagemaker/latest/dg/realtime-endpoints-deployment.html)、將模型部署到端點，以及如何使用 [Amazon SageMaker Python SDK](https://sagemaker.readthedocs.io/en/stable/) 測試端點。

```
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 可以動態管理載入及卸載模型，以及根據流量模式調整資源的規模，因此可減少部署負擔。對於需要加速運算能力的深度學習及生成式 AI 模型，多模型端點特別有用。

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

以下範例說明如何建立多模型端點、將模型部署到端點，以及如何使用 [Amazon SageMaker 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 CloudWatch 日誌篩選條件存取類似於 StatsD 格式的指標日誌。下列為 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
```

# 使用 DJL Serving 部署模型
<a name="deploy-models-frameworks-djl-serving"></a>

DJL Serving 是一種高效能通用獨立模型服務解決方案。它需要深度學習模型、數個模型或工作流程，並透過 HTTP 端點提供這些模型。

您可以使用其中一個 DJL Serving [Deep Learning Containers (DLCs)](https://docs.aws.amazon.com/deep-learning-containers/latest/devguide/what-is-dlc.html) 來為您的 AWS模型提供服務。若要瞭解支援的模型類型與架構，請參閱 [DJL Serving GitHub 儲存庫](https://github.com/deepjavalibrary/djl-serving)。

DJL Service 提供許多功能，可協助您以高效能部署模型：
+ 易於使用–DJL Serving 可以為大多數模型提供服務，而無需任何修改。您自帶模型成品，DJL Serving 可以進行託管。
+ 多個裝置和加速器支援 – DJL Serving 支援在 CPUs、GPUs 和 AWS Inferentia 上部署模型。
+ 效能–DJL Serving 會在單一 Java 虛擬機器 (JVM) 執行多執行緒推斷，以提高輸送量。
+ 動態批次處理–DJL Serving 支援動態批次處理，以增加輸送量。
+ 自動擴展 – DJL Service 會根據流量負載自動擴展或縮減工作者。
+ 多引擎支援–DJL Serving 可以同時使用不同的架構託管模型 (例如，PyTorch 及 TensorFlow)。
+ 整合與工作流程模型–DJL Service 支援部署由多個模型組成的複雜工作流程，並且可在 CPU 與 GPU 的其他部分執行部分工作流程。工作流程的模型可以利用不同的架構。

下列各節描述如何在 SageMaker AI 使用 DJL Serving 設定端點。

## 開始使用
<a name="deploy-models-frameworks-djl-prereqs"></a>

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

1. 確定您能夠存取 AWS 帳戶。設定您的環境，讓 AWS CLI 可以透過 IAM AWS 使用者或 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)
   + [AmazonSageMakerFullAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AmazonSageMakerFullAccess)
   + [AmazonS3FullAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AmazonS3FullAccess)

1. 請確定您已在系統設定 [Docker](https://docs.docker.com/get-docker/) 用戶端。

1. 登入 Amazon Elastic Container Registry 並設定下列環境變數：

   ```
   export ACCOUNT_ID=<your_account_id>
   export REGION=<your_region>
   aws ecr get-login-password --region $REGION | docker login --username AWS --password-stdin $ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com
   ```

1. 提取 Docker 映像檔。

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

   如需所有可用的 DJL Serving 容器映像檔，請參閱[大型模型推斷容器](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#large-model-inference-containers)及 [DJL Serving CPU 推斷容器](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#djl-cpu-full-inference-containers)。從上述連結中的資料表中選擇影像時，請將範例 URL 欄中 AWS 的區域取代為您所在的區域。DLC 可在 [Available Deep Learning Containers 映像檔](https://github.com/aws/deep-learning-containers/blob/master/available_images.md)頁面頂端表格所列出的區域取得。

## 自訂您的容器
<a name="deploy-models-frameworks-djl-byoc"></a>

您可以將套件新增至基本 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
   ```

1. 從 dockerfile 建立 Docker 映像檔。指定您的 Amazon ECR 儲存庫、基本映像檔的名稱以及映像檔的標籤。如果您沒有 Amazon ECR 儲存庫，請參閱 *Amazon ECR 使用者指南*中的[將 Amazon ECR 與 AWS CLI結合使用](https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html)，以瞭解如何建立儲存庫的說明。

   ```
   docker build -f Dockerfile -t <registry>/<image_name>:<image_tag>
   ```

1. 將 Docker 映像檔推送至您的 Amazon ECR 儲存庫。

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

您現在應該擁有可用於模型服務的自訂容器映像檔。如需自訂容器的更多範例，請參閱[建置 AWS 深度學習容器自訂映像](https://github.com/aws/deep-learning-containers/blob/master/custom_images.md)。

## 準備您的模型成品
<a name="deploy-models-frameworks-djl-artifacts"></a>

在 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 操作模式](https://github.com/deepjavalibrary/djl-serving/blob/master/serving/docs/modes.md)。

## 使用單一模型端點透過 DJL Serving 進行部署
<a name="deploy-models-frameworks-djl-single-model"></a>

準備好模型成品後，您可以將模型部署到 SageMaker AI 端點。本節說明如何使用 DJL Serving 將單一模型部署到端點。如果您要部署多個模型，請略過本節並前往 [使用多模型端點透過 DJL Serving 進行部署](#deploy-models-frameworks-djl-mme)。

下列範例示範使用 Amazon SageMaker Python SDK 建立模型物件的方法。您需要指定下列欄位：
+ `image_uri`：您可以依照此範例所示擷取其中一個基本 DJL Serving 映像檔，也可以從 Amazon ECR 儲存庫指定自訂 Docker 映像檔 (如果您按照 [自訂您的容器](#deploy-models-frameworks-djl-byoc) 的說明進行操作)。
+ `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 進行部署
<a name="deploy-models-frameworks-djl-mme"></a>

如果您想要將多個模型部署到端點，SageMaker AI 提供多模型端點，這是部署大量模型的可擴展且具成本效益的解決方案。DJL Serving 也支援同時載入多個模型，並同時在每個模型執行推斷。DJL Serving 容器遵守 SageMaker AI 多模型端點合約，並可用於部署多模型端點。

每個個別的模型成品都必須按照上一節[準備您的模型成品](#deploy-models-frameworks-djl-artifacts)所述相同的方式進行封裝。您可以在 `serving.properties` 檔案設定模型特定組態，並在 `model.py` 設定模型特定的推斷處理常式程式碼。對於多模型端點，需要以下列方式排列模型：

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

Amazon SageMaker Python SDK 使用 [MultiDataModel](https://sagemaker.readthedocs.io/en/stable/api/inference/multi_data_model.html) 物件具現化多模型端點。根目錄的 Amazon S3 URI 應當做 `model_data_prefix` 引數傳遞給 `MultiDataModel` 建構函式。

DJL Serving 也提供數個組態參數來管理模型記憶體需求，例如 `required_memory_mb` 及 `reserved_memory_mb`，這些參數可以在 [serving.properties](https://github.com/deepjavalibrary/djl-serving/blob/master/serving/docs/modes.md#servingproperties) 檔案為每個模型進行設定。這些參數有助於更優雅地處理記憶體不足的錯誤。有關所有可設定參數，請參閱 [djl-serving 中的 OutofMemory 處理](https://github.com/deepjavalibrary/djl-serving/blob/master/serving/docs/out_of_memory_management.md)。

DJL Service 的自動擴展功能可讓您輕鬆確保模型能夠針對傳入流量進行適當擴展。根據預設，DJL Serving 會根據可用的硬體 (例如 CPU 核心或 GPU 裝置) 來決定模型可支援的最大工作者數量。您可以為每個模型設定下限和上限，以確保始終可以提供最低流量層級，而且單一模型不會消耗所有可用資源。您可以在 [serving.properties](https://github.com/deepjavalibrary/djl-serving/blob/master/serving/docs/modes.md#servingproperties) 檔案設定以下屬性：
+ `gpu.minWorkers`：GPU 的最小工作者數量。
+ `gpu.maxWorkers`：GPU 的最大工作者數量。
+ `cpu.minWorkers`：CPU 的最小工作者數量。
+ `cpu.maxWorkers`：CPU 的最大工作者數量。

如需如何使用 DJL Serving 容器在 SageMaker AI 部署多模型端點的端對端範例，請參閱範例筆記本 [Multi-Model-Inference-Demo.ipynb](https://github.com/deepjavalibrary/djl-demo/blob/master/aws/sagemaker/Multi-Model-Inference-Demo.ipynb)。

# 使用 Triton Inference Server 進行模型部署
<a name="deploy-models-frameworks-triton"></a>

[Triton Inference Server ](https://github.com/triton-inference-server/server)是一種開放原始碼推斷服務軟體，可簡化 AI 推斷。透過 Triton，您可以部署任何以多種深度學習及機器學習架構建立的模型，包括 TensorRT、TensorFlow、PyTorch、ONNX、OpenVINO、Python、RAPIDS FIL 等。

SageMaker AI Triton 容器可協助您在 SageMaker AI Hosting 平台部署 Triton Inference Server，以便在生產環境中為受過訓練的模型提供服務。它支援 SageMaker AI 操作的不同模式。如需 SageMaker AI 上可用的 Triton Inference Server 容器清單，請參閱 [NVIDIA Triton Inference Containers (僅限 SM 支援)](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#nvidia-triton-inference-containers-sm-support-only)。

對於端對端筆記本範例，我們建議查看 [amazon-sagemaker-examples 儲存庫](https://github.com/aws/amazon-sagemaker-examples/tree/main/sagemaker-triton)。

## Hosting 模式
<a name="deploy-models-frameworks-triton-modes"></a>

Triton 容器支援下列 SageMaker AI Hosting 模式：
+ 單一模型端點
  + 這是 SageMaker AI 的預設操作模式。在此模式下，Triton 容器可以載入單一模型或單一整合模型。
  + 模型的名稱必須作為容器環境的屬性傳遞，這是 `CreateModel` SageMaker AI API 呼叫的一部分。用來傳遞模型名稱的環境變數為 `SAGEMAKER_TRITON_DEFAULT_MODEL_NAME`。
+ 具有整合的單一模型端點
  + Triton Inference Server 支援*整合*，這是一個管線，或模型的 DAG (有向非循環圖)。雖然整合在技術上由多個模型組成，但在預設的單一模型端點模式，SageMaker AI 可以將*整合本身* (代表管線的中繼模型) 視為要載入的主要模型，並隨後可以載入關聯的模型。
  + 必須使用整合適當的模型名稱來載入模型。它必須作為容器環境的屬性傳遞，這是 `CreateModel` SageMaker API 呼叫的一部分。用來傳遞模型名稱的環境變數為 `SAGEMAKER_TRITON_DEFAULT_MODEL_NAME`。
+ 多模型端點
  + 在此模式下，SageMaker AI 可以在單一端點提供多個模型。您可以透過將環境變數 `‘MultiModel’: true` 指定為容器環境的屬性 (屬於 `CreateModel` SageMaker API 呼叫的一部分) 來使用此模式。
  + 依預設，執行個體啟動時不會載入任何模型。若要針對特定模型執行推斷請求，請將對應模型的 `*.tar.gz` 檔案指定為 `InvokeEndpoint` SageMaker API 呼叫 `TargetModel` 屬性的引數。
+ 具有整合的多模型端點
  + 在此模式下，SageMaker AI 的功能如多模型端點所述。不過，SageMaker AI Triton 容器可以載入多個整合模型，這表示多個模型管線可以在相同的執行個體執行。SageMaker AI 會將每個整合視為一個模型，並且可以透過將對應的 `*.tar.gz` 封存指定為 `TargetModel` 來調用每個模型的整合。
  + 為了在動態記憶體 `LOAD` 及 `UNLOAD` 期間實現更好的記憶體管理，我們建議您將整合大小保持較小。

## 推斷裝載類型
<a name="deploy-models-frameworks-triton-payloads"></a>

Triton 支援兩種透過網路傳送推斷負載的方法–`json` 及 `binary+json` (或二進制編碼的 json)。在這兩種情況下，JSON 有效負載都包括資料類型、形狀和實際推斷請求張量。要求張量必須是二進位張量。

使用 `binary+json` 格式，您必須在標題指定請求中繼資料的長度，以允許 Triton 正確解析二進制有效負載。在 SageMaker AI Triton 容器中，這是使用自訂 `Content-Type` 標題所完成：`application/vnd.sagemaker-triton.binary+json;json-header-size={}`。這與在獨立的 Triton Inference Server 使用 `Inference-Header-Content-Length` 標題不同，因為 SageMaker AI 不允許自訂標題。

## 使用 config.pbtxt 設定模型組態
<a name="deploy-models-frameworks-triton-config"></a>

對於 SageMaker AI 的 Triton Inference Server ，每個模型都必須包含一個 `config.pbtxt` 檔案，該檔案至少必須為模型指定下列組態：
+ `name`：雖然這對於在 SageMaker AI 以外執行的模型而言是選用的，但我們建議您始終為要在 SageMaker AI 上的 Triton 執行的模型提供名稱。
+ [`platform` 和/或 `backend`](https://github.com/triton-inference-server/backend/blob/main/README.md#backends)：設置後端對於指定模型的類型非常重要。某些後端有進一步的分類，例如 `tensorflow_savedmodel` 或 ` tensorflow_graphdef`。除了 `backend` 金鑰之外，這些選項也可以指定為金鑰 `platform` 的一部分。最常見的後端是 `tensorrt`、`onnxruntime`、`tensorflow`、`pytorch`、`python`、`dali`、`fil`、以及 `openvino`。
+ `input`：為輸入指定三個屬性：`name`、`data_type` 及 `dims` (形狀)。
+ `output`：為輸出指定三個屬性：`name`、`data_type` 及 `dims` (形狀)。
+ `max_batch_size`：將批次大小設定為大於或等於 1 的值，表示 Triton 應與模型搭配使用的最大批次大小。

有關組態 `config.pbtxt` 的更多詳細資訊，請參閱 Triton 的 GitHub [儲存庫](https://github.com/triton-inference-server/server/blob/main/docs/user_guide/model_configuration.md)。Triton 提供了幾種用於調整模型行為的組態。一些最常見及最重要的組態選項包括：
+ [https://github.com/triton-inference-server/server/blob/main/docs/user_guide/model_configuration.md#instance-groups](https://github.com/triton-inference-server/server/blob/main/docs/user_guide/model_configuration.md#instance-groups)：執行個體群組有助於指定特定模型的數量與位置。它們具有屬性 `count`、`kind`、及 `gpus` (當 `kind` 為 `KIND_GPU` 時使用)。`count` 屬性相當於工作者數量。對於一般模型服務，每個工作者都有自己的模型副本。同樣，在 Triton 中，`count` 指定每個裝置的模型副本數量。例如，如果 `instance_group` 類型為 `KIND_CPU`，則 CPU 有 `count` 個型號副本。
**注意**  
在 GPU 執行個體上，`instance_group` 組態適用於每個 GPU 裝置。例如，除非您明確指定哪些 GPU 裝置應載入模型，否則每個 GPU 裝置都會放置 `count` 個模型副本。
+ [https://github.com/triton-inference-server/server/blob/main/docs/user_guide/model_configuration.md#dynamic-batcher](https://github.com/triton-inference-server/server/blob/main/docs/user_guide/model_configuration.md#dynamic-batcher) 及 [https://github.com/triton-inference-server/server/blob/main/docs/user_guide/architecture.md#stateful-models](https://github.com/triton-inference-server/server/blob/main/docs/user_guide/architecture.md#stateful-models)：動態批處理用於無狀態模型，序列批處理用於有狀態模型 (您希望每次都將請求路由到相同的模型執行個體)。批次處理排程器會啟用每個模型的佇列，這有助於提高輸送量，具體取決於批次設定。
+ [https://github.com/triton-inference-server/server/blob/main/docs/user_guide/architecture.md#ensemble-models](https://github.com/triton-inference-server/server/blob/main/docs/user_guide/architecture.md#ensemble-models)：整合模型表示一個或多個模型的*管線*以及這些模型之間輸入和輸出張量的連接。可以透過將 `platform` 指定為 `ensemble` 來設定。整合組態只是模型管線的表示。在 SageMaker AI 上，整合下的所有模型都會被視為整合模型的相依物件，並被視為 SageMaker AI 指標 (例如 `LoadedModelCount`) 的單一模型。

## 將預設的 Triton 指標發布至 Amazon CloudWatch
<a name="deploy-models-frameworks-triton-metrics"></a>

NVIDIA Triton Inference Container 在連接埠 8002 (可設定) 公開 Triton Inference Server 使用的不同模型及 GPU 指標。如需可用預設指標的完整詳細資訊，請參閱 [Triton Inference Server ](https://github.com/triton-inference-server/server/blob/main/docs/user_guide/metrics.md) 指標的 GitHub 頁面。這些指標採用 Prometheus 格式，可以使用 Prometheus 抓取器組態進行抓取。

從版本 v23.07 開始，SageMaker AI Triton 容器支援透過指定一些環境變數將這些指標發布到 Amazon CloudWatch。為了抓取 Prometheus 指標，SageMaker AI Triton 容器利用 Amazon CloudWatch 代理程式。

您必須指定收集指標所需的環境變數如下：


| 環境變數 | Description | 範例值 | 
| --- | --- | --- | 
|  `SAGEMAKER_TRITON_ALLOW_METRICS`  |  指定此選項可允許 Triton 將指標發布至其 Prometheus 端點。  | “true” | 
|  `SAGEMAKER_TRITON_PUBLISH_METRICS_TO_CLOUDWATCH`  |  指定此選項以啟動將指標發布到 Amazon CloudWatch 所需的預先檢查。  | “true” | 
|  `SAGEMAKER_TRITON_CLOUDWATCH_LOG_GROUP`  |  指定此選項可指向要寫入測量結果的日誌群組。  | "/aws/SageMaker AI/Endpoints/TritonMetrics/SageMakerTwoEnsemblesTest" | 
|  `SAGEMAKER_TRITON_CLOUDWATCH_METRIC_NAMESPACE`  |  指定此選項可指向您要查看並繪製指標的指標命名空間。  | "/aws/SageMaker AI/Endpoints/TritonMetrics/SageMakerTwoEnsemblesPublicTest" | 
|  `SAGEMAKER_TRITON_METRICS_PORT`  |  將此連接埠指定為 8002 或任何其他連接埠。如果 SageMaker AI 尚未封鎖指定的連接埠，則會使用該連接埠。否則，會自動選擇另一個未封鎖的連接埠。  | “8002” | 

使用 Triton 在 SageMaker AI 上發布指標時，請記住下列限制：
+ 雖然您可以透過 C-API 與 Python 後端 (v23.05 版以後) 產生自訂指標，但目前不支援將這些指標發布到 Amazon CloudWatch。
+ 在 SageMaker AI 多模型端點 (MME) 模式中，Triton 在需要啟用模型命名空間的環境中執行，因為每個模型 (整合模型除外) 都被視為位於自己的模型儲存庫中。目前，這對指標造成了限制。啟用模型命名空間時，Triton 不會區分屬於不同整合的兩個具有相同名稱的模型之間的指標。因應措施是確保所部署的每個模型都有唯一的名稱。這也使得您可以更輕鬆地在 CloudWatch 找到指標。

## 環境變數
<a name="deploy-models-frameworks-triton-variables"></a>

下表列出 SageMaker AI 上 Triton 支援的環境變數。


| 環境變數 | 說明 | Type | 可能的值 | 
| --- | --- | --- | --- | 
| `SAGEMAKER_MULTI_MODEL` | 允許 Triton 在 SageMaker AI 多模型端點模式下操作。 | Boolean | `true`, `false` | 
| `SAGEMAKER_TRITON_DEFAULT_MODEL_NAME` | 指定要在 SageMaker AI 單一模型 (預設) 模式中載入的模型。對於整合模式，請指定適當的整合名稱。 | String | config.pbtxt 中指定的 *<model\$1name>* | 
| `SAGEMAKER_TRITON_PING_MODE` | `'ready'` 是 SageMaker AI 單一模型模式的預設模式，且 `'live'` 是 SageMaker AI 的多模型端點模式的預設模式。 | String | `ready`, `live` | 
| `SAGEMAKER_TRITON_DISABLE_MODEL_NAMESPACING` | 在 SageMaker AI Triton 容器，預設為 `true`。 | Boolean | `true`, `false` | 
| `SAGEMAKER_BIND_TO_PORT` | 在 SageMaker AI 上時，預設連接埠為 8080。您可以在多容器案例中自訂不同的連接埠。 | String | *<port\$1number>* | 
| `SAGEMAKER_SAFE_PORT_RANGE` | 這是使用多容器模式時由 SageMaker AI 平台所設定。 | String | *<port\$11>*–*<port\$12>* | 
| `SAGEMAKER_TRITON_ALLOW_GRPC` | 雖然 SageMaker AI 目前不支援 GRPC，但如果您在自訂反向代理伺服器之前使用 Triton，您可以選擇啟用 GRPC。 | Boolean | `true`, `false` | 
| `SAGEMAKER_TRITON_GRPC_PORT` | GRPC 的預設連接埠是 8001，但您可以變更它。 | String | *<port\$1number>* | 
| `SAGEMAKER_TRITON_THREAD_COUNT` | 您可以設定預設 HTTP 請求處理常式執行緒的數量。 | String | *<number>* | 
| `SAGEMAKER_TRITON_LOG_VERBOSE` | SageMaker AI 依預設為 `true`，但您可以選擇性關閉此選項。 | Boolean | `true`, `false` | 
| `SAGEMAKER_TRITON_LOG_INFO` | SageMaker AI 預設為 `false`。 | Boolean | `true`, `false` | 
| `SAGEMAKER_TRITON_LOG_WARNING` | SageMaker AI 預設為 `false`。 | Boolean | `true`, `false` | 
| `SAGEMAKER_TRITON_LOG_ERROR` | SageMaker AI 預設為 `false`。 | Boolean | `true`, `false` | 
| `SAGEMAKER_TRITON_SHM_DEFAULT_BYTE_SIZE` | 指定 Python 後端的 shm 大小 (以位元組為單位)。預設值為 16 MB，但可以增加。 | String | *<number>* | 
| `SAGEMAKER_TRITON_SHM_GROWTH_BYTE_SIZE` | 指定 Python 後端的 shm 增長大小 (以位元組為單位)。預設值為 1 MB，但可增加以允許更大的增量。 | String | *<number>* | 
| `SAGEMAKER_TRITON_TENSORFLOW_VERSION` | 預設值為 `2`。從 Triton v23.04 開始，Triton 不再支援 Tensorflow 2。您可以為舊版本設定此變數。 | String | *<number>* | 
| `SAGEMAKER_TRITON_MODEL_LOAD_GPU_LIMIT` | 限制用於模型載入的 GPU 記憶體百分比上限，允許其餘部分用於推斷請求。 | String | *<number>* | 
| `SAGEMAKER_TRITON_ALLOW_METRICS` | SageMaker AI 預設為 `false`。 | Boolean | `true`, `false` | 
| `SAGEMAKER_TRITON_METRICS_PORT` | 預設連接埠為 8002。 | String | *<number>* | 
| `SAGEMAKER_TRITON_PUBLISH_METRICS_TO_CLOUDWATCH` | SageMaker AI 預設為 `false`。將此變數設為 `true` 以允許將 Triton 預設指標推送至 Amazon CloudWatch。如果啟用此選項，則當指標發布到您的帳戶時，您需負擔 CloudWatch 費用。 | Boolean | `true`, `false` | 
| `SAGEMAKER_TRITON_CLOUDWATCH_LOG_GROUP` | 如果您已啟用指標發布到 CloudWatch，則需要此選項。 | String | *<cloudwatch\$1log\$1group\$1name>* | 
| `SAGEMAKER_TRITON_CLOUDWATCH_METRIC_NAMESPACE` | 如果您已啟用指標發布到 CloudWatch，則需要此選項。 | String | *<cloudwatch\$1metric\$1namespace>* | 
| `SAGEMAKER_TRITON_ADDITIONAL_ARGS` | 在啟動 Triton Server 時附加的任何其他引數。 | String | *<additional\$1args>* | 