文章目录
- 一、trtexec简介
- 二、trtexec使用
- 1.trtexec常用参数
- 1. 构建阶段
- 2. 运行阶段
- 2.基本使用方法
- 1. trtexec最基本的使用方法,读取onnx模型并通过trtexec测试推理性能。
- 2. trtexec解析ONNX文件,使用优化选择构建TensorRT引擎并保存至.plan文件
- 补充:timingCacheFile的原理与作用
- 3. 加载engine并做推理
- 4. 输出engine信息
- 5. 输出分析信息
- 6. 保存测试的输入输出数据
- 7. 指定输入进行测试
- 8. 构建并运行带plugin的engine
- 3.进阶使用
- 三、注意事项
- 总结
一、trtexec简介
trtexec 工具是 TensorRT 的命令行工具,位于 TensorRT 的安装目录中,随 TensorRT 的安装就可以直接使用。trtexec,不仅打包了几乎所有 TensorRT 脚本可以完成的工作,并且扩展丰富的推理性能测试的功能。通常我们使用 trtexec 完成下面三个方面的工作,一是由 Onnx 模型文件生成 TensorRT 推理引擎
,并且可以序列化为 .plan 文件。二是可以查看 Onnx 或者 .plan 文件的网络的逐层信息
。第三是可以进行模型性能测试
,也就是测试 TensorRT 引擎基于随机数输入或者是给定输入下的性能,这是其最常用的功能
。
二、trtexec使用
1.trtexec常用参数
1. 构建阶段
2. 运行阶段
完整的trtexec参数说明请参考:trtexec官方文档
2.基本使用方法
1. trtexec最基本的使用方法,读取onnx模型并通过trtexec测试推理性能。
# 01-Run trtexec from ONNX file without any more option
trtexec \
--onnx=modelA.onnx \
> result-01.log 2>&1
在不给定trtexec的输入形状时,TensorRT 将以静态输入形状
运行 ONNX 模型。输入和输出张量的形状在编译模型时被指定为静态值
,这意味着在整个模型推理过程中,输入输出张量的形状在运行时不可改变。
与之相对应的是动态形状模式
(dynamic-shapes mode),在该模式下,输入和输出张量的形状可以在运行时动态地改变。然而,trtexec 命令默认使用静态输入模式,除非你明确指定输入的最大最小形状以及最佳形状,那么trtexec将执行显式的
形状推断。
在静态输入形状模式(我理解为隐式implicit batch模式)下,TensorRT 可以更好地进行优化,因为它可以在编译时推断和优化模型的各个层的形状和尺寸。这可以提高模型的推理性能,但也意味着输入和输出张量的形状必须在编译时固定
。
2. trtexec解析ONNX文件,使用优化选择构建TensorRT引擎并保存至.plan文件
# 02-Parse ONNX file, build and save TensorRT engine with more options
trtexec \
--onnx=modelA.onnx \
--saveEngine=model-02.plan \
--timingCacheFile=model-02.cache \
--minShapes=tensorX:1x1x28x28 \
--optShapes=tensorX:4x1x28x28 \
--maxShapes=tensorX:16x1x28x28 \
--fp16 \
--noTF32 \
--memPoolSize=workspace:1024MiB \
--builderOptimizationLevel=5 \
--maxAuxStreams=4 \
--skipInference \
--verbose \
> result-02.log 2>&1
–onnx=modelA.onnx:这个选项指定了要解析和构建的输入ONNX文件(modelA.onnx)。
–saveEngine=model-02.plan:这个选项指定了保存生成的TensorRT引擎的文件名为model-02.plan。
–timingCacheFile=model-02.cache:这个选项指定了保存计时缓存的文件名为model-02.cache,用于在后续运行中加速引擎构建过程。
–minShapes=tensorX:1x1x28x28:这个选项指定了最小输入形状,其中tensorX是输入张量的名称,1x1x28x28是指定的形状。
–optShapes=tensorX:4x1x28x28:这个选项指定了优化输入形状,以便在引擎构建过程中进行形状优化。
–maxShapes=tensorX:16x1x28x28:这个选项指定了最大输入形状,用于支持动态形状
的推理。
–fp16:这个选项启用FP16精度,以减少内存占用和提高推理性能。
–noTF32:这个选项禁用TF32
精度,以确保使用FP16进行计算。
–memPoolSize=workspace:1024MiB:这个选项指定了TensorRT引擎的内存池大小为1024MiB,用于分配内存。
–builderOptimizationLevel=5:这个选项指定了引擎构建器的优化级别为5,进行更多的优化。
–maxAuxStreams=4:这个选项指定了最大的辅助流数为4,用于并行执行某些操作。
–skipInference:这个选项指示在构建引擎后跳过实际的推理过程
。
–verbose:这个选项启用详细的
输出信息,以便更好地了解引擎构建和优化过程。
补充:timingCacheFile的原理与作用
--timingCacheFile=model-02.cache
选项用于指定保存计时缓存
的文件名。计时缓存是一个用于加速引擎构建过程的文件,它记录了在之前构建相同模型时的层级和层级间计算时间信息
。
计时缓存的作用
是避免重复计算
相同层级和层级间的时间。在构建引擎时,TensorRT会评估和记录每个层级的计算时间,然后将这些信息保存到计时缓存中。当再次构建相同模型
时,TensorRT可以利用缓存中的计时信息,避免重新评估层级的计算时间,从而加速引擎构建过程。
计时缓存的原理
是根据层级和层级间的计算时间,建立一个映射关系。当构建引擎时,TensorRT会检查缓存文件中是否存在相应的计时信息。如果存在,TensorRT将直接使用缓存中的时间信息,避免重新评估。如果缓存文件不存在或不匹配,TensorRT将重新评估计算时间并更新缓存。
通过使用计时缓存,可以显著减少引擎构建的时间
,特别是对于大型模型和复杂计算图的情况。计时缓存文件可以在之后的引擎构建过程中重复使用,以提高构建的效率。
需要注意的是,计时缓存文件是特定于模型和硬件
的。如果模型结构或硬件配置发生变化,计时缓存文件可能会失效,需要重新构建。因此,在使用计时缓存时,确保模型和硬件配置保持一致才能获得最佳的性能加速效果。
3. 加载engine并做推理
# 03-Load TensorRT engine built above and do inference
trtexec \
--loadEngine=model-02.plan \
--shapes=tensorX:4x1x28x28 \
--noDataTransfers \
--useSpinWait \
--useCudaGraph \
--verbose \
> result-03.log 2>&1
–loadEngine=model-02.plan:这个选项指定了要加载的TensorRT引擎文件(model-02.plan)。
–shapes=tensorX:4x1x28x28:这个选项指定了输入形状,其中tensorX是输入张量的名称,4x1x28x28是指定的形状。
–noDataTransfers:这个选项禁用数据传输。在推理过程中,TensorRT默认会将输入和输出数据从主机内存传输到GPU内存,然后再传输回主机内存。使用–noDataTransfers选项可以避免这些数据传输,从而提高推理的效率。
–useSpinWait:这个选项启用自旋等待。在GPU计算完成后,TensorRT默认会使用阻塞方式等待结果,即线程会被挂起。使用–useSpinWait选项可以改为使用自旋等待,即线程会循环检查计算是否完成,避免线程挂起和恢复的开销,提高推理效率。
–useCudaGraph:这个选项启用CUDAGraph。TensorRT可以将推理计算图编译为CUDAGraph以提高推理性能。
4. 输出engine信息
# 04-Print information of the TensorRT engine (TensorRT>=8.4)
# Notice
# + Start from ONNX file because option "--profilingVerbosity=detailed" should be added during buildtime
# + output of "--dumpLayerInfo" locates in result*.log file, output of "--exportLayerInfo" locates in specified file
trtexec \
--onnx=modelA.onnx \
--skipInference \
--profilingVerbosity=detailed \
--dumpLayerInfo \
--exportLayerInfo="./model-04-exportLayerInfo.log" \
> result-04.log 2>&1
注意:
1、输入为onnx模型;
2、–dumpLayerInfo 输出的信息在result-04.log;
3、–exportLayerInfo 输出的信息在model-04-exportLayerInfo.log;
5. 输出分析信息
# 05-Print information of profiling
# Notice
# + output of "--dumpProfile" locates in result*.log file, output of "--exportProfile" locates in specified file
trtexec \
--loadEngine=./model-02.plan \
--dumpProfile \
--exportTimes="./model-02-exportTimes.json" \
--exportProfile="./model-02-exportProfile.json" \
> result-05.log 2>&1
不常用,NVIDIA的Nsight system可以代替实现。
6. 保存测试的输入输出数据
# 06-Save data of input/output
# Notice
# + output of "--dumpOutput" locates in result*.log file, output of "--dumpRawBindingsToFile" locates in *.raw files
trtexec \
--loadEngine=./model-02.plan \
--dumpOutput \
--dumpRawBindingsToFile \
> result-06.log 2>&1
补充:*.raw文件可以通过python解析出来查看。
7. 指定输入进行测试
# 07-Run TensorRT engine with loading input data
trtexec \
--loadEngine=./model-02.plan \
--loadInputs=tensorX:tensorX.input.1.1.28.28.Float.raw \
--dumpOutput \
> result-07.log 2>&1
8. 构建并运行带plugin的engine
# 08-Build and run TensorRT engine with plugins
make
trtexec \
--onnx=modelB.onnx \
--plugins=./AddScalarPlugin.so \
> result-08.log 2>&1
注意:我们首先需要编译plugin文件得到plugin.so的可执行文件。
3.进阶使用
待完成
三、注意事项
待完成
总结
待完成