五、yolov8 tensorRT c++部署及接口封装(保姆级教程附源码)

采用 C++TensorRT来部署深度学习模型有以下几个优点:

高性能推理:TensorRT是一个高性能的深度学习推理(Inference)优化器,专门为NVIDIA GPU硬件平台设计,能够提供低延迟、高吞吐量的模型推理性能。这意味着在执行模型推理时,TensorRT能够显著提高运算速度,适用于对实时性要求较高的应用场景。
多种框架支持:TensorRT支持从多种流行的深度学习框架(如TensorFlow、Caffe、MxNet、PyTorch等)转换而来的模型,这使得开发者可以灵活选择训练框架,并将训练好的模型转换为TensorRT格式以便进行优化推理。
优化技术集成:TensorRT集成了多种模型优化技术,包括模型量化、动态内存优化、层融合等,这些技术可以极大提高模型的推断速度和效率。
多平台兼容性:TensorRT可以在不同的NVIDIA GPU硬件上运行,无论是超大规模的数据中心还是嵌入式平台,甚至是自动驾驶平台,都可以利用TensorRT进行推理加速。
易于部署:TensorRT提供了C++ API和Python API,使得开发者可以根据自己的需求和熟悉程度选择适合的语言进行开发。C++通常用于需要更高性能和更低级别控制的场景。
提升执行速度:基于TensorRT的应用在推理期间,相比仅使用CPU平台的执行速度快达40倍,这对于需要快速响应的应用场景来说是非常重要的。
主流工具的优势:由于许多企业使用的是NVIDIA生产的计算设备,在这些设备上,NVIDIA推出的TensorRT在性能上相比其他工具(如TVM、TensorComprehensions)会有一定的优势。

一、下载tensorRT

1、登录NVIDA网站,没有账号的需要注册一个。

2、勾选选项框,弹出版本内容。

在这里插入图片描述
在这里插入图片描述

3、选择TensorRT 8.5 GA(GA版本是通用版、稳定版;EA版本是抢先版),点击下载windows版本,下载完毕解压压缩包。

在这里插入图片描述

4、打开文件夹,位置1 include是c++需要调用的头文件,位置2 lib为c++调用的库文件;位置3为tensorRT自带的示例程序,有C++、python版本。

在这里插入图片描述

二、vs创建工程

1、打开vs,创建动态链接库工程。

在这里插入图片描述

2、将tensorRT的include文件和lib文件拷贝到tennsorRT该目录下,在工程中加入头文件和库目录。

在这里插入图片描述

3、下载cuda,我用的是cuda11.3,将头文件和lib库放在cuda文件夹中,工程中添加需要的库。

在这里插入图片描述
在这里插入图片描述

nvinfer.lib
nvonnxparser.lib
cudart.lib
nvinfer_plugin.lib
kernel32.lib
user32.lib
gdi32.lib
winspool.lib
shell32.lib
ole32.lib
oleaut32.lib
uuid.lib
comdlg32.lib
advapi32.lib

4、在工程中新建库文件,定义转换接口,需要设置的有输入路径,输出路径,batch。接口如下:

在这里插入图片描述

5、在cpp文件中包含头文件;

在这里插入图片描述

6、onnx转engine实现过程:

在cpp文件的函数接口内写入:

在这里插入图片描述

(1)创建onnx转trt解析器

static Logger gLogger;
//创建builder
IBuilder* builder = createInferBuilder(gLogger);
//创建network
const auto explicitBatch = 1U << static_cast<uint32_t>(NetworkDefinitionCreationFlag::kEXPLICIT_BATCH);
INetworkDefinition* network = builder->createNetworkV2(explicitBatch);
//创建onnx模型解析器
nvonnxparser::IParser* parser = nvonnxparser::createParser(*network, gLogger);

(2)读取onnx模型文件

//读取onnx模型文件
const char* onnx_filename = inputPath.c_str();
//将onnx模型导入trt网络,解析模型
parser->parseFromFile(onnx_filename, static_cast<int>(Logger::Severity::kWARNING));
for (int i = 0; i < parser->getNbErrors(); ++i)
{std::cout << parser->getError(i)->desc() << std::endl;
}
std::cout << "successfully load the onnx model" << std::endl;

(3)创建引擎

//使用builder对象构建engine
IBuilderConfig* config = builder->createBuilderConfig();
//设置batch
builder->setMaxBatchSize(maxBatchSize);
//设置最大工作空间
config->setMaxWorkspaceSize(1 << 20);
//config->setMaxWorkspaceSize(128 * (1 << 20));  // 16MB
//设置精度计算
config->setFlag(BuilderFlag::kFP16);
//创建engine
ICudaEngine* engine = builder->buildEngineWithConfig(*network, *config);

