TensorRT入门:trtexec开发辅助工具的使用


一、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.进阶使用

待完成

三、注意事项

待完成


总结

待完成

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值