

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

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

[Triton Inference Server](https://github.com/triton-inference-server/server) 是一款开源推理服务软件，可简化 AI 推理操作。使用 Triton，你可以部署任何使用多个深度学习和机器学习框架构建的模型，包括 Tensorrt、、、ONNX、OpenVino TensorFlow PyTorch、Python、RAPIDS FIL 等。

 SageMaker AI Triton 容器可帮助你在 A SageMaker I 托管平台上部署 Triton 推理服务器，以便在生产环境中为经过训练的模型提供服务。它支持 A SageMaker I 的不同运行模式。有关 SageMaker 人工智能上可用的 Triton 推理服务器容器的列表，请参阅 [NVIDIA Triton 推理容器（仅支持 SM）](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#nvidia-triton-inference-containers-sm-support-only)。

对于 end-to-end笔记本示例，我们建议您查看[amazon-sagemaker-examples 存储库](https://github.com/aws/amazon-sagemaker-examples/tree/main/sagemaker-triton)。

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

Triton 容器支持以下 SageMaker AI 托管模式：
+ 单模型端点
  + 这是 SageMaker AI 的默认操作模式。在此模式下，Triton 容器可以加载单个模型或单个组合模型。
  + 模型名称必须作为容器环境的属性传递，容器环境是 `CreateModel` SageMaker AI API 调用的一部分。用于传入模型名称的环境变量是 `SAGEMAKER_TRITON_DEFAULT_MODEL_NAME`。
+ 带组合的单模型端点
  + Triton Inference Server 支持模型的*组合*，即管道或 DAG（Directed Acyclic Graph，有向无环图）。*虽然从技术上讲，一个集合由多个模型组成，但在默认的单模型端点模式下， 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-Header-Content-Length`标头不同，因为 AI 中 SageMaker 不允许使用自定义标头。

## 使用 config.pbtxt 来设置模型配置
<a name="deploy-models-frameworks-triton-config"></a>

对于 SageMaker AI 上的 Triton 推理服务器，每个模型都必须包含一个至少指定模型以下配置的`config.pbtxt`文件：
+ `name`：虽然这对于在 SageMaker AI 之外运行的模型是可选的，但我们建议您始终为要在 Triton on SageMaker AI 中运行的模型提供一个名称。
+ [`platform` 和/或 `backend`](https://github.com/triton-inference-server/backend/blob/main/README.md#backends)：设置后端对于指定模型类型至关重要。一些后端还会进一步分类，例如 `tensorflow_savedmodel` 或 ` tensorflow_graphdef`。除了 `platform` 键之外，此类选项还可以指定为 `backend` 键的一部分。最常见的后端是 `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 人工智能指标的单个模型，例如。`LoadedModelCount`

## 将默认 Triton 指标发布到亚马逊 CloudWatch
<a name="deploy-models-frameworks-triton-metrics"></a>

NVIDIA Triton 推理容器在 8002 端口（可配置）公开不同模型的指标，这些指标在 Triton 推理服务器中使用。 GPUs 有关可用默认指标的完整详细信息，请参阅 [Triton 推理服务器](https://github.com/triton-inference-server/server/blob/main/docs/user_guide/metrics.md)指标 GitHub 页面。这些指标采用 Prometheus 格式，可以使用 Prometheus 抓取程序配置进行抓取。

从 v23.07 版本开始， SageMaker AI Triton 容器支持 CloudWatch 通过指定一些环境变量将这些指标发布到亚马逊。为了获取 Prometheus 的指标， SageMaker AI Triton 容器利用了亚马逊代理。 CloudWatch 

收集指标时所要指定的必需环境变量如下所示：


| 环境变量 | 说明 | 示例值 | 
| --- | --- | --- | 
| `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" | 

在 SageMaker AI 上使用 Triton 发布指标时，请记住以下限制：
+ 虽然您可以通过 C-API 和 Python 后端（v23.05 及更高版本）生成自定义指标，但目前不支持将这些指标发布到亚马逊。 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 多模型端点模式下运行。 | 布尔值 | `true`, `false` | 
| `SAGEMAKER_TRITON_DEFAULT_MODEL_NAME` | 指定要在 SageMaker AI 单一模型（默认）模式下加载的模型。对于组合模式，请指定组合正本的名称。 | 字符串 | {{<model\_name>}}如 config.pbtxt 中所述 | 
| `SAGEMAKER_TRITON_PING_MODE` | `'ready'`是 SageMaker AI 单模型模式下的默认模式，`'live'`也是 SageMaker AI 的多模型端点模式中的默认模式。 | 字符串 | `ready`, `live` | 
| `SAGEMAKER_TRITON_DISABLE_MODEL_NAMESPACING` | 在 SageMaker AI Triton 容器中，`true`默认设置为。 | 布尔值 | `true`, `false` | 
| `SAGEMAKER_BIND_TO_PORT` | 在 SageMaker AI 上，默认端口为 8080。在多容器场景中，您可以将该端口自定义为其他端口。 | 字符串 | {{<port\_number>}} | 
| `SAGEMAKER_SAFE_PORT_RANGE` | 这是由 SageMaker AI 平台在使用多容器模式时设置的。 | 字符串 | {{<port\_1>}}–{{<port\_2>}} | 
| `SAGEMAKER_TRITON_ALLOW_GRPC` | 虽然 SageMaker 人工智能目前不支持 GRPC，但如果你在自定义反向代理前使用 Triton，你可以选择启用 GRPC。 | 布尔值 | `true`, `false` | 
| `SAGEMAKER_TRITON_GRPC_PORT` | GRPC 的默认端口是 8001，不过您可以进行更改。 | 字符串 | {{<port\_number>}} | 
| `SAGEMAKER_TRITON_THREAD_COUNT` | 您可以设置默认 HTTP 请求处理程序线程的数量。 | 字符串 | {{<number>}} | 
| `SAGEMAKER_TRITON_LOG_VERBOSE` | `true`默认情况下，在 SageMaker AI 上，但您可以有选择地关闭此选项。 | 布尔值 | `true`, `false` | 
| `SAGEMAKER_TRITON_LOG_INFO` | `false`默认情况下，在 SageMaker AI 上。 | 布尔值 | `true`, `false` | 
| `SAGEMAKER_TRITON_LOG_WARNING` | `false`默认情况下，在 SageMaker AI 上。 | 布尔值 | `true`, `false` | 
| `SAGEMAKER_TRITON_LOG_ERROR` | `false`默认情况下，在 SageMaker AI 上。 | 布尔值 | `true`, `false` | 
| `SAGEMAKER_TRITON_SHM_DEFAULT_BYTE_SIZE` | 指定 Python 后端的 shm 大小，以字节为单位。默认值为 16 MB，但可以增加。 | 字符串 | {{<number>}} | 
| `SAGEMAKER_TRITON_SHM_GROWTH_BYTE_SIZE` | 指定 Python 后端的 shm 增长大小，以字节为单位。默认值为 1 MB，但可以增加以提供更大的增量。 | 字符串 | {{<number>}} | 
| `SAGEMAKER_TRITON_TENSORFLOW_VERSION` | 默认值为 `2`。Triton 不再支持 Triton v23.04 中的 Tensorflow 2。您可以为以前的版本配置此变量。 | 字符串 | {{<number>}} | 
| `SAGEMAKER_TRITON_MODEL_LOAD_GPU_LIMIT` | 限制模型加载所能使用的最大 GPU 内存百分比，以便让其余部分可用于推理请求。 | 字符串 | {{<number>}} | 
| `SAGEMAKER_TRITON_ALLOW_METRICS` | `false`默认情况下，在 SageMaker AI 上。 | 布尔值 | `true`, `false` | 
| `SAGEMAKER_TRITON_METRICS_PORT` | 默认端口为 8002。 | 字符串 | {{<number>}} | 
| `SAGEMAKER_TRITON_PUBLISH_METRICS_TO_CLOUDWATCH` | `false`默认情况下，在 SageMaker AI 上。将此变量设置为，允许`true`将 Triton 的默认指标推送到亚马逊 CloudWatch。如果启用此选项，则在向您的账户发布指标时，您需要承担 CloudWatch 费用。 | 布尔值 | `true`, `false` | 
| `SAGEMAKER_TRITON_CLOUDWATCH_LOG_GROUP` | 如果您已启用向发布指标的功能，则为必填项 CloudWatch。 | 字符串 | {{<cloudwatch\_log\_group\_name>}} | 
| `SAGEMAKER_TRITON_CLOUDWATCH_METRIC_NAMESPACE` | 如果您已启用向发布指标的功能，则为必填项 CloudWatch。 | 字符串 | {{<cloudwatch\_metric\_namespace>}} | 
| `SAGEMAKER_TRITON_ADDITIONAL_ARGS` | 在启动 Triton 服务器时附上任何其他参数。 | 字符串 | {{<additional\_args>}} | 