(4)序列化引擎并写入文件

IHostMemory* gieModelStream = engine->serialize();
std::ofstream p(outputPath.c_str(), std::ios::binary);
if (!p)
{std::cerr << "could not open plan output file" << std::endl;return -1;
}
//写入
p.write(reinterpret_cast<const char*>(gieModelStream->data()), gieModelStream->size());
//摧毁
gieModelStream->destroy();
engine->destroy();
parser->destroy();
network->destroy();

7、添加新建文件,导出调用函数

在这里插入图片描述

在这里插入图片描述

三、接口测试

编写调用程序:

1、新建控制台程序,包含头文件和库目录。

2、在main函数中调用接口,运行,结果显示如下,即为调用成功。然后等待转换成功,在输出目录中即可找到对应的engine文件。

在这里插入图片描述

在这里插入图片描述

源码链接:
【超级会员】通过百度网盘分享的文件:onnx转trt
链接:https://pan.baidu.com/s/1_Jkq9GjFBzp7j-V34cDQkg?pwd=7785
提取码:7785
复制这段内容打开「百度网盘APP 即可获取」

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

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

相关文章

深度学习pytorch实战4---猴逗病识别·

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/0dvHCaOoFnW8SCp3JpzKxg) 中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊](https://mtyjkh.blog.csdn.net/)** 引言 1.复习上周并反思 K同学针对大家近…

python爬虫 - 爬取html中的script数据(36kr.com新闻信息)

文章目录 1. 分析页面内容数据格式2. 使用re.findall方法&#xff0c;爬取新闻3. 使用re.search 方法&#xff0c;爬取新闻 1. 分析页面内容数据格式 打开 https://36kr.com/ 按F12&#xff08;或 在网页上右键 --> 检查&#xff08;Inspect&#xff09;&#xff09; 找…

c++初阶——类和对象(中)

大家好&#xff0c;我是小锋&#xff0c;我们今天继续来学习类和对象。 类的6个默认成员函数 我们想一想如果一个类什么都没有那它就是一个空类&#xff0c;但是空类真的什么都没有吗&#xff1f; 其实并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以…

电脑提示丢失iutils.dll怎么办?一分钟教你搞定dll丢失问题

在计算机世界中&#xff0c;DLL&#xff08;Dynamic Link Library&#xff0c;动态链接库&#xff09;文件扮演着至关重要的角色&#xff0c;它们如同乐高积木中的基础模块&#xff0c;不同程序通过调用这些模块来实现各种功能。其中&#xff0c;iutils.dll就是这样一款不可或缺…

transformer 最简单学习3, 训练文本数据输入的形式

1、输入数据中&#xff0c;源数据和目标数据的定义 def get_batch(source,i):用于获取每个批数据合理大小的源数据和目标数据参数source 是通过batchfy 得到的划分batch个 ,的所有数据&#xff0c;并且转置列表示i第几个batchbptt 15 #超参数&#xff0c;一次输入多少个ba…

聚类分析字符串数组

聚类分析字符串数组 对多个字符串进行聚类分析旨在根据它们之间的相似度将这些字符串划分成若干个类别&#xff0c;使得同一类别内的字符串彼此相似度高&#xff0c;而不同类别间的字符串相似度低 小结 数据要清洗。清洗的足够准确&#xff0c;可能不需要用聚类分析了数据要…

统一所有 LLM API:支持预算与速率限制 | 开源日报 No.229

BerriAI/litellm Stars: 6.7k License: NOASSERTION litellm 是一个使用 OpenAI 格式调用所有 LLM API 的工具。它支持 Bedrock、Azure、OpenAI、Cohere、Anthropic 等 100 多种 LLMs&#xff0c;提供企业级代理服务器和稳定版本 v1.30.2。 主要功能和优势包括&#xff1a; 将…

javaEE初阶——多线程(八)——常见的锁策略 以及 CAS机制

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 小比特 大梦想 此篇文章与大家分享分治算法关于多线程进阶的章节——关于常见的锁策略以及CAS机制 如果有不足的或者错误的请您指出! 目录 多线程进阶1.常见的锁策略1.1乐观锁和悲观锁1.2重量级锁 和 轻量级锁1.…

【大数据】分布式数据库HBase

目录 1.概述 1.1.前言 1.2.数据模型 1.3.列式存储的优势 2.实现原理 2.1.region 2.2.LSM树 2.3.完整读写过程 2.4.master的作用 1.概述 1.1.前言 本文式作者大数据系列专栏中的一篇文章&#xff0c;按照专栏来阅读&#xff0c;循序渐进能更好的理解&#xff0c;专栏…

JS实现对用户名、密码进行正则表达式判断,按钮绑定多个事件,网页跳转

目标&#xff1a;使用JS实现对用户名和密码进行正则表达式判断&#xff0c;用户名和密码正确时&#xff0c;进行网页跳转。 用户名、密码的正则表达式检验 HTML代码&#xff1a; <button type"submit" id"login-btn" /*onclick"login();alidate…

精益思想赋能数字化转型:落地策略与实践路径

当下&#xff0c;数字化转型已不再是选择题&#xff0c;而是关乎企业生存与发展的必答题。然而&#xff0c;转型过程中如何确保效率、降低成本并快速实现价值创造&#xff0c;成为了摆在众多企业面前的难题。精益思想作为一种追求精益求精、持续改进的管理思维&#xff0c;为数…

2024最新版JavaScript逆向爬虫教程-------基础篇之面向对象

目录 一、概念二、对象的创建和操作2.1 JavaScript创建对象的方式2.2 对象属性操作的控制2.3 理解JavaScript创建对象2.3.1 工厂模式2.3.2 构造函数2.3.3 原型构造函数 三、继承3.1 通过原型链实现继承3.2 借用构造函数实现继承3.3 寄生组合式继承3.3.1 对象的原型式继承3.3.2 …

stm32HAL库-GPIO

一 什么是 GPIO: GPIO(general porpose intput output), 通用输入输出端口 . 二 我们先认识芯片控制 GPIO 输出控制。 2.1LED 硬件原理如图&#xff1a; 当电流从这根电线流通&#xff0c; LED 亮。当电流不通过这根电线&#xff0c; LED 灭。 上面 PF** &#xff0c;芯片电…

MySQL面试——聚簇/非聚簇索引

存储引擎是针对表结构&#xff0c;不是数据库 引擎层&#xff1a;对数据层以何种方式进行组织 update&#xff1a;加索引&#xff1a;行级锁&#xff1b;不加索引&#xff1a;表级锁

固态继电器:推进可再生能源系统

随着可再生能源系统的发展&#xff0c;太阳能系统日益成为现代能源解决方案的先锋。在这种背景下&#xff0c;固态继电器&#xff08;SSR&#xff09;&#xff0c;特别是光耦固态继电器的利用变得日益突出。本文旨在深入探讨SSR在可再生能源系统中的多方位应用&#xff0c;重点…

【学习笔记】Python 使用 matplotlib 画图

文章目录 安装中文显示折线图、点线图柱状图、堆积柱状图坐标轴断点参考资料 本文将介绍如何使用 Python 的 matplotlib 库画图&#xff0c;记录一些常用的画图 demo 代码 安装 # 建议先切换到虚拟环境中 pip install matplotlib中文显示 新版的 matplotlib 已经支持字体回退…

SD-WAN:灵活、低成本、便于管理

近年来&#xff0c;SD-WAN&#xff08;软件定义广域网&#xff09;技术成为企业网络领域的新趋势&#xff0c;其带来的变革性影响备受瞩目。凭借出色的灵活性、高效的可管理性以及显著的成本优势&#xff0c;SD-WAN技术为企业网络注入了新的活力。 首先&#xff0c;SD-WAN技术的…

如何利用diskpart命令界面在win10/win11上解除U盘写保护

背景 在把U盘作为系统盘装了一次后&#xff0c;惊讶的发现自己U盘的一个1M的小卷被写保护了。不能格式化&#xff0c;不能删除文件&#xff0c;在给用户拷文件的时候&#xff0c;小卷还会提示病毒告警&#xff0c;非常的尴尬&#xff0c;因此展开了研究。 失败的尝试 尝试了网…

58、回溯-组合总和

思路&#xff1a; 数组内的每一个元素都可以无线使用只要最后可以拼接成target就可以。那么如何限制呢&#xff1f; &#xff08;target-已经拼接的和 &#xff09;/当前元素 就是你可以利用的数量。代码如下&#xff1a; class Solution {public static List<List<I…

触发器的基本概念及分类

目录 触发器的基本概念 作用对象 触发事件 触发条件 触发时间 触发级别或者触发频率 触发器的分类 DML 触发器 INSTEAD OF 触发器 系统触发器 Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 触发器的基本概念 …