TensorRT 常用函数功能

模型推理流程

本节主要看每个函数功能解释,不一定是最优

1、加载engine模型参数
"step0.通过文件流读取engine文件"
std::vector<char> trtModelStream_;   //engine文件参数读取后保存到该数组中    
size_t size{0};std::ifstream file(engineFile, std::ios::binary);
if (file.good()) {file.seekg(0, file.end);    //设置读取位置为文件的末尾size = file.tellg();        //获取到文件的大小, tellg()函数不需要带参数,它返回当前定位指针的位置,也代表着输入流的大小。file.seekg(0, file.beg);    //设置读取位置为文件的开头trtModelStream_.resize(size);file.read(trtModelStream_.data(), size);    //读取文件流的内容保存到数组中file.close();
}"step1.通过RunTime对象反序列化engine引擎"
IRuntime *runtime = createInferRuntime(gLogger);
assert(runtime != nullptr);
m_engine = runtime->deserializeCudaEngine(trtModelStream_.data(), size, nullptr);  //最后一个参数不再使用,必须是一个空指针.
assert(m_engine != nullptr);"step2.创建context来开辟空间存储中间值,一个engine可以有多个context来并行处理"
//由于引擎保存网络定义和训练参数,因此需要额外的空间。这些保存在context中
m_context = m_engine->createExecutionContext();
assert(m_context != nullptr);
2、创建流并预分配GPU缓冲区内存
"步骤一:创建流(可以在推理之前提前创建好)"// Pointers to input and output device buffers to pass to engine.// Engine requires exactly IEngine::getNbBindings() number of buffers.assert(engine.getNbBindings() == 2);    //getNbBindings()获取网络输入输出数量void* buffers[2];// In order to bind the buffers, we need to know the names of the input and output tensors.// Note that indices are guaranteed to be less than IEngine::getNbBindings()// 为了绑定缓冲区,我们需要知道输入和输出张量的名称。 请注意,索引必须小于IEngine::getNbBindings()"step1.指定输入和输出节点名来获取输入输出索引"const int inputIndex = engine.getBindingIndex(m_input_tensor_name.data());//blob名称是转换模型时设置好的,这里需要保持一致const int outputIndex = engine.getBindingIndex(m_output_tensor_name.data());"step2.在设备上开辟网络输入输出需要的GPU缓冲区(内存)"//开辟输入输出需要的GPU内存,由网络输入输出决定TENSORRTCHECK(cudaMalloc(&buffers[inputIndex], batchSize * 3 * m_height * m_width * sizeof(float)));TENSORRTCHECK(cudaMalloc(&buffers[outputIndex], batchSize * m_output_size * sizeof(float)));"step3.创建流"cudaStream_t stream;TENSORRTCHECK(cudaStreamCreate(&stream));
3、执行模型推理
"调用推理函数(自己创建的)"
float *outdata = new float[m_batch_size * m_output_size];
//注意输入数据传入的方式.ptr的首地址
doInference(*m_context, (float *)pre_img.ptr<float>(0), outdata, m_batch_size); 
bool TensorRTWrapper::doInference(nvinfer1::IExecutionContext& context, float* input, float* output, int batchSize) {const nvinfer1::ICudaEngine& engine = context.getEngine();"步骤二:执行推理""step1.拷贝数据 从主机(CPU)--->设备(GPU)"TENSORRTCHECK(cudaMemcpyAsync(buffers[inputIndex], input, batchSize * 3 * m_height * m_width * sizeof(float), cudaMemcpyHostToDevice, stream));"step2.执行推理"context.enqueue(batchSize, buffers, stream, nullptr);"step3.拷贝数据 从设备(GPU)--->主机(CPU)"TENSORRTCHECK(cudaMemcpyAsync(output, buffers[outputIndex], batchSize * m_output_size * sizeof(float), cudaMemcpyDeviceToHost, stream));"step4.同步流"cudaStreamSynchronize(stream);//因为上面的cudaMemcpyAsync()函数是异步方式执行的,所有这里需要进行同步
}
4、释放前面创建的对象和内存
    "步骤三:释放内存(可以放在类析构时)"cudaStreamDestroy(stream);TENSORRTCHECK(cudaFree(buffers[inputIndex]));TENSORRTCHECK(cudaFree(buffers[outputIndex]));

相关函数功能

bindings

