TensorRT模型压缩

news2024/12/27 21:33:07

参考链接:
https://www.jianshu.com/p/805b76c9d229
https://blog.csdn.net/chenhaogu/article/details/132677778

  1. 基本理论

TensorRT是一个高性能的深度学习推理优化器,可以为深度学习应用提供低延迟、高吞吐率的部署推理。TensorRT可用于对超大规模数据中心、嵌入式平台或自动驾驶平台进行推理加速。TensorRT现在已能支持TensorFlow、Caffe、Mxnet、Pytorch等几乎所有的深度学习框架,将TensorRT和NVIDIA的GPU结合起来,能在几乎所有的框架中进行快速和高效的部署推理。目前的TensorRT库支持C ++或者Python API部署。
使用训练框架执行推理很容易,但是与使用TensorRT之类的优化解决方案相比,相同GPU上的性能往往低得多。训练框架倾向于实施强调通用性的通用代码,而当优化它们时,优化往往集中于有效的训练。TensorRT通过结合抽象出特定硬件细节的高级API和优化推理的实现来解决这些问题,以实现高吞吐量,低延迟和低设备内存占用。TensorRT 就是对训练好的模型进行优化,由于TensorRT就只包含推理优化器,优化完的网络不再需要依赖深度学习框架,可以直接通过TensorRT 部署在NVIDIA的各种硬件中。
软硬结合
TensorRT的解决方案是:
权重与激活精度校准:通过将模型量化为 FP16或INT8来更大限度地提高吞吐量,同时保持高准确度。 层与张量融合 :通过融合内核中的节点,优化GPU 显存和带宽的使用。 内核自动调整:基于目标 GPU 平台选择最佳数据层和算法。 动态张量显存:更大限度减少显存占用,并高效地为张量重复利用内存。 多流执行:用于并行处理多个输入流的可扩展设计。
通过这些方法,TensorRT能够在不损失精度的情况下显著的提升模型的推理性能。

  1. TensorRT流程
    TensorRT 部署流程主要有以下五步:
  • 训练模型
  • 导出模型为 ONNX 格式
  • 选择精度
  • 转化成 TensorRT 模型
  • 部署模型

在TensorRT中,对象的生命周期可以概括为以下几个主要阶段:

  • 创建对象:在TensorRT中,可以创建多种不同类型的对象,例如IBuilder、INetworkDefinition、ICudaEngine等。这些对象用于构建、定义和优化神经网络模型。

  • 构建网络:在创建INetworkDefinition对象后,可以使用TensorRT提供的API来构建神经网络。这包括添加输入和输出层,定义中间层和操作,设置张量的维度和数据类型等。

  • 优化网络:在构建网络后,可以通过调用IBuilder对象的方法来优化网络。这些方法包括执行层次融合、内存优化、精度校准等技术,以减少推理时间和内存占用。

  • 构建引擎:在优化网络后,可以使用IBuilder对象的buildCudaEngine方法来构建ICudaEngine对象。这是TensorRT运行时使用的引擎对象,它包含了优化后的网络和执行推理所需的GPU代码。

  • 序列化引擎:构建引擎后,可以将ICudaEngine对象序列化为一个文件,以便以后加载和重用。这可以通过调用ICudaEngine对象的serialize方法来完成。

  • 加载引擎:当需要执行推理时,可以通过反序列化引擎文件来加载ICudaEngine对象。这将创建一个可以执行推理的运行时环境。

  • 执行推理:一旦引擎加载完成,可以使用ICudaEngine对象的方法将输入数据提供给模型,并获取输出结果。推理过程在TensorRT的运行时环境中进行,利用GPU的并行计算能力来加速推理速度。

  • 释放资源:在完成推理任务或不再需要TensorRT对象时,应该显式地释放和销毁TensorRT对象。这可以通过调用相应对象的析构函数或销毁方法来完成。

#include <iostream>
#include <NvInfer.h>
#include <NvOnnxParser.h>
 
