并发推理和动态批处理#
本示例的目的是演示 Triton 推理服务器的重要特性,例如并发模型执行和动态批处理。
我们将使用一个专门构建的可部署行人检测模型,该模型可从 Nvidia GPU Cloud (NGC) 下载。
获取模型#
从 NGC 下载剪枝后的 PeopleNet 模型。此模型是即用型模型,您可以使用 wget
方法
wget --content-disposition https://api.ngc.nvidia.com/v2/models/nvidia/tao/peoplenet/versions/pruned_v2.1/zip -O pruned_v2.1.zip
或通过 CLI 命令从 NGC 下载。
ngc registry model download-version "nvidia/tao/peoplenet:pruned_v2.1"
对于后者,您需要设置 NGC CLI。
从 NGC 下载模型后,将压缩包 peoplenet_pruned_v2.1.zip
解压到 concurrency_and_dynamic_batching/tao/models/peoplenet
。
如果您的压缩包位于 concurrency_and_dynamic_batching
目录中,则以下命令将自动将模型放置到正确的位置
unzip pruned_v2.1.zip -d $(pwd)/tao/models/peoplenet
验证您是否可以在以下位置看到模型文件 resnet34_peoplenet_pruned.etlt
concurrency_and_dynamic_batching
└── tao
└── models
└── peoplenet
├── labels.txt
└── resnet34_peoplenet_pruned.etlt
将模型转换为 TensorRT#
在您以 .etlt
格式获取模型文件后,您需要将模型转换为 TensorRT 格式。NVIDIA TensorRT 是用于高性能深度学习推理的 SDK。它包含深度学习推理优化器和运行时,可为深度学习推理应用提供低延迟和高吞吐量。最新版本的 JetPack 包含 TensorRT。
为了将 .etlt
模型转换为 TensorRT 格式,您需要使用 tao-converter
工具。
tao-converter
工具以针对不同平台的编译发布文件的形式提供。与您的部署系统对应的下载链接在 TLT 入门资源中提供。
下载 tao-converter
后,您可能需要执行
chmod 777 tao-converter
在工具所在的目录中。
我们提供了一个转换脚本 tao/convert_peoplenet.sh
,该脚本期望模型位于该位置。
tao
└── models
└── peoplenet
要执行它,您可以将 tao-converter
可执行文件放置到项目的 tao
目录中,并在同一目录中运行
bash convert_peoplenet.sh
执行后,验证是否已将 model.plan
文件放置到目录 /trtis_model_repo_sample_1/peoplenet/1
和 /trtis_model_repo_sample_2/peoplenet/1
。请注意,我们为同一模型准备了两个略有不同的仓库,以演示 Triton 的不同功能。
另请注意,此步骤必须在目标硬件上执行:如果您计划在 Jetson 上执行此应用程序,则必须在 Jetson 上执行转换。
要了解有关 tao-converter
参数的更多信息,请运行
./tao-converter -h
构建应用#
要编译示例,请拉取以下仓库
确保您已将下载的版本的内容复制到 $HOME
sudo cp -rf tritonserver2.x.y-jetpack4.6 $HOME/tritonserver
在 concurrency_and_dynamic_batching
中打开终端并执行以下命令构建应用
make
Jetson 提供了一个示例 Makefile。
演示案例 1:并发模型执行#
借助 Triton 推理服务器,多个模型(或同一模型的多个实例)可以在同一 GPU 或多个 GPU 上同时运行。在本示例中,我们将演示如何在单个 Jetson GPU 上运行同一模型的多个实例。
运行示例#
要从终端执行,请从 concurrency_and_dynamic_batching
目录运行
LD_LIBRARY_PATH=$HOME/tritonserver/lib ./people_detection -m system -v -r $(pwd)/trtis_model_repo_sample_1 -t 6 -s false -p $HOME/tritonserver
参数 -t
控制我们要执行的并发推理调用的数量。我们将在同一示例图像上执行同一模型,目的是演示设置不同的并发选项如何影响性能。
您可以启用将检测到的边界框以覆盖原始图像的形式保存在项目目录中,用于每个执行线程。您可以通过在执行时将参数 -s
设置为 true
来打开可视化(默认情况下 -s
设置为 false
)。
预期输出#
执行后,在终端日志中,您将看到 json 格式的模型 ‘peoplenet’ 统计信息,反映推理性能。我们还输出了总推理时间,它只是反映了运行应用程序所需的总时间,包括数据加载、预处理和后处理。
模型 ‘peoplenet’ 统计信息的日志中的典型输出如下所示
{
"model_stats":[
{
"name":"peoplenet",
"version":"1",
"last_inference":1626448309997,
"inference_count":6,
"execution_count":6,
"inference_stats":{
"success":{
"count":6,
"ns":574589968
},
"fail":{
"count":0,
"ns":0
},
"queue":{
"count":6,
"ns":234669630
},
"compute_input":{
"count":6,
"ns":194884512
},
"compute_infer":{
"count":6,
"ns":97322636
},
"compute_output":{
"count":6,
"ns":47700806
}
},
"batch_stats":[
{
"batch_size":1,
"compute_input":{
"count":6,
"ns":194884512
},
"compute_infer":{
"count":6,
"ns":97322636
},
"compute_output":{
"count":6,
"ns":47700806
}
}
]
}
]
}
"TOTAL INFERENCE TIME: 174ms"
要了解有关不同统计信息的更多信息,请查看文档。
要查看设置不同的并发值如何影响总执行时间及其在模型统计信息中反映的组件,您需要修改模型配置文件中的单个参数。
要为模型启用并发模型执行支持,相应的模型配置文件 trtis_model_repo_sample_1/peoplenet/config.pbtxt
包含以下内容
instance_group [
{
count: 3
kind: KIND_GPU
}
]
您可以更改同一模型实例的允许推理计数,并观察它如何影响模型 ‘peoplenet’ 统计信息和总推理时间中的性能。请注意,在 Jetson 上,我们不建议将值设置得太高:例如,在 Jetson Xavier AGX 等设备上,我们不建议将数字设置得大于 6。1-3 范围内的值是最佳的。
在尝试不同的值时,请注意它如何影响总推理时间以及一些推理统计信息(如队列时间和计算时间)
演示案例 2:动态批处理#
对于支持批处理的模型,Triton 实现了多种调度和批处理算法,这些算法将单个推理请求组合在一起,以提高推理吞吐量。在本示例中,我们想演示启用自动动态批处理如何影响推理性能。
运行示例#
要观察动态批处理的效果,请从 concurrency_and_dynamic_batching
目录执行
LD_LIBRARY_PATH=$HOME/tritonserver/lib ./people_detection -m system -v -r $(pwd)/trtis_model_repo_sample_2 -t 6 -s false -p $HOME/tritonserver
预期输出#
查看模型 ‘peoplenet’ 统计信息和总推理时间,以了解动态批处理的效果。可能的结果应如下所示
{
"model_stats":[
{
"name":"peoplenet",
"version":"1",
"last_inference":1626447787832,
"inference_count":6,
"execution_count":2,
"inference_stats":{
"success":{
"count":6,
"ns":558981051
},
"fail":{
"count":0,
"ns":0
},
"queue":{
"count":6,
"ns":49271380
},
"compute_input":{
"count":6,
"ns":170634044
},
"compute_infer":{
"count":6,
"ns":338079193
},
"compute_output":{
"count":6,
"ns":950544
}
},
"batch_stats":[
{
"batch_size":1,
"compute_input":{
"count":1,
"ns":15955684
},
"compute_infer":{
"count":1,
"ns":29917093
},
"compute_output":{
"count":1,
"ns":152264
}
},
{
"batch_size":5,
"compute_input":{
"count":1,
"ns":30935672
},
"compute_infer":{
"count":1,
"ns":61632420
},
"compute_output":{
"count":1,
"ns":159656
}
}
]
}
]
}
"TOTAL INFERENCE TIME: 162ms"
请注意,这次模型仅执行了两次(如 execution_count
所示)。此外,与之前的示例不同,统计信息的 batch_stats
部分看起来有所不同:我们看到我们的模型执行了一次,其中 batch = 1
,第二次执行中 batch = 5
。这有助于减少总推理时间。
为了启用动态批处理,模型配置 trtis_model_repo_sample_2/peoplenet/config.pbtxt
中存在以下内容
dynamic_batching {
}
要尝试动态批处理器的更多选项,请参阅文档。
您还可以尝试同时启用并发模型执行和动态批处理。