bindings是tensorRT对输入输出张量的描述,bindings可以认为是个数组,bindings=input-tensor+output-tensor,比如input有a,output有b,c,d。即输入一个tensor,输出3个tensor,那么bindings=[a,b,c,d],bindings[0]=a,bindings[1] =a,bindings[2] =c。此时看到engine->getBindingDimensions(0),0表示索引,你就知道获取的维度是多少了,这里获取的就是a。

GetBindingDimensions

GetBindingDimensions(int index)/GetBindingDimensions(string nodeName) 

  • 获取节点维度接口: 通过端口编号或者端口名称,获取绑定的端口的形状信息.
  • int index: 绑定端口的编号
  • string nodeName: 绑定端口的名称
  • return Dims: 接口返回一个Dims结构体,该结构体包含了节点的维度大小以及每个维度的具体大小。

getNbBindings()

获取网络 输入+输出 数量,看 bindings 解释

cudaHostAlloc 和 cudaMalloc

CUDA:cudaHostAlloc()-CSDN博客

cudaMalloc / cudaFree 和 cudaMallocAsync / cudaFreeAsync

使用 NVIDIA CUDA 流顺序内存分配器,第 1 部分 - NVIDIA 技术博客

极市开发者平台-计算机视觉算法开发落地平台-极市科技

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

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

相关文章

nginx的学习(一):nginx的基本概念和反向代理

简介 nginx的基本概念&#xff0c;以及反向代理的配置 nginx 是一个高性能的http和反向代理web服务器及电子邮件&#xff08;IMAP/POP3/SMTP&#xff09;代理服务器。 相关的基本概念 正向代理 客户端配置代理服务器&#xff0c;通过代理服务器访问互联网。 反向代理 客…

【8月EI会议推荐】第四届区块链技术与信息安全国际会议

一、会议信息 大会官网&#xff1a;http://www.bctis.nhttp://www.icbdsme.org/ 官方邮箱&#xff1a;icbctis126.com 组委会联系人&#xff1a;杨老师 19911536763 支持单位&#xff1a;中原工学院、西安工程大学、齐鲁工业大学&#xff08;山东省科学院&#xff09;、澳门…

Xinstall揭秘:一键拉起服务如何助力App提升用户体验和下载转化率

在移动互联网时代&#xff0c;App的运营和推广显得尤为重要。而在这个过程中&#xff0c;如何提升用户体验和下载转化率成为了每个App运营者关注的焦点。今天&#xff0c;我们就来揭秘一下Xinstall的一键拉起服务&#xff0c;看看它是如何助力App提升用户体验和下载转化率的。 …

Java之多线程-同步代码块

线程同步 Java中提供了线程同步的机制&#xff0c;来解决上述的线程安全问题。 Java中实现线程同步&#xff0c;主要借助synchronized关键字实现。 线程同步方式&#xff1a; 同步代码块 同步方法 锁机制 1&#xff09;同步代码块 格式&#xff1a; //Object类及其子类…

Flink笔记整理(五)

Flink笔记整理&#xff08;五&#xff09; 文章目录 Flink笔记整理&#xff08;五&#xff09;七、处理函数&#xff08;最底层最常用最灵活&#xff09;7.1基本处理函数&#xff08;ProcessFunction&#xff09;处理函数的功能和使用ProcessFunction解析 7.2按键分区处理函数&…

数据结构 Day2 链式存储

线性表的链式存储 解决顺序存储的缺点&#xff0c;插入和删除&#xff0c;动态存储问题。特点&#xff1a;线性表链式存储结构的特点是一组任意的存储单位存储线性表的数据元素&#xff0c;存储单元可以是连续的&#xff0c;也可以不连续。可以被存储在任意内存未被占用的位置上…

JavaScript Let

ECMAScript 2015 ES2015 引入了两个重要的 JavaScript 新关键词&#xff1a;let 和 const。 这两个关键字在 JavaScript 中提供了块作用域&#xff08;Block Scope&#xff09;变量&#xff08;和常量&#xff09;。 在 ES2015 之前&#xff0c;JavaScript 只有两种类型的作…

【数据库】联合索引在b+树如何存储

什么是联合索引&#xff1f; 联合索引是一种数据库索引类型&#xff0c;它允许你基于表中两个或多个列的组合来创建索引。这种索引可以提高数据库查询的性能&#xff0c;特别是当查询条件涉及到这些列时。 如&#xff1a; create index id_name_age out users(name,age) 索引…

算法刷题day20|回溯:39. 组合总和、40. 组合总和 II、131. 分割回文串