int main() {
    // 创建TensorRT的Builder对象
    nvinfer1::IBuilder* builder = nvinfer1::createInferBuilder(gLogger);
 
    // 创建TensorRT的网络定义对象
    nvinfer1::INetworkDefinition* network = builder->createNetwork();
 
    // 构建网络结构,例如添加输入和输出层、定义操作等
    nvinfer1::ITensor* input = network->addInput("input", nvinfer1::DataType::kFLOAT, nvinfer1::Dims{1, 3, 224, 224});
    // 添加中间层和操作
 
    // 优化网络,执行层次融合、内存优化等
    builder->setMaxWorkspaceSize(1 << 20);  // 设置工作空间大小
    builder->setFp16Mode(true);  // 启用FP16精度
 
    // 构建Cuda引擎
    nvinfer1::ICudaEngine* engine = builder->buildCudaEngine(*network);
 
    // 序列化引擎以保存到文件
    nvinfer1::IHostMemory* serializedEngine = engine->serialize();
    std::ofstream engineFile("model.engine", std::ios::binary);
    engineFile.write((const char*)serializedEngine->data(), serializedEngine->size());
    engineFile.close();
 
    // 释放资源
    engine->destroy();
    network->destroy();
    builder->destroy();
 
    return 0;
}

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

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

相关文章

(六)几何平均数计算 补充案例 #统计学 #CDA学习打卡

一. 两个案例 1&#xff09;几何平均数计算&#xff1a;基金年平均增长率计算 在财务、投资和银行业的问题中&#xff0c;几何平均数的应用尤为常见&#xff0c;当你任何时候想确定过去几个连续时期的平均变化率时&#xff0c;都能应用几何平均数。其他通常的应用包括物种总体…

《HCIP-openEuler实验指导手册》1.2Apache主页面配置

知识点 一、配置服务器监听IP及端口 注释主配置文件“监听IP及端口”部分 cd /etc/httpd/conf cp httpd.conf httpd.conf.bak vim httpd.conf可以在普通模式下搜索Listen关键字 :/Listen按n键继续向后搜索 在/etc/httpd/conf.d中新建子配置文件port.conf&#xff1a; tou…

FPGA秋招-笔记整理(3)无符号数、有符号数

参考&#xff1a;Verilog学习笔记——有符号数的乘法和加法 一、无符号数、有符号数 将输入输出全部定义为有符号数 &#xff08;1&#xff09;无符号数的读取按照原码进行&#xff0c;有符号数的读取应该按照补码读取&#xff0c;计算规则为去掉符号位后取反、加1在计算数值…

84.柱形图中最大的矩阵

