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

2024-02-24 13:20

本文主要是介绍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++数据联通的桥梁,值得一看。

这篇关于MIT-BEVFusion系列九--CUDA-BEVFusion部署4 c++解析pytorch导出的tensor数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/742232

相关文章

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

Java Spring ApplicationEvent 代码示例解析

《JavaSpringApplicationEvent代码示例解析》本文解析了Spring事件机制,涵盖核心概念(发布-订阅/观察者模式)、代码实现(事件定义、发布、监听)及高级应用(异步处理、... 目录一、Spring 事件机制核心概念1. 事件驱动架构模型2. 核心组件二、代码示例解析1. 事件定义

CSS place-items: center解析与用法详解

《CSSplace-items:center解析与用法详解》place-items:center;是一个强大的CSS简写属性,用于同时控制网格(Grid)和弹性盒(Flexbox)... place-items: center; 是一个强大的 css 简写属性,用于同时控制 网格(Grid) 和 弹性盒(F

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

python常见环境管理工具超全解析

《python常见环境管理工具超全解析》在Python开发中,管理多个项目及其依赖项通常是一个挑战,下面:本文主要介绍python常见环境管理工具的相关资料,文中通过代码介绍的非常详细,需要的朋友... 目录1. conda2. pip3. uvuv 工具自动创建和管理环境的特点4. setup.py5.

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

全面解析HTML5中Checkbox标签

《全面解析HTML5中Checkbox标签》Checkbox是HTML5中非常重要的表单元素之一,通过合理使用其属性和样式自定义方法,可以为用户提供丰富多样的交互体验,这篇文章给大家介绍HTML5中C... 在html5中,Checkbox(复选框)是一种常用的表单元素,允许用户在一组选项中选择多个项目。本