trtexec 工具使用
本文介绍trtexec工具的使用,trtexec可以实现onnx模型导出trt模型、耗时分析和模型优化分析等功能,本节将对 trtexec的运用进行介绍。
1.trtexec
trtexec是官方提供的命令行工具,主要用于一下三个方面
生成模型序列化文件:由ONNX文件生成 TensorRT 引擎并序列化为 Plan文件/engine文件
查看模型文件信息:查看 ONNX文件或 Plan 文件的网络逐层信息
模型性能测试:测试 TensorRT 引擎基于随机输入或给定输入下的性能
trtexec提供了大量参数,整体可分为构建和运行两个阶段。
构建阶段常用参数
--onnx=: onnx文件路径
--minShapes=, --optShapes=, and --maxShapes=: 当是onnx模型时,可指定batchsize的动态范围。
–-memPoolSize=: 优化过程可使用的最大内存
--saveEngine=: 保存的文件输出路径
--fp16, --int8, --noTF32, and --best: 指定数据精度
--verbose: 是否需要打印详细信息。默认是不打印详细信息。
--skipInference: 创建并保存引擎文件,不执行推理过程。
--timingCacheFile=: 记录每个tensor的最小最大值、运行时间等,可以用来分析量化效果。
--dumpLayerInfo, --exportLayerInfo=: 打印及保存每一层详细信息 更多高级用法,
参考官方文档:https://docs.nvidia.com/deeplearning/tensorrt/developer-guide/index.html#trtexec
运行阶段常用参数
--loadEngine=: 要加载的模型文件
--shapes=:指定输入张量的形状 --loadInputs=: Load input values from files. Default is to generate random inputs.
--warmUp=, 热身阶段最短运行时间,单位ms
--duration=, 测试阶段最短运行时间,单位s
--iterations=: 测试阶段最小迭代次数
--useCudaGraph: 采用 CUDA graph 捕获和执行推理过程
--noDataTransfers: 关闭host与device之间的数据传输
--dumpProfile, --exportProfile=: 打印及保存每一层性能信息
--dumpLayerInfo, --exportLayerInfo=: 打印及保存每一层详细信息 更多高级用法,参考官方文档:https://docs.nvidia.com/deeplearning/tensorrt/developer-guide/index.html#trtexec
案例0:固定batchsize
输出固定batchsize的engine文件,这里需要注意,batchsize的状态需要与ONNX匹配,因此在生成onnx时需要设置好。
trtexec --onnx=resnet50_bs_1.onnx --saveEngine=resnet50_bs_1.engine
案例1: 动态batchsize使用 resnet50_bs_dynamic.onnx 可通过第十一章章生成
trtexec --onnx=resnet50_bs_dynamic.onnx --saveEngine=resnet50_bs_dynamic_1-32-64.engine --timingCacheFile=dynamic-1-32-64.c ache --minShapes=input:1x3x224x224 --maxShapes=input:64x3x224x224 --optShapes=input:16x3x224x224
通过下表可知,fp32时,大batchsize带来吞吐量增加不明显,因此可考虑时延的平衡,选择batchsize=8。
案例2:fp32、fp16、int8 性能比较
运行配套代码中的run.bat/run.sh,可以查看log,观察吞吐量、时延的变化。
如下图所示,吞吐量方面
fp16相较于fp32有约2~3倍提升,int8相较于fp16约2倍提升
相同精度时,吞吐量随batchsize增加,但在32后增速不明显。int8随着batchsize增速潜力更大。
时延方面
时延随着batchsize是线性增长
fp32, fp16, int8的时延依次递减一半
案例3:查看层详细信息
通过参数--dumpLayerInfo --exportLayerInfo,可以输出各层详细信息,以及融合情况,还有输入输出张量的名字 (Bindings)
trtexec --onnx=resnet50_bs_dynamic.onnx --saveEngine=demo.engine --skipInference --dumpLayerInfo --exportLayerInfo="exportL ayerInfo.log"
在exportLayerInfo.log文件中可以看到如下信息,主要包括
各网络层内容,以及融合情况“Reformatting CopyNode for Input Tensor 0 to Conv_0 + Relu_1”
Reformatting CopyNode 表示 TensorRT 将输入tensor 0 复制(Copy)到 Conv_0 和 Relu_1 两个层进行了融合 (Reformatting)。这里的 Reformatting 指的是 TensorRT 在优化网络结构时,会将一些层进行融合,以减少内存拷 贝和提高计算效率。CopyNode 则表示插入了一个拷贝层,用于将输入数据复制到融合后新的层中。
这种层的融合可以减少内存访问,优化数据流,从而提升推理性能。
Bindings:包括输入输出张量的名称,这个在onnx导出时设定的,在下游python推理代码中也会用到。
{"Layers": ["Reformatting CopyNode for Input Tensor 0 to Conv_0 + Relu_1" ,"Conv_0 + Relu_1"
,"MaxPool_2" ,"Conv_3 + Relu_4" ,"Conv_5 + Relu_6" ... ,"Reformatting CopyNode for Input Tensor 0 to Gemm_121" ,"Gemm_121" ,"reshape_after_Gemm_121" ], "Bindings": ["input" ,"output" ]}
案例4:verbose中的日志内容
打开verbose开关后,trtexec将输出详细内容,包括以下六大模块:
导入模型情况:模型格式、名称
参数配置情况:设置了哪些参数进行优化,例如 --fp16等
设备情况:当前GPU device具体信息
计算图优化细节:详细描述网络层融合情况,计算图优化结果
网络层实现方式选择(几千行):打印每个网络层选择的kernel的过程,挑选耗时最低的方法
耗时统计:统计推理耗时时间,包括数据拷贝、推理等耗时的统计值
trtexec --onnx=resnet50_bs_dynamic.onnx --saveEngine=demo.engine --verbose > verbose.log 执行以下命令,可获得日志文件,下面对主要内容进行介绍。
Model Options :包含导入的模型内容
[08/20/2023-11:59:45] [I] === Model Options ===
[08/20/2023-11:59:45] [I] Format: ONNX
[08/20/2023-11:59:45] [I] Model: resnet50_bs_dynamic.onnx
[08/20/2023-11:59:45] [I] Output:
Build Options:创建trt模型的参数设置
[08/20/2023-11:59:45] [I] === Build Options ===
[08/20/2023-11:59:45] [I] Max batch: explicit batch
[08/20/2023-11:59:45] [I] Memory Pools: workspace: default, dlaSRAM: default, dlaLocalDRAM: default, dlaGlobalDRAM: default
[08/20/2023-11:59:45] [I] minTiming: 1
[08/20/2023-11:59:45] [I] avgTiming: 8
[08/20/2023-11:59:45] [I] Precision: FP32
推理设置
[08/20/2023-11:59:45] [I] === Inference Options===
[08/20/2023-11:59:45] [I] Batch: Explicit
[08/20/2023-11:59:45] [I] Input inference shapes: model
[08/20/2023-11:59:45] [I] Iterations: 10
[08/20/2023-11:59:45] [I] Duration: 3s (+ 200ms warm up)
[08/20/2023-11:59:45] [I] Sleep time: 0ms
[08/20/2023-11:59:45] [I] Idle time: 0ms
[08/20/2023-11:59:45] [I] Inference Streams: 1
日志输出设置
[08/20/2023-11:59:45] [I] === Reporting Options ===
[08/20/2023-11:59:45] [I] Verbose: Enabled
[08/20/2023-11:59:45] [I] Averages: 10 inferences
[08/20/2023-11:59:45] [I] Percentiles: 90,95,99
[08/20/2023-11:59:45] [I] Dump refittable layers:Disabled
[08/20/2023-11:59:45] [I] Dump output: Disabled
[08/20/2023-11:59:45] [I] Profile: Disabled
[08/20/2023-11:59:45] [I] Export timing to JSON file:
[08/20/2023-11:59:45] [I] Export output to JSON file:
[08/20/2023-11:59:45] [I] Export profile to JSON file:
设备信息
[08/20/2023-11:59:46] [I] === Device Information ===
[08/20/2023-11:59:46] [I] Selected Device: NVIDIA GeForce RTX 3060 Laptop GPU
[08/20/2023-11:59:46] [I] Compute Capability: 8.6
[08/20/2023-11:59:46] [I] SMs: 30
[08/20/2023-11:59:46] [I] Device Global Memory: 6143 MiB
[08/20/2023-11:59:46] [I] Shared Memory per SM: 100 KiB
[08/20/2023-11:59:46] [I] Memory Bus Width: 192 bits (ECC disabled)
[08/20/2023-11:59:46] [I] Application Compute Clock Rate: 1.702 GHz
[08/20/2023-11:59:46] [I] Application Memory Clock Rate: 7.001 GHz
[03/28/2024-15:01:18] [I] === Device Information ===
[03/28/2024-15:01:20] [I] Available Devices:
[03/28/2024-15:01:20] [I] Device 0: "NVIDIA GeForce RTX 4060 Laptop GPU
[03/28/2024-15:01:20] [I] Selected Device: NVIDIA GeForce RTX 4060 Laptop GPU
[03/28/2024-15:01:20] [I] Selected Device ID: 0
[03/28/2024-15:01:20] [I] Compute Capability: 8.9
[03/28/2024-15:01:20] [I] SMs: 24
[03/28/2024-15:01:20] [I] Device Global Memory: 8187 MiB
[03/28/2024-15:01:20] [I] Shared Memory per SM: 100 KiB
[03/28/2024-15:01:20] [I] Memory Bus Width: 128 bits (ECC disabled)
[03/28/2024-15:01:20] [I] Application Compute Clock Rate: 1.89 GHz
[03/28/2024-15:01:20] [I] Application Memory Clock Rate: 8.001 GHz
补充一个4060的显卡信息,可以看到SMs是少于3060的,这个与基本厂商的刀法有关。虽然是4060的设备,但是计算 性能比不上3060设备。因为里边的核心——SMs是少于3060的30个SM的。“SMs” 代表 “Streaming Multiprocessors”(流处理器),流处理器是执行 CUDA 核心的基本单元,SM越大算力越大。 对于RTX 4060 Laptop,官方显示有3072个CUDA核心,对应24个SM,即一个SM有128个CUDA核心。 对于RTX 3060 Laptop,官方显示有3840个CUDA核心,对应30个SM,也是符合一个SM有128个CUDA核心的。 4060不仅流处理器少,带宽也低,128 bits VS 192 bits,唯一的优点就是8GB VS 6GB了。