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.hqwc.cn/news/487917.html

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

相关文章

【MySQL系列 04】深入浅出索引

一、索引介绍 提到数据库索引,相信大家都不陌生,在日常工作中会经常接触到。比如某一个 SQL 查询比较慢,分析完原因之后,你可能就会说“给某个字段加个索引吧”之类的解决方案。 但到底什么是索引,索引又是如何工作的…

自动化操作读写Excel —— xlrd 和 xlwt 模块参数说明与代码实战【第95篇—自动化操作读写Excel 】

自动化操作读写Excel —— xlrd 和 xlwt 模块参数说明与代码实战 在日常工作中,Excel表格是不可或缺的数据处理工具。为了提高工作效率,Python中的xlrd和xlwt模块为我们提供了强大的功能,使得自动化操作Excel变得更加简便。本文将介绍xlrd和…

FastJson反序列化漏洞(Fastjson1.2.47)

一、FastJson Fastjson 是一个阿里巴巴公司开源的 Java 语言编写的高性能功能完善的 JSON 库。可以将Java 对象转换为 JSON 格式(序列化),当然它也可以将 JSON 字符串转换为 Java 对象(反序列化) 它采用一种“假定有序快速匹配”的算法&…

Vue中如何使用dayjs

Day.js中文网Day.js是一个极简的JavaScript库,可以为现代浏览器解析、验证、操作和显示日期和时间。https://dayjs.fenxianglu.cn/ 单位不区别大小写,支持复数和缩写形式 单位缩写描述 date D日期 [1,31]dayd星期 [0,6](星期日0&#xff0c…

林浩然与杨凌芸的Swing组件奇遇记:从按钮到滚动条的UI大冒险

林浩然与杨凌芸的Swing组件奇遇记:从按钮到滚动条的UI大冒险 The Swing Component Odyssey of Lin Haoran and Yang Lingyun: A UI Adventure from Buttons to Scrollbars 在Java王国的一隅,程序员才子林浩然和智慧女神杨凌芸正在进行一场别开生面的UI设…

NXP实战笔记(八):S32K3xx基于RTD-SDK在S32DS上配置LCU实现ABZ解码

目录 1、概述 2、SDK配置 2.1、IO配置 2.2、TRGMUX配置 2.3、LCU配置 2.4、Trgmux配置 2.5、Emios配置 2.6、代码实现 1、概述 碰到光电编码器、磁编码器等,有时候传出来的位置信息为ABZ的方式,在S32K3里面通过TRGMUX、LCU、Emios结合的方式可以实现ABZ解码。 官方…

【深度学习】LoRA: Low-Rank Adaptation of Large Language Models,论文解读

文章: https://arxiv.org/abs/2106.09685 文章目录 摘要介绍LoRA的特点什么是低秩适应矩阵?什么是适应阶段?低秩适应矩阵被注入到预训练模型的每一层Transformer结构中,这一步是如何做到的? 摘要 自然语言处理的一个重…

数据库管理-第154期 Oracle Vector DB AI-06(20240223)

数据库管理154期 2024-02-23 数据库管理-第154期 Oracle Vector DB & AI-06(20240223)1 环境准备创建表空间及用户TNSNAME配置 2 Oracle Vector的DML操作创建示例表插入基础数据DML操作UPDATE操作DELETE操作 3 多Vector列表4 固定维度的向量操作5 不…

linux drm mipi dsi lcd 点屏之设备树配置

linux drm mipi dsi lcd 点屏之设备树配置 设备树文档: https://elixir.bootlin.com/linux/v6.8-rc5/source/Documentation/devicetree/bindings/display/dsi-controller.yaml https://elixir.bootlin.com/linux/v6.8-rc5/source/Documentation/devicetree/binding…

【Vuforia+Unity】AR06-空间环境识别功能(AreaTargets)

Vuforia原理:把被识别的物体转成图、立体图、柱形图,3D模型、环境模型,然后模型生成Vuforia数据库-导入Unity-参考模型位置开始摆放数字内容,然后参考模型自动隐藏-发布APP-识别生活中实物-数字内容叠加上去! 不论你是否曾有过相关经验,只要跟随本文的步骤,你就可以成功…

Excel 面试题及答案(2)

一、VLOOKUP+IF案例: A1 :根据左侧数据源,按姓名匹配《职级》,仅限用函数,不能做任何辅助A2 :根据左侧数据源,按姓名匹配《部门》,仅限用函数,不能做任何辅助A3 :根据右侧考核规则,匹配《绩效比例》,用函数完成(可适当做辅助的单元格区域) =VLOOKUP(F8,IF({1,0},…

OCPP 1.6 接入实现文档

一、简介 OCPP(Open Charge Point Protocol)是一个开放的通信协议,用于充电站(Charge Point)与中央系统(Central System,如充电站管理系统或服务提供商平台)之间的通讯。本篇文档将…