MIT-BEVFusion系列九--CUDA-BEVFusion部署4 c++解析pytorch导出的tensor数据

目录

    • 创建流
    • 打印 engine 信息
      • 打印结果
      • 内部流程
    • 启动计时功能
    • 加载变换矩阵并更新数据(重要)
      • 内部实现

该系列文章与qwe一同创作,喜欢的话不妨点个赞。

create_core方法结束后,我们的视角回到了main.cpp中。继续来看接下来的流程。本章的重点在于pytorch导出的tensor数据的解析。

创建流

在这里插入图片描述

流用于表示一系列的命令(如内存传输命令和核函数执行命令)在 GPU 上的执行顺序。流中的命令按照它们被插入的顺序在 GPU 上执行,但不同流中的命令可以并行执行。这里主要用于更新数据、推理和可视化时使用。

打印 engine 信息

这里会打印出执行CUDA-BEVFusion时,终端打印的信息中的网络信息。
从这里我们能清楚的看到一下几点:

  • 1)当前网络属于哪个部分。
  • 2)网络输入和输出的个数,数据形状

输出的网络数量与onnx数量是一一对应的。

打印结果

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

内部流程

在这里插入图片描述

print的具体实现在下方。
在这里插入图片描述

这部分用于打印这四个 engine 的信息,包含模型名称和绑定点的信息(输入输出是否为动态形状,输入输出节点索引、名称、维度和类型)。

启动计时功能

是否计时,这里设置为true
在这里插入图片描述

coreCoreImplement的一个实例,而CoreImplement继承了类Core
在这里插入图片描述
在类Core中set_timer是一个纯虚方法。
在这里插入图片描述

用于后续判断是否打印推理时每个模块的用时。

加载变换矩阵并更新数据(重要)

  • nv::Tensornv::format 是 Nvidia 提供在 src/common 中的工具
  • 下图 246 行之 249 行,加载一系列准备好的矩阵参数。
  • 下图所加载的.tensor后缀的文件,均是从pytorch中导出,保存的二进制文件。
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

  1. 格式化字符串传入:调用 nv::format 函数,传入格式字符串 "%s/camera2lidar.tensor"data 指针。这里的 %s 是一个占位符,用于指示将在这个位置插入一个字符串。
  2. 变量参数处理:在 format 函数内部,函数首先定义一个字符数组 buffer[2048] 作为存储结果的缓冲区。然后,它使用 va_list vl 初始化可变参数列表,并通过 va_start(vl, fmt) 宏开始访问这些参数。
  3. 字符串格式化:使用 vsnprintf 函数,将 data 指针所指向的字符串(即 "example-data")和格式字符串合并。vsnprintf 根据格式字符串 "%s/camera2lidar.tensor" 替换 %sdata 指向的字符串,因此格式化后的字符串将变为 "example-data/camera2lidar.tensor"
  4. 安全检查和内存管理:vsnprintf 函数使用 sizeof(buffer) 确保不会向 buffer 写入超出其容量的数据,从而避免缓冲区溢出。这是一个重要的安全特性,确保即使格式化的字符串非常长,也不会导致内存损坏。
    5. 返回结果:格式化后的字符串存储在 buffer 中。format 函数最后将 buffer 转换为 std::string 类型并返回这个字符串。
  • 加载结果,以 加载camera2lidar 为例:
    在这里插入图片描述

通过上图,我们就可以发现,.tensor后缀的文件存储的数据,可以分为数据头,和数据两个部分。

数据头,即描述数据信息的属性,例如shape、numel、ndim。描述数据的信息。

数据,即具体的数据的起始地址。

通过数据的读取,我们可以大致看一下作者是如何设计的。

内部实现

在这里插入图片描述

  1. 取文件前 3 个 int 字节大小的内容,第一个是 magic_number,类似识别码,第二个表示数据维度数量(ndims),第三个表示数据类型 id。
  2. 使用 dims 来存储每个维度的数值,使用 shape 来储存形状,用于后续创建 Tensor。计算矩阵的总参数量 volumn,然后通过每个数据占用空间 dtype 和总参数量 volumn 来计算储存矩阵数据需要的空间 bytes
  3. 读取文件中的数据,在 host 上使用容器 host_data 来储存。
  4. host 上创建 Tensor 对象,并将数据拷贝到 output 中。

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

  • 小结:
    • nvidia这个仓库的src/common中的tensor解析比较重要,nv::Tensor是一个通用的pytorch与c++数据联通的桥梁,值得一看。

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

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

相关文章

挑战杯 基于大数据的时间序列股价预测分析与可视化 - lstm

文章目录 1 前言2 时间序列的由来2.1 四种模型的名称: 3 数据预览4 理论公式4.1 协方差4.2 相关系数4.3 scikit-learn计算相关性 5 金融数据的时序分析5.1 数据概况5.2 序列变化情况计算 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 &…

CSV数据导入到ClickHouse数据库

问题描述:手头上有一个数据量较大的CSV文件,希望导入到指定的ClickHouse数据中,ClickHouse部署在服务器中。 解决方案:通常来说,数据量较少的CSV文件可以直接通过DBeaver软件的可视化界面导入数据。 若数据量较大&…

解释C++中的模板元编程

C中的模板元编程(Template Metaprogramming,TMP)是一种利用模板实现在编译时进行计算和代码生成的技术。这意味着你可以在编译时执行那些通常在运行时进行的操作,如条件判断、循环以及函数调用。模板元编程可以用来生成高度优化和…

【操作系统】14.I/O设备怎么分配和回收?

5.2 I/O设备怎么分配和回收? 5.2.1 I/O核心子系统 I/O调度 设备保护 假脱机技术(SPOOLing技术) ​ 输入井和输出井 ​ 输入进程和输出进程 ​ 输入缓冲区和输出缓冲区 设备分配与回收 ​ 设备分配应考虑的因素 ​ 静态分配与动态分配 ​ 设备…

