

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

# 使用 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>* | 