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

news2024/11/20 10:30:37

文章目录

  • 一、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.coloradmin.cn/o/1491619.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ string类详解及模拟实现

目录 【本节目标】 1. 为什么学习string类? 1.1 C语言中的字符串 1.2 面试题(暂不做讲解) 2. 标准库中的string类 2.1 string类(了解) 2.2 string类的常用接口说明(注意下面我只讲解最常用的接口) 3. string类的模拟实现 3.1string类常用…

OpenAI 3年前的AI音乐生成项目:Jukebox,效果比SunoAI v3还好

原来OpenAI 3年前就开始搞AI音乐生成了 效果甚至比最近发布的sunoAI v3还要好,难道OpenAI 想把这个隐藏大招练成无人能敌的状态才放出来再一次轰动全球? OpenAI在2019年8月份就推出了他们的一音乐生成模型:Jukebox Jukebox能够根据提供的歌…

【快速上手QT】07-对话框QDialog

QDialog 今天讲一个我们这个系列的第一篇就提到的东西&#xff1a;QDialog。 相信经过前几篇的学习&#xff0c;大家应该是能够通过QT助手来对QDialog有个初步的了解。 我们就直接来测试一下。 #include "Zhetu.h"#include <qdebug.h> #include <QPushBu…

C++输入输出(I\O)

我们知道C是由C语言发展而来的&#xff0c;几乎完全兼容C语言&#xff0c;换句话说&#xff0c;你可以在C里面编译C语言代码。如下图: C语言是面向过程的语言&#xff0c;C在C语言之上增加了面向对象以及泛型编程机制&#xff0c;因此C更适合中大型程序的开发&#xff0c;然而C…

RK DVP NVP6158配置 学习

NVP6158简介 NVP6158C是一款4通道通用RX&#xff0c;提供高质量图像的芯片。它接受来自摄像机和其他视频信号的独立4通道通用输入来源。它将4通道通用1M至8M 7.5P视频格式数字化并解码为代表8位ITU-R BT.656/1120 4:2:2格式的数字分量视频&#xff0c;并将单独的BT.601格式与27…

计算机网络——概述

计算机网络——概述 计算机网络的定义互连网&#xff08;internet&#xff09;互联网&#xff08;Internet&#xff09;互联网基础结构发展的三个阶段第一个阶段——APPANET第二阶段——商业化和三级架构第三阶段——全球范围多层次的ISP结构 ISP的作用终端互联网的组成边缘部分…

Nodejs 第四十九章(lua)

lua Lua是一种轻量级、高效、可嵌入的脚本语言&#xff0c;最初由巴西里约热内卢天主教大学&#xff08;Pontifical Catholic University of Rio de Janeiro&#xff09;的一个小团队开发而成。它的名字"Lua"在葡萄牙语中意为"月亮"&#xff0c;寓意着Lua…

数据分析-Pandas数据y轴双坐标设置

数据分析-Pandas数据y轴双坐标设置 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表&…

平衡搜索二叉树—AVL树

一、定义&#xff1a; 为了避免搜索二叉树的高度增长过快&#xff0c;降低二叉树的性能&#xff0c;规定在插入和删除二叉树的结点的时候&#xff0c;任何结点左右子树的高度差绝对值不超过1&#xff0c;这样的二叉树被称为平衡二叉树&#xff08;balanced Binary Tree&#xf…

为PDF创建目录(侧边栏目录)

通过可以新建书签的pdf阅读器。 知云翻译&#xff1a;可以新建书签和子书签。 Adobe Acrobat&#xff1a;只能新建书签&#xff0c;不能建立子书签。

DA14531在三星手机手写笔的应用让我打开眼镜

手写笔的功能 这是一款内置蓝牙功能的魔性笔&#xff0c;它是遥控器、是照相、切换摄像头、是暂停或者打开播放列表。乃至更多操作-通过不同的手势隔空操作&#xff0c;或者按下触控按键便可轻松搞定。 手写笔硬件设计 内部结构 采用2.3V可循环充电电池&#xff0c;放入手…

软件测试零基础新手入门必看

软件测试&#xff1a;使用技术手段验证软件是否满足使用需求 目的&#xff1a;减少缺陷&#xff0c;保证质量 一、测试主流技能&#xff1a; 1.功能测试 测试主要验证程序的功能是否满足需求 2.自动化测试 使用工具或代码代替手工&#xff0c;对项目进行测试 3.接口测试 …

【原理图PCB专题】Allegro模块化移动器件报...has the LOCKED property怎么解锁?

在模块化原理图时,PCB也需要做一个模块.mdd文件。这时需要先画好图纸然后再制作模块化文件。 修改文件时会发现模块化器件报错,无法编辑模块内部器件和走线,器件和走线都被LOCKED,如下所示报错内容: Symbol "U1" Selected Cannot edit Symbol "U1". M…

(Linux学习七)进程介绍

一、进程 进程生命周期&#xff1a;由系统程序。form出来的子程序&#xff0c;具备一定的父的资源&#xff08;权利&#xff0c;内存空间&#xff0c;PID&#xff09;直到运行完毕&#xff0c;退出系统 查看进程 ps aux 查看所有进程参数&#xff1a;aux ps a 显示现行…

剑指offer 二维数组中的查找 C++

目录 前言 一、题目 二、解题思路 1.直接查找 2.二分法 三、输出结果 前言 最近在牛客网刷题&#xff0c;刷到二维数组的查找&#xff0c;在这里记录一下做题过程 一、题目 描述 在一个二维数组中&#xff08;每个一维数组的长度相同&#xff09;&#xff0c;每一行都按照…

00. Nginx总结-错误汇总

/www/wangmingqu/index.html" is forbidden (13: Permission denied) 错误图片 错误日志 2024/01/09 22:26:27 [error] 1737#1737: *1 "/www/wangmingqu/index.html" is forbidden (13: Permission denied), client: 192.169.1.101, server: www.wangmingqu.c…

前端知识点、技巧、webpack、性能优化(持续更新~)

1、 请求太多 页面加载慢 &#xff08;webpack性能优化&#xff09; 可以把 图片转换成 base64 放在src里面 减少服务器请求 但是图片会稍微大一点点 以上的方法不需要一个一个自己转化 可以在webpack 进行 性能优化 &#xff08;官网有详细描述&#xff09;

数据结构与算法:堆排序和TOP-K问题

朋友们大家好&#xff0c;本节内容来到堆的应用&#xff1a;堆排序和topk问题 堆排序 1.堆排序的实现1.1排序 2.TOP-K问题3.向上调整建堆与向下调整建堆3.1对比两种方法的时间复杂度 我们在c语言中已经见到过几种排序&#xff0c;冒泡排序&#xff0c;快速排序&#xff08;qsor…

光伏发电预测

XGB、LGB在datacamp(学习网站) data fountain与国家电投系列赛,光伏发电预测 题目:给一组特征,预测瞬时发电量,训练集9000个点,测试集8000个点,特征包含光伏板的属性和外部环境等。 数据字段:ID、光伏电池板背侧温度、光伏电站现场温度、计算得到的平均转换效率、数…

Javaweb之SpringBootWeb案例之自动配置案例的自定义starter分析的详细解析

3.2.4.1 自定义starter分析 前面我们解析了SpringBoot中自动配置的原理&#xff0c;下面我们就通过一个自定义starter案例来加深大家对于自动配置原理的理解。首先介绍一下自定义starter的业务场景&#xff0c;再来分析一下具体的操作步骤。 所谓starter指的就是SpringBoot当…