概述
-
模型与 Triton 兼容吗?
-
如果您的模型属于 Triton 支持的后端之一,那么可以简单地尝试按照快速入门指南中所述部署模型。 对于ONNXRuntime,TensorFlow SavedModel和TensorRT后端,可以使用Triton的自动完成功能从模型中推断出最小模型配置。 这意味着仍然可以提供 ,但不是必需的,除非您要显式设置某些参数。 此外,通过 启用详细日志记录,您可以在服务器日志输出中看到 Triton 内部看到的完整配置。 对于其他后端,请参阅入门所需的最低模型配置。
config.pbtxt
--log-verbose=1
-
如果模型不是来自受支持的后端,则可以查看 Python 后端或编写自定义C++后端来支持模型。 Python 后端提供了一个简单的接口,用于通过通用 python 脚本执行请求,但性能可能不如自定义C++后端。 根据您的用例,Python 后端性能可能是实现简单性的充分权衡。
-
-
可以对服务模型运行推理吗?
-
假设您能够在 Triton 上加载模型,下一步是验证我们是否可以运行推理请求并获得模型的基准性能基准。 Triton的Perf分析仪工具特别适合此目的。下面是一个简化的输出 演示目的:
# NOTE: "my_model" represents a model currently being served by Triton $ perf_analyzer -m my_model ... Inferences/Second vs. Client Average Batch Latency Concurrency: 1, throughput: 482.8 infer/sec, latency 12613 usec
<button class="copybtn o-tooltip--left" data-tooltip="Copy" data-clipboard-target="#codecell0"></button>-
这为我们提供了一个性能测试,我们能够成功形成输入请求并接收输出响应,以通过 Triton API 与模型后端进行通信。
-
如果 Perf 分析器无法发送请求,并且从错误中不清楚如何继续,则可能需要检查模型输入/输出是否与模型预期匹配。 如果配置正确,请检查模型是否直接使用其原始框架成功运行。 如果您没有自己的脚本或工具,Polygraphy 是一个有用的工具,可以通过各种框架在您的模型上运行示例推理。 目前,Polygraphy支持ONNXRuntime,TensorRT和TensorFlow 1.x。
config.pbtxt
-
“表现良好”的定义可能会因每个用例而发生变化。 一些常见的指标是吞吐量、延迟和 GPU 利用率。 有许多变量可以在模型配置 () 中进行调整以获得不同的结果。
config.pbtxt
-
随着模型、配置或用例的发展,Perf 分析器是快速验证模型功能和性能的绝佳工具。
-
-
如何提高模型性能?
-
为了进一步了解您可以为您的用例向 Triton 提供的最佳模型配置,Triton 的模型分析器工具可以提供帮助。 模型分析器可以自动或手动搜索配置组合,以找到满足约束条件的最佳Triton配置。 运行模型分析器以找到模型/用例的最佳配置后,您可以将生成的配置文件传输到模型存储库。 模型分析器提供了一个快速入门指南,其中包含一些要演练的示例。
-
使用模型分析器找到的新优化配置文件为模型提供服务并再次运行 Perf 分析器后,与默认配置相比,在大多数情况下,您应该期望找到更好的性能数字。
-
某些可以为模型优化的参数可能不会向模型分析器的自动搜索公开,因为它们不适用于所有模型。 例如,后端可以公开特定于后端的配置选项,这些选项也可以进行调整。 例如,ONNXRuntime 后端具有多个参数,这些参数会影响对模型执行推理时的并行化级别。 如果默认值未提供足够的性能,则可能值得调查这些特定于后端的选项。 若要调整自定义参数集,模型分析器支持手动配置搜索。
-
要了解有关模型配置的进一步优化的更多信息,请参阅优化文档。
-
其他感兴趣的领域
-
我的模型在首次由 Triton 加载时性能缓慢(冷启动惩罚),我该怎么办?
-
Triton 公开了在首次加载模型时运行 ModelWarmup 请求的功能,以确保模型在标记为“READY”进行推理之前充分预热。
-
-
为什么我的模型在 GPU 上的表现没有明显提高?
-
Triton 支持的大多数官方后端都针对 GPU 推理进行了优化,并且应该在开箱即用的 GPU 上运行良好。
-
Triton 为您提供了在 GPU 上进一步优化模型的选项。Triton 的框架特定优化将更详细地介绍此主题。
-
将模型完全转换为针对 GPU 推理进行全面优化的后端(如 TensorRT)可能会提供更好的结果。 您可以在 TensorRT 后端找到更多特定于 TensorRT 的 Triton 详细信息。
-
如果以上都不能帮助您的模型获得足够的 GPU 加速性能,则该模型可能只是针对 CPU 执行进行更好的设计,而 OpenVINO 后端可能有助于进一步优化您的 CPU 执行。
-
端到端示例
注意如果您以前从未使用过 Triton,您可能有兴趣先查看快速入门示例。 对 Triton 的一些基本了解可能对下一节有用,但此示例在没有先前经验的情况下足够简单。
让我们以 ONNX 模型为例,因为 ONNX 被设计为一种可以轻松地从大多数其他框架导出的格式。
-
创建一个模型存储库并将我们的示例模型下载到其中。
densenet_onnx
# Create model repository with placeholder for model and version 1
mkdir -p ./models/densenet_onnx/1
# Download model and place it in model repository
wget -O models/densenet_onnx/1/model.onnx
https://contentmamluswest001.blob.core.windows.net/content/14b2744cf8d6418c87ffddc3f3127242/9502630827244d60a1214f250e3bbca7/08aed7327d694b8dbaee2c97b8d0fcba/densenet121-1.2.onnx
<button class="copybtn o-tooltip--left" data-tooltip="Copy" data-clipboard-target="#codecell1"></button>name: "densenet_onnx"
backend: "onnxruntime"
max_batch_size: 0
input: [
{
name: "data_0",
data_type: TYPE_FP32,
dims: [ 1, 3, 224, 224]
}
]
output: [
{
name: "prob_1",
data_type: TYPE_FP32,
dims: [ 1, 1000, 1, 1 ]
}
]
<button class="copybtn o-tooltip--left" data-tooltip="Copy" data-clipboard-target="#codecell2"></button>注意从 22.07 版本开始,Triton 和模型分析器都支持完全自动完成支持它的后端的配置文件。 因此,例如,对于 ONNX 模型,可以跳过此步骤,除非要显式设置某些参数。
-
在后台启动服务器和客户端容器
这些容器可以交互方式启动,但为了演示起见,更清楚地是在后台启动这些容器,并根据以下步骤的需要将其启动到它们中。docker exec
# Start server container in the background
docker run -d --gpus=all --network=host -v $PWD:/mnt --name triton-server nvcr.io/nvidia/tritonserver:23.05-py3
# Start client container in the background
docker run -d --gpus=all --network=host -v $PWD:/mnt --name triton-client nvcr.io/nvidia/tritonserver:23.05-py3-sdk
<button class="copybtn o-tooltip--left" data-tooltip="Copy" data-clipboard-target="#codecell3"></button>注意正在将主机上的当前目录装载到容器内的目录中。 因此,如果您在 中创建模型存储库,您将在容器中找到它。 您可以根据需要更改这些路径。请参阅 docker 卷文档,了解有关其工作原理的更多信息。
-v $PWD:/mnt
/mnt
$PWD/models
/mnt/models
-
使用 Triton 为模型提供服务
为了服务于我们的模型,我们将使用已经启动的服务器容器,该容器预装了二进制文件。tritonserver
# Enter server container interactively
docker exec -ti triton-server bash
# Start serving your models
tritonserver --model-repository=/mnt/models
<button class="copybtn o-tooltip--left" data-tooltip="Copy" data-clipboard-target="#codecell4"></button>为了检查模型是否成功加载,我们希望在上一个命令的输出中看到我们的模型处于某种状态:READY
...
I0802 18:11:47.100537 135 model_repository_manager.cc:1345] successfully loaded 'densenet_onnx' version 1
...
+---------------+---------+--------+
| Model | Version | Status |
+---------------+---------+--------+
| densenet_onnx | 1 | READY |
+---------------+---------+--------+
...
<button class="copybtn o-tooltip--left" data-tooltip="Copy" data-clipboard-target="#codecell5"></button>-
验证模型是否可以运行推理
为了验证我们的模型是否可以执行推理,我们将使用预装的容器。triton-client
perf_analyzer
在单独的 shell 中,我们使用 Perf 分析器来检查是否可以运行推理并获取我们期望从此模型获得的性能类型的基线。
在下面的示例中,Perf 分析器将请求发送到在同一台计算机上服务的模型(通过 从服务器容器发送请求)。 但是,您也可以通过设置标志来测试在某些位置远程提供的模型,例如 。localhost
--network=host
<IP>:<PORT>
-u
perf_analyzer -m densenet_onnx -u 127.0.0.1:8000
# Enter client container interactively
docker exec -ti triton-client bash
# Benchmark model being served from step 3
perf_analyzer -m densenet_onnx --concurrency-range 1:4
<button class="copybtn o-tooltip--left" data-tooltip="Copy" data-clipboard-target="#codecell6"></button>...
Inferences/Second vs. Client Average Batch Latency
Concurrency: 1, throughput: 265.147 infer/sec, latency 3769 usec
Concurrency: 2, throughput: 890.793 infer/sec, latency 2243 usec
Concurrency: 3, throughput: 937.036 infer/sec, latency 3199 usec
Concurrency: 4, throughput: 965.21 infer/sec, latency 4142 usec
<button class="copybtn o-tooltip--left" data-tooltip="Copy" data-clipboard-target="#codecell7"></button>-
Run Model Analyzer to find the best configurations for our model
While Model Analyzer comes pre-installed in the SDK (client) container and supports various modes of connecting to a Triton server, for simplicity we will use install Model Analyzer in our container to use the (default) mode. To learn more about other methods of connecting Model Analyzer to a running Triton Server, see the Model Analyzer flag.server
local
--triton-launch-mode
# Enter server container interactively
docker exec -ti triton-server bash
# Stop existing tritonserver process if still running
# because model-analyzer will start its own server
SERVER_PID=`ps | grep tritonserver | awk '{ printf $1 }'`
kill ${SERVER_PID}
# Install model analyzer
pip install --upgrade pip
pip install triton-model-analyzer wkhtmltopdf
# Profile the model using local (default) mode
# NOTE: This may take some time, in this example it took ~10 minutes
model-analyzer profile \
--model-repository=/mnt/models \
--profile-models=densenet_onnx \
--output-model-repository-path=results
# Summarize the profiling results
model-analyzer analyze --analysis-models=densenet_onnx
<button class="copybtn o-tooltip--left" data-tooltip="Copy" data-clipboard-target="#codecell8"></button>示例模型分析器输出摘要:
在 51 种配置的 6 次测量中,提供最佳吞吐量:323 推断/秒。
densenet_onnx_config_3
在给定约束下,这比默认配置(92 个推断/秒)高出 168%。
模型配置名称 |
最大批量大小 |
动态批处理 |
实例计数 |
p99 延迟(毫秒) |
吞吐量(推断/秒) |
最大 GPU 内存使用量 (MB) |
平均 GPU 利用率 (%) |
---|---|---|---|---|---|---|---|
densenet_onnx_config_3 |
0 |
启用 |
4/显卡 |
35.8 |
323.13 |
3695 |
58.6 |
densenet_onnx_config_2 |
0 |
启用 |
3/显卡 |
59.575 |
295.82 |
3615 |
58.9 |
densenet_onnx_config_4 |
0 |
启用 |
5/显卡 |
69.939 |
291.468 |
3966 |
58.2 |
densenet_onnx_config_default |
0 |
禁用 |
1/显卡 |
12.658 |
167.549 |
3116 |
51.3 |
在上表中,我们看到将 GPU 实例计数设置为 4 使我们能够在此系统上实现最高的吞吐量和几乎最低的延迟。
另外,请注意,此模型具有固定的批大小,该大小在输入/输出的第一维中显式指定,因此参数设置为0,如此处所述。 对于支持动态批大小的模型,模型分析器还会调整参数。densenet_onnx
dims
max_batch_size
max_batch_size
警告这些结果特定于运行 Triton 服务器的系统,因此,例如,在较小的 GPU 上,我们可能不会看到增加 GPU 实例计数的改进。 通常,在具有不同硬件(CPU、GPU、RAM 等)的系统上运行相同的配置可能会提供不同的结果,因此在准确反映您将为用例部署模型的位置的系统上分析模型非常重要。
-
从模型分析器结果中提取最佳配置
在上面的示例中,是最佳配置