当前位置: 首页 > news >正文

详解TensorRT的C++高性能部署以及C++部署Yolo实践

详解TensorRT的C++高性能部署

  • 一. ONNX
    • 1. ONNX的定位
    • 2. ONNX模型格式
    • 3. ONNX代码使用实例
  • 二、TensorRT
    • 1 引言
  • 三、C++部署Yolo模型实例

一. ONNX

1. ONNX的定位

ONNX是一种中间文件格式,用于解决部署的硬件与不同的训练框架特定的模型格式兼容性问题。
在这里插入图片描述
ONNX本身其实是一种模型格式,属于文本,不是程序,因而无法直接在硬件设备上运行。因此,就需要ONNX Runtime、TensorRT等软件栈(推理框架(引擎))来加载ONNX模型,从而使得它在硬件设备上能够高效地推理。
在这里插入图片描述

许多芯片厂商依托自研的推理框架,NVIDIA的TensorRT、Intel的OpneVINO等可以充分发挥自家芯片的能力,但是普适性较差,你没有办法应用到其它的芯片上。
而,ONNX Runtime等通用性强,可以运行在不同的软硬件平台。
所以,PyTorch模型的部署通用流程一般如下:
首先,训练PyTorch等深度学习框架的网络模型;接着,将模型转换为ONNX模型格式;最后,使用推理框架把ONNX模型高效地运行在特定的软硬件平台上。
在这里插入图片描述

2. ONNX模型格式

ONNX (Open Neural Network Exchange)
一种针对机器学习所设计的开放式的文件格式,用于存储训练好的模型不同的训练框架可采用相同格式存储模型交互。由微软,亚马逊,Facebook和BM等公司共同发起。
在这里插入图片描述
下图,是经典的LeNet-5由PyTorch框架转换ONNX中间格式后,netron.app可视化的结构图。ONNX模型是一个有向无环图,图中的每个结点代表每个用于计算的算子,所有算子的集合称之为算子集,图中的表示结点的计算顺序数据的流向
在这里插入图片描述
模型属性,可以看到ONNX规范的第6个版本,PyTorch的版本,ONNX算子集的版本。
在这里插入图片描述
也可以点击结点,查看每个结点的信息。属性attributes记录的就记录超参数信息。1个输入,1个输出(名称为11)等等。
在这里插入图片描述
ONNX中定义的所有算子构成了算子集,访问网页,可以查看所有算子的定义。
算子在不同的版本,可能会有差异,比如这里的全局平均池化AveragePool,ONNX中AveragePool的属性中pads是个list,而PyTorch中是1个int,所以PyTorch导出ONNX时,会在AveragePool前面加上1个Pad结点
在这里插入图片描述

3. ONNX代码使用实例

这里以图像分类模型转ONNX为例,进行PyTorch模型转ONNX。