二刷终于能过了. 思路解析: 不愧是hard,第一步就很难想, 对于每一个矩阵,我们要想清楚怎么拿到最大矩阵, 对于每个height[i],我们需要找到left和right,left是i左边第一个小于height[i]的,right是右边第一个小于height[i]的,那么他的最大矩阵就是height[i] * (right-left-…

暗区突围无限测试资格获取教程 暗区突围怎么参加测试教程推荐

《暗区突围&#xff1a;无限》是一款强调极致真实与沉浸感的军事策略游戏&#xff0c;它邀请玩家踏入危机四伏的战场&#xff0c;通过射击、智取与突袭&#xff0c;铺就一条满载财富的道路。在这片未知与挑战并存的土地上&#xff0c;游戏赋予玩家极高的行动自由&#xff0c;旨…

苍穹外卖绕过微信支付

经过以下改动可实现&#xff1a; 1、不用微信支付端口 2、弹出支付成功的界面 3、数据库修改支付成功后的数据 #在OrderServiceImpl.java里加入Autowiredprivate OrderService orderService; #在OrderServiceImpl.java里的payment函数做以下改动 #图片里有&#xff0c;红色为原…

如何从requirements.txt文件中安装pytorch

平时使用requirements.txt文件来安装python的依赖&#xff0c;如下所示&#xff1a; Flask3.0.0 Flask-Cors4.0.0 elastic-transport8.11.0 elasticsearch8.11.1但是如果我们的依赖中包含pytorch依赖&#xff0c;显然是不能简单的通过这个方式来进行的&#xff0c;例如&#x…

怎样将便签软件搬家?便签迁移攻略

便签软件已成为我们日常生活中不可或缺的记录工具。无论是重要的工作内容&#xff0c;还是琐碎的生活事务&#xff0c;我们都会在便签中一一记下。然而&#xff0c;当我们需要更换电脑或其他设备时&#xff0c;如何将这些珍贵的便签内容迁移到新设备上&#xff0c;成为了许多人…

Linxu系统服务管理,systemd知识/进程优先级/平均负载/php进程CPU100%怎么解决系列知识!

shell脚本&#xff08;命令&#xff09;放后台 sleep 300& 放到后台运行&#xff0c;脚本或命令要全路径 nohup&#xff1a;用户推出系统进程继续工作 【功能说明】 nohup 命令可以将程序以忽略挂起信号的方式运行起来&#xff0c;被运行程序的输出信息将不会显示到终端 如…

VS2019配合QT5.9开发IRayAT430相机SDK

环境配置 VS2019 QT5.9 编译器版本 MSVC2017_64添加系统环境变量&#xff08;完毕后重启电脑&#xff09; 从VS2019中下载Qt插件 从VS2019中添加单个编译组件 上述操作完成后用VS打开工程文件&#xff0c;工程文件地址 &#xff1a; C:\Users\86173\Desktop\IRCNETSDK_W…

337. 打家劫舍 III 树上最大独立集

这个题目其实就是 树形结构的 打家劫舍 (隔一家抢一家) 在打家劫舍中,我们是使用dp[i]记录当前的最大值,如果上一家刚抢过,就返回dp[i-2] 而对于这个题目,我们对每个节点记录两个状态,就是抢和没抢的最大值 具体转移方程如下: dfs(node,rob) 表示对于当前node节点,抢了true或…

最大连续1的个数 ||| ---- 滑动窗口

题目链接 题目: 分析: 题目中说可以将最多k个0翻转成1, 如果我们真的这样算就会十分麻烦, 所以我们可以换一种思路: 找到一个最长的子数组, 最多有k个0解法一: 暴力解法: 找到所有的最多有k个0的子字符串, 返回最长的解法二: 找到最长的子数组, 我们可以想到"滑动窗口算…

968.监控二叉树 树上最小支配集

法一: 动态规划 一个被支配的节点只会有三种状态 1.它本身有摄像头 2.他没有摄像头, 但是它的父节点有摄像头 3.他没有摄像头, 但是它的子节点有摄像头 我们 dfs(node,state) 记录在node节点时(以node为根的子树),状态为state下的所有最小摄像头 // 本身有摄像头就看左右孩子…

2024/4/28 C++day5

有以下类&#xff0c;完成特殊成员函数 class Person { string name; int *age; } class Stu:public Person { const double score; } #include <iostream> #include <string> using namespace std; class Person { string name; int *age ; publi…

Vision Pro“裸眼上车”,商汤绝影全新舱内3D交互亮相

2023年&#xff0c;Apple Vision Pro的横空出世让人们领略到了3D交互的魅力&#xff0c;商汤绝影通过深厚的技术研发实力和高效的创新迭代效率&#xff0c;带来两大全新座舱3D交互&#xff1a;3D Gaze高精视线交互和3D动态手势交互。 作为全球首创的能够通过视线定位与屏幕图标…

16.Blender 基础渲染工作流程及安装ACES

安装插件和菜单栏设置 在菜单栏的编辑里打开偏好设置 里面的插件界面 搜索node 给第三个打勾 点击安装&#xff0c;导入cat插件 安装完后&#xff0c;一定要打勾&#xff0c;选择上cat插件 这样N窗口才会显示MMD选项 导入场景 点击打开 把输出模式的帧率改为30fps 按…

CSS 之 transition过渡动画

一、简介 ​ CSS 制作 Web 动画有两种方式&#xff1a; 帧动画&#xff08;Keyframe Animation&#xff09;和过渡动画&#xff08;Transition Animation&#xff09;。针对不同的业务场景中&#xff0c;我们应该选择不同的动画方式&#xff0c;通常来说&#xff1a;对于交互元…

OpenHarmony实战开发-多层级手势事件

多层级手势事件指父子组件嵌套时&#xff0c;父子组件均绑定了手势或事件。在该场景下&#xff0c;手势或者事件的响应受到多个因素的影响&#xff0c;相互之间发生传递和竞争&#xff0c;容易出现预期外的响应。 本章主要介绍了多层级手势事件的默认响应顺序&#xff0c;以及…

MySQL8.0 msi版本安装教程

MySQL8.0 msi 版本安装教程 1> 官网下载安装包 2> 安装MySQL 2.1双击打开下载的安装包&#xff0c;进入到下面这个页面&#xff0c;选择 Custom 选项&#xff0c;之后&#xff0c;点击next 说明&#xff1a; 2.2 选择所需产品&#xff0c;更改安装位置(当然也可以默认安…

公式SUM(A2:C4C2:D5)一共对几个单元格进行求和?

一、公式中的几个问题 1.括号和冒号是双字节的字符。 这个不用多说了&#xff0c;相信题主中是提问时书写笔误&#xff0c;实际在Excel中写公式时肯定用的是英文单字节字符。 2.括号里是两个区域&#xff0c; 但两个区域之间是怎样的运算关系并没有说&#xff0c;或者说是遗…