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

文章目录

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

待完成

三、注意事项

待完成


总结

待完成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/512478.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Upsert api写s3的流程源码分析

Upsert api写s3的流程 milvus版本:v2.3.2 实现:先insert再delete,并限制不能修改主键列。 整体架构: Upsert 的数据流向 upsert写入s3的流程 upsert先insert,再delete。从proxy的execute()方法可以看出。 func (it *upsertTask) Execute(ctx contex…

Spring Cloud Alibaba一一SentinelResource

SentinelResource 在定义了资源点之后,我们可以通过Dashboard控制台页面来设置限流和降级策略来对资源点进行保护。同时还能通过[**SentinelResource**](/SentinelResource)****注解来制定出现异常时的处理策略 1、属性说明 value 资源名称、必须项、因为需要通过…

基于遗传优化的协同过滤推荐算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 最后得到推荐的商品ID号: 推荐商品的ID号:ans 9838175822191114902149021235224732230712349911790154716550165501655011…

快速上手:在 Android 设备上运行 Pipy

Pipy 作为一个高性能、低资源消耗的可编程代理,通过支持多种计算架构和操作系统,Pipy 确保了它的通用性和灵活性,能够适应不同的部署环境,包括但不限于云环境、边缘计算以及物联网场景。它能够在 X86、ARM64、海光、龙芯、RISC-V …

Java中Sleep和Wait的区别

目录 1、所属类不同 2、作用不同 3、使用场景不同 4、异常处理不同 总结 在Java编程中,我们经常会遇到需要让线程暂停执行的情况。这时,我们可以使用Thread类的sleep()方法和Object类的wait()方法来实现线程的暂停。尽管它们都可以达到暂停线程的目的…

Linux——自写一个简易的shell

目录 前言 一、打印提示信息 二、分割字符串 三、替换程序 前言 之前学习了很多进程相关的知识,包括环境变量、进程的创建与退出、进程等待、进程替换。现在可以用所学的作一个小总结,手撕一个shell解释器,大致的思路是先通过环境变量获…

Java对接快递100实时快递单号查询API接口

目录 1.引入依赖 2.定义配置信息 3.模块结构 4.Controller 5.Service实现类 6.返回数据dto以及dto中的数据dto 7.测试运行 今天也是接到了这个任务,官网有小demo,可以下载下来参考test中代码 官方文档地址: 实时快递查询接口技术文档…

docker的网络配置

文章目录 1、网络模式1.1、bridge模式(默认模式)1.2、host模式 2、bridge模式3、自定义网络 1、网络模式 Docker在创建容器时有四种网络模式:bridge/host/container/none,bridge为默认不需要用–net去指定,其他三种模式需要在创建容器时使用…

【QT】创建第一个QT程序

下面的前7个可以先不看,直接从8开始看 1. 创建Qt程序 一个Qt程序的组成部分:应用程序类,窗口类应用程序类个数:有且只有一个QApplication a;如何查看类对应的模块:光标移动到类上,F1qmake模块的名字 2. …

【易经】-- 伏羲八卦次序图

1、伏羲八卦次序图 ☷☶☵☴☳☲☱☰八卦坤艮坎巽震离兑乾四象太阴少阳少阴太阳两仪阴阳太极太极 2、八“单卦”(经卦) 符号卦名自然象征1☰乾qin天2☱兑du泽3☲离l火4☳震zhn雷5☴巽xn风6☵坎kǎn水7☶艮gn山8☷坤kūn地 3、八卦及所代表的意像

二,几何相交----2,区间相交检测IID

一,算法 对于空间的线段是否相交,假设都是与x平行,则需要三步 1,对各线段左右端点设置为L,R标志 2,从小到大进行排序 3,线性扫描,从小到大,根据模式判断是否相交,假设不相…

⭐每天一道leetcode:27.移除元素(简单;vector)

⭐今日份题目 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中…