import torch
import torchvision
# 选择模型推理的设备
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
# 从pytorch官方实例化预训练模型,并转验证模型
model = torchvision.models.resnet18(pretrained=False)
model = model.eval().to(device)
# 构造一个输入图像的Tensor
# 该Tensor不需要任何的意义,只要在维度上匹配模型的输入即可
# 相当于构建一个输入,走一遍模型的推理过程
x = torch.randn(1, 3, 256, 256).to(device)
# 将x输入进模型推理
output = model(x)
print(output.shape)  # 1x1000
# PyTorch模型转ONNX
with torch.no_grad():torch.onnx.export(model, # 要转换的模型x, # 模型的任意一个匹配的输入"resnet18.onnx", # 导出的文件名input_names=['input'], # 输入结点的名称列表(自定义名称)output_names=['output'], # 输出结点的名称列表(自定义名称)opset_version=11, # ONNX的算子集版本)

加载导出的ONNX模型,并验证。

import onnx
# 验证是否导出成功
# 读取onnx模型
onnx_model = onnx.load('resnet18.onnx')
# 检查模型格式是否正确
onnx.checker.check_model(onnx_model)
# 以可读的形式打印计算图
print(onnx.helper.printable_graph(onnx_model.graph))

推理引擎ONNX Runtime的使用。

import onnxruntime
import torch
# 载入onnx模型,获取ONNX Runtime推理器
ort_session = onnxruntime.InferenceSession('resnet18.onnx')
# 构造随机输入
x = torch.randn(1, 3, 256, 256).numpy()
# ONNX Runtime的输入
# 这里构建的输入和输出的名称要和上面模型导出时自定义的名称一致。
ort_inputs = {'input': x}
# ONNX Runtime的输出,是1个list,对应模型的forward输出多少个,这里就是1个
ort_output = ort_session.run(['output'], ort_inputs)[0]
pass

注意事项:
1.在转ONNX时,将模型转成.eval()验证模式,因为模型在训练时,BN层、dropout都会起作用,而推理是不需要的。
2.这里导出onnx的api中第2个参数args,必须和我们使用PyTorch定义的模型model中forward函数中传入的参数一致,因为模型是torch.nn.Module,只有再执行一遍前向推理过程,也就是forward,才知道模型中有哪些算子。这也就是torch.jit.trace过程,trace得到的torch.jit.ScriptModule才是真正的计算图结构
在这里插入图片描述
3.我们在上述导出ONNX时,x = torch.randn(1, 3, 256, 256).numpy()
,代表着batch为1,每次模型的推理只能接受1张图,这么做的效率就低了。可以在导出的时候设置dynamic_axes参数,使得动态接受数据的数量
在这里插入图片描述

二、TensorRT

TensorRT是由NVIDIA 提供的一个高性能深度学习推理(inference)引擎。用于提高深度学习模型在NVIDIA GPU上运行的的推理速度和效率。

1 引言

要进行NVIDIA显卡的高性能推理,首推的还是自研发的推理引起TensorRT。使用TensorRT部署ONNX模型时,分为两个阶段:
1.构建阶段。对ONNX模型转换和优化,输出优化后模型。
在这里插入图片描述

TensorRT会解析ONNX模型,并进行多项优化
(1)模型量化。分为:训练后量化、训练时量化,均支持。下图为将FP32量化为INT8。
在这里插入图片描述

(2)层融合
(3)自动选择最合适计算的kernel。
build阶段,支持C++Python的API,也可以使用可执行程序trtexec
在这里插入图片描述

2.运行阶段。加载优化后模型,执行推理。
在这里插入图片描述
注意事项:
1.如果导出ONNX时设置了动态batch,使用trtexec转换TensorRT时,就需要加上最小shape最优shape最大shape的参数设置。这样得到的TensorRT模型就可以支持批处理了。
在这里插入图片描述
2.FP16INT8INT4低精度可以提升推理效率

三、C++部署Yolo模型实例

深度学习模型,以Yolo为例,通常在以Python和PyTorch框架训练模型后,整个推理过程分为:预处理、推理和后处理部分。而要进行模型的部署,需要把后处理的部分从模型里面摘出来。
OpenCV中的深度学习模块(DNN)只提供了推理功能,不涉及模型的训练,支持多种深度学习框架:Torch、TensorFlow、Caffe、Darknet。

相关文章:

详解TensorRT的C++高性能部署以及C++部署Yolo实践

详解TensorRT的C高性能部署 一. ONNX1. ONNX的定位2. ONNX模型格式3. ONNX代码使用实例 二、TensorRT1 引言 三、C部署Yolo模型实例 一. ONNX 1. ONNX的定位 ONNX是一种中间文件格式,用于解决部署的硬件与不同的训练框架特定的模型格式的兼容性问题。 ONNX本身其…...

手机如何切换网络IP地址:‌方法详解与操作指南‌

在当今的数字化时代,‌网络IP地址作为设备在网络中的唯一标识,‌扮演着至关重要的角色。‌对于手机用户而言,‌了解如何切换网络IP地址不仅有助于提升网络体验,‌还能在一定程度上保护个人隐私。‌本文将详细介绍手机切换网络IP地…...

南通网站建设手机版网页

随着移动互联网的迅猛发展,越来越多的人通过手机浏览网页,进行在线购物、信息查询和社交互动。因此,建立一个适合移动端访问的网站已成为企业和个人不可忽视的重要任务。在南通,网站建设手机版网页的需求逐渐增加,如何…...

macos系统内置php文件列表 系统自带php卸载方法

在macos系统中, 自带已经安装了php, 根据不同的macos版本php的版本号可能不同, 我们可以通过 which php 命令来查看mac自带的默认php安装路径, 不过注意这个只是php的执行文件路径. 系统自带php文件列表 一下就是macos默认安装的php文件列表. macos 10.15内置PHP文件列表配置…...

微信小程序认证和备案

小程序备案的流程一般包括以下步骤‌: 准备备案所需材料‌:通常需要提供‌营业执照、法人的‌身份证、两个‌手机号和一个邮箱等资料。 ‌1 ‌登录‌微信公众平台‌:作为第一次开发微信小程序的服务商,需要通过微信公众平台申请…...

C++复习day05

类和对象 1. 面向对象和面向过程的区别是什么?(开放性问题) 1. **抽象级别**:- **面向对象**:以对象(数据和方法的集合)为中心,强调的是数据和行为的封装。- **面向过程**&#xf…...

python数值误差

最近在用fenics框架跑有限元代码,其中有一个部分是把在矩阵里定义的初始值,赋值到有限元空间里,这就涉及到了初始矩阵和有限元空间坐标的转化,部分代码如下 for i in range(len(dof_coordinates)):# x, y dof_coordinates[i…...

基于FPGA的OV5640摄像头图像采集

1.OV5640简介 OV5640是OV(OmniVision)公司推出的一款CMOS图像传感器,实际感光阵列为:2592 x 1944(即500w像素),该传感器内部集成了图像出炉的电路,包括自动曝光控制(AEC…...

CDN ❀ Http协议标准缓存字段梳理

文章目录 1. 背景介绍2. 测试环境搭建3. 缓存字段3.1 Expires3.2 Cache-Control3.3 协商缓存 1. 背景介绍 Http协议标准有RFC定义好的请求和响应头部字段用于进行缓存设置,本文主要进行介绍缓存功能相关的头部字段及其使用方法。在使用CDN功能是,协议标…...

浅谈NODE的NPM命令和合约测试开发工具HARDHAT

$ npm install yarn -g # 将模块yarn全局安装 $ npm install moduleName # 安装模块到项目目录下 默认跟加参数 --save 一样 会在package文件的dependencies节点写入依赖。 $ npm install -g moduleName # -g 的意思是将模块安装到全局,具体安装到磁盘哪个位置&…...

k8s-pod 实战六 (如何在不同的部署环境中调整startupprobe的参数?)

在不同的部署环境中(如开发、测试、生产环境),你可能希望对 startupProbe 的参数进行调整,以适应不同的需求和条件。以下是几种常见的方法和实践: 方法一:使用 Kustomize 1. 目录结构 假设你的项目目录结构如下: my-app/ ├── base/ │ └── deployment.yaml …...

和服务端系统的通信

首先web网站 前端浏览器 和 后端系统 是通过HTTP协议进行通信的 同步请求&异步请求: 同步请求:可以从浏览器中直接获取的(HTML/CSS/JS这样的静态文件资源),这种获取请求的http称为同步请求 异步请求:js代码需要到服…...

python 实现perfect square完全平方数算法

python 实现perfect square完全平方数算法介绍 完全平方数(Perfect Square)是一个整数,它可以表示为某个整数的平方。例如,1,4,9,16,25,… 都是完全平方数,因为 1 1 2 , 4 2 2 , 9 3 2 11^2,42^2,93^2 112,422,93…...

【漏洞复现】某客圈子社区小程序审计(0day)

0x00 前言 █ 纸上得来终觉浅,绝知此事要躬行 █ Fofa:"/static/index/js/jweixin-1.2.0.js"该程序使用ThinkPHP 6.0.12作为框架,所以直接审计控制器即可.其Thinkphp版本较高,SQL注入不太可能,所以直接寻找其他洞. 0x01 前台任意文件读取+SSRF 在 /app/api/c…...

信息安全数学基础(1)整除的概念

前言 在信息安全数学基础中,整除是一个基础且重要的概念。它涉及整数之间的特定关系,对于理解数论、密码学等领域至关重要。以下是对整除概念的详细阐述: 一、定义 设a, b是任意两个整数,其中b ≠ 0。如果存在一个整数q&#xff0…...

SearchGPT与谷歌:早期分析及用户反馈

光年AI系统,作为先进AI技术的成果,推出了一个AI驱动搜素引擎的原型,类似于SearchGPT。 该发布引起了广泛的关注,并引发了关于其是否有能力与Google竞争的讨论。 然而,早期的研究和用户反馈表明,虽然Searc…...

VUE饿了么UPload组件自定义上传

代码&#xff1a; 1.视图&#xff1a; <el-dialog :title"dialogTitle" width"30%" :visible.sync"dialogFormVisible" :destroy-on-close"true"><el-form ref"fileForm" class"items-align" ><e…...

2.1概率统计的世界

欢迎来到概率统计的世界&#xff01;在量化交易中&#xff0c;概率统计是至关重要的工具。通过理解概率&#xff0c;我们可以用数学的方法来描述市场行为&#xff0c;预测未来走势&#xff0c;并制定交易策略。让我们一起从基础概念开始&#xff0c;逐步深入&#xff0c;揭开概…...

SpringBoot使用QQ邮箱发送邮件

1.开启POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 设置 -> 账号 -> POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 获取授权码 SpringBoot依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter&l…...

使用 OpenCV 和 NumPy 进行图像处理:HSV 范围筛选实现PS抠图效果

使用 OpenCV 和 NumPy 进行图像处理&#xff1a;HSV 范围筛选实现PS抠图效果 在计算机视觉和图像处理领域&#xff0c;OpenCV 是一个非常强大的库&#xff0c;能够帮助我们执行各种图像操作。在这篇博客中&#xff0c;我们将通过一个简单的示例演示如何使用 OpenCV 和 NumPy 来…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...