39. 组合总和 回溯 class Solution { private:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& candidates, int target, int sum, int startIndex) {if (sum > target) {return;}if (sum target) {result.push…

C#、Net6、WebApi报表方案

目录 1 Pdf表单方案 1.1出现如下错误提示: 1.2 字体路径使用 2 Docx报表模板方案 2.1 pdf方案缺陷 2.2 解决方案 3 Spire.Doc报表方案 3.1 Docx方案缺陷 3.2 解决方案 4 插入复选框 5 WebApi文件流下载接口 6 软件获取方式 1 Pdf表单方案 使用【Adobe Acrobat P…

Python 爬虫入门(一):从零开始学爬虫 「详细介绍」

Python 爬虫入门&#xff08;一&#xff09;&#xff1a;从零开始学爬虫 「详细介绍」 前言1.爬虫概念1.1 什么是爬虫&#xff1f;1.2 爬虫的工作原理 2. HTTP 简述2.1 什么是 HTTP&#xff1f;2.2 HTTP 请求2.3 HTTP 响应2.4 常见的 HTTP 方法 3. 网页的组成3.1 HTML3.1.1 HTM…

掀桌子了!原来是咱们的大屏设计太酷,吓着前端开发老铁了

掀桌子了&#xff01;原来是咱们的大屏设计太酷&#xff0c;吓着前端开发老铁了 艾斯视觉观点认为&#xff1a;在软件开发的世界里&#xff0c;有时候创意和设计的火花会擦得特别亮&#xff0c;以至于让技术实现的伙伴们感到既兴奋又紧张。这不&#xff0c;我们的设计团队刚刚…

SpringBoot入门实战:SpringBoot整合Shiro

1.背景介绍 SpringBoot是一个用于快速开发Spring应用程序的框架。它的核心是对Spring框架的一层封装&#xff0c;使其更加简单易用。SpringBoot整合Shiro是一种将SpringBoot与Shiro整合的方法&#xff0c;以实现身份验证和授权功能。 Shiro是一个强大的Java安全框架&#xff0c…

matlab笔记 - 最小二乘法拟合直线的原理与实现

最小二乘法拟合直线原理与实现 一、引言二、原理概述1. 建模思路2.误差函数3.求解最优参数 三、matlab实现最小二乘法拟合直线1.直接代码实现2.MATLAB内置函数实现 四、扩展统计学与回归分析经济学工程学图像处理机器学习 一、引言 最小二乘法&#xff08;Least Squares Metho…

鸿蒙APP架构及开发入门

1.鸿蒙系统 1.1 什么是鸿蒙 鸿蒙是一款面向万物互联时代的、全新的分布式操作系统。 在传统的单设备系统能力基础上&#xff0c;鸿蒙提出了基于同一套系统能力、适配多种终端形态的分布式理念&#xff0c;能够支持手机、平板、智能穿戴、智慧屏、车机、PC、智能音箱、耳机、…

超燃!纯AI生成《泰坦尼克号》大片!浙大阿里发布MovieDreamer:超长电影生成“梦工厂“

论文链接&#xff1a;https://arxiv.org/pdf/2407.16655 项目主页&#xff1a;https://aim-uofa.github.io/MovieDreamer/ github链接&#xff1a;https://github.com/aim-uofa/MovieDreamer 亮点直击 MovieDreamer&#xff0c;一个新颖的分层框架&#xff0c;将自回归模型与扩…

正则表达式与文本处理

目录 一、正则表达式 1、正则表达式定义 1.1正则表达式的概念及作用 1.2、正则表达式的工具 1.3、正则表达式的组成 2、基础正则表达式 3、扩展正则表达式 4、元字符操作 4.1、查找特定字符 4.2、利用中括号“[]”来查找集合字符 4.3、查找行首“^”与行尾字符“$”…

前端江湖:从菜鸟到大侠的修炼手册

在这个数字编织的梦幻世界里&#xff0c;前端&#xff0c;这个听起来就带着几分仙气与神秘感的词汇&#xff0c;实则是每一位互联网探险家手中的魔法杖。它不仅连接着代码的冰冷逻辑与用户的炽热情感&#xff0c;更在无数次的点击与滑动间&#xff0c;绘制出一幅幅绚丽多彩的交…

通过IP获取对应的经纬度地区

背景 项目现在要通过IP获取对应的地区和经纬度。后面会根据经纬度在地图上展示 直接用大佬给出的ip-info 这是大佬给的项目地址 https://gitee.com/jthinking/ip-info这是运行实例 感谢大佬打赏 ![在这里插入图片描述]