MessageSource学习

简介 MessageSource 是 Spring 框架中的一个接口,它负责提供对国际化(i18n)和本地化(l10n)消息的支持。MessageSource 接口定义了一组方法,允许应用程序根据指定的消息代码和参数来获取本地化的消息字符串…

Runaway Queries 管理:提升 TiDB 稳定性的智能引擎

在数字化系统扮演重要角色的今天,数据库稳定性成为企业关注的核心问题。对于重要计算机系统而言,突发的性能下降可能对业务造成不可估量的损失。为了稳定数据库性能,用户可以从管理流程入手规范变更的测试,或者利用产品手段减少预…

3DIoUMatch: Leveraging IoU Prediction for Semi-Supervised 3D Object Detection

3DIoUMatch: Leveraging IoU Prediction for Semi-Supervised 3D Object Detection 论文链接:https://arxiv.org/pdf/2012.04355.pdf 代码链接:https://github.com/yezhen17/3DIoUMatch 作者单位:Stanford University等 发表平台:…

【JavaEE】_Servlet程序的编写方法

目录 1. 创建项目 2. 引入依赖 3. 创建目录结构 3.1 在main目录下创建一个webapp目录 3.2 在webapp目录下创建一个WEB-INF目录 3.3 在WEB-INF目录下创建一个web.xml文件 3.4 在web.xml中进行代码编写 4. 编写代码 4.1 在java目录下创建类 4.2 打印"hello world&…

无人机精准定位技术,GPS差分技术基础,RTK原理技术详解

差分GPS的基本原理 差分GPS(Differential GPS,简称DGPS)的基本原理是利用一个或多个已知精确坐标的基准站,与用户(移动站)同时接收相同的GPS卫星信号。由于GPS定位时会受到诸如卫星星历误差、卫星钟差、大…

uniapp离线打包(使用Android studio打包)

一、准备工作 安装HbuilderX,记住版本号下载对应HbuilderX版本的Android离线SDK,如我使用3.6.18版本打包,则对应应下载3.6.18版本的SDK(官网不提供旧版本的SDK,有些需要自己找)官网下载地址:ht…

基于Java+SpringBoot+Vue.js前后端分离水果购物商城系统设计和实现 可行性分析

博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…

2、Web攻防-SQL注入-联合查询注入

用途:个人学习笔记,有所借鉴,欢迎指正! 声明:只用于学习交流,点到为止,请勿非法测试。 概念: 联合查询注入:联合注入是回显注入的一种,也就是说联合注入的前…

【Python如何求出水仙花数】

1、求水仙花数Python代码如下: # 求水仙花数:只需要个十百位的3次幂之和与原数相等 for i in range(100, 1000): # 循环100-999整数i1 i % 10 # 取个位 “%”表示除以后取余数i2 i // 10 % 10 # 取十位i3 i // 100 # 取百位 “//”表示除以后取整…

二十六、直方图均衡化

项目功能实现&#xff1a;对灰度图片进行直方图均衡化操作 按照之前的博文结构来&#xff0c;这里就不在赘述了 一、头文件 histogram_equal.h #pragma once#include<opencv2/opencv.hpp>using namespace cv;class HISTOGRAM_EQUAL { public:void histogram_equal(Mat…

nginx 模块

ngx_http_core_module 核心模块 ngx_http_access_module 访问控制模块 deny allow ngx_http_auth_basic_module 身份 小红小名&#xff08;虚拟用户&#xff09; ftp也有虚拟用户 ngx_http_gzip_module 压缩模块 ngx_http_gzip_static_module ngx_http_log_modu…

计网七层模型:从物理层到应用层

哈喽大家好&#xff0c;我是chowley&#xff0c;相信大家在面试中都被问到过网络模型&#xff0c;今儿我就来总结一下每层的功能和特点&#xff01; 在计算机网络中&#xff0c;七层网络模型&#xff08;ISO/OSI参考模型&#xff09;是一种标准的网络架构&#xff0c;用于描述…

编程笔记 Golang基础 018 常量与变量

编程笔记 Golang基础 018 常量与变量 一、常量常量的定义iota特性 二、变量变量定义变量作用域零值与初始化类型转换注意事项 三、重要性 常量&#xff0c;就是在程序编译阶段就确定下来的值&#xff0c;而程序在运行时则无法改变该值。变量是程序的基本组成单位&#xff0c;用…

Android 解决后台服务麦克风无法录音问题

Android 解决后台无法录音问题 问题分析问题来源解决方案1. 修改清单文件:`AndroidManifest.xml`2. 修改启动服务方式3. 服务启动时创建前台通知并且指定前台服务类型参考文档最后我还有一句话要说我用心为你考虑黄浦江的事情,你心里想的却只有苏州河的勾当 问题分析 安卓9.…

2024年华为OD机试真题-字符串拼接-Python-OD统一考试(C卷)

题目描述: 给定M(0<M<=30)个字符(a-z),从中取出任意字符(每个字符只能用一次)拼接成长度为N(0<N<=5)的字符串,要求相同的字符不能相邻,计算出给定的字符列表能拼接出多少种满足条件的字符串,输入非法或者无法拼接出满足条件的字符串则返回0。 输入描述: …

视频监控平台如何结合AI技术

视频监控平台与AI技术的结合为安防领域带来了革命性的进步。通过引入AI技术&#xff0c;视频监控平台可以实现对监控视频内容的智能分析、识别和理解&#xff0c;从而提高监控效率和准确性&#xff0c;为城市安全和管理提供有力支持。 首先&#xff0c;视频监控平台可以利用AI…