数据排布与跨距对齐

news2024/12/1 0:35:21

1 数据排布

1.1 数据排布的概念

在深度学习框架中,特征图通常以四维数组的形式呈现,这四个维度分别是:批量大小N,特征图通道数C,特征图高度H,特征图宽度W。数据排布(Layout)指的就是这四个维度的排列方式,通常有NHWC和NCHW两种。虽然在人的视角下,NHWC和NCHW都是四维数据,但对于计算机而言,数据的存储是线性的,因此四维的数据会以一维的形式保存, NHWC和NCHW的区别就在于四维数据在内存上的存储规则不同。需要注意的是,NHWC与NCHW的概念不适用于NV12(YUV420)数据类型 ,因为4个Y分量对应1组UV分量,因此没有通道的概念。

1.2 NHWC

在这里插入图片描述
对于一张2x2大小的RGB图像,若数据排布为NHWC,则在内存中会依次按照C、W、H、N的顺序储存,不同通道同一位置的像素会储存在一起,如下图所示:
在这里插入图片描述

1.3 NCHW

若2X2大小RGB图像的数据排布为NCHW,则在内存中会依次按照W、H、C、N的顺序储存,即先储存所有R,再储存所有G,最后储存所有B,如下图所示:

在这里插入图片描述

1.4 支持情况

PyTorch、Caffe和PaddlePaddle深度学习框架使用NCHW格式。TensorFlow默认使用NHWC,但GPU版本可以支持NCHW。对于地平线芯片算法工具链来说,NCHW与NHWC两种数据排布训练出来的模型,都可以正常转换、编译。

2 跨距对齐

2.1 跨距的概念

跨距(Stride)是指图像储存在内存中时,每一行所占空间的实际大小。计算机的处理器大都为32位或64位,因此处理器一次读取到的完整数据量最好为4字节或8字节的倍数,若为其他数值,则计算机需要进行专门处理,导致降低运行效率。为了能让计算机高效处理图像,通常会在原本数据的基础上,填充一些额外的数据以做到4字节或8字节对齐。对齐的操作又叫Padding,实际的对齐规则会取决于具体的软硬件系统。

在这里插入图片描述
假设我们有一张8位深的灰度图,高(Height)为20像素,宽(Width)为30像素,那么该图像每行的有效数据为30字节,如果计算机的对齐规则是8字节,那么对齐后图像的跨距为32字节,此时每行需要Padding的数据量为2字节

2.2 BPU的跨距对齐

上述内容只是对跨距规则的通用介绍,对于地平线征程、旭日系列芯片的BPU而言,有专门的跨距对齐规则。比如对于NV12输入,在满足H和W为偶数的前提下,要对Width按照16字节的倍数做对齐(可参考模型输入输出对齐规则解析 https://developer.horizon.ai/forumDetail/118364000835765837 )。对于不同的数据排布和数据类型,BPU的跨距对齐有着不同的规则。图像数据的对齐在板端会由模型推理预测库自动完成(使用代码 input[i].properties.alignedShape = input[i].properties.validShape;),只需要在编写部署代码时,按照对齐后的字节大小分配BPU内存即可(featuremap数据的对齐依然需要用户编写代码完成,可参考OE包的horizon_runtime_sample/code/03_misc/resnet_featur)。对齐后的字节大小,通过读取模型参数可以直接获取,因此使用起来非常方便。

typedef struct {
  hbDNNTensorShape validShape;    // 数据的有效尺寸
  hbDNNTensorShape alignedShape;  // 数据的对齐尺寸
  int32_t tensorLayout;
  int32_t tensorType;
  hbDNNQuantiShift shift;
  hbDNNQuantiScale scale; 
  hbDNNQuantiType quantiType;
  int32_t quantizeAxis;
  int32_t alignedByteSize;        // 数据对齐后所占的字节大小
  int32_t stride[HB_DNN_TENSOR_MAX_DIMENSIONS];
} hbDNNTensorProperties;

工具链的C++SDK提供的结构体hbDNNTensorProperties包含有模型输入/输出张量的详细信息,validShape为数据的有效尺寸,alignedShape为对齐尺寸,alignedByteSize为对齐后所占的字节大小。这些数据使用得当可以让代码的编写更加高效,关于这部分内容的详细信息可以查看工具链手册的BPU SDK API章节。

2.3 去除对齐

对齐是为了照顾软硬件系统的图像读取性能,在完成计算任务后,需要去除对齐,只保留有效数据。若模型以BPU节点结尾,则会输出alignedShape的数据,需要用户编写代码将padding数据跳过(可使用hrt_model_exec model_info查看模型输入输出的alignedShapevalidShape)。若模型尾部有CPU节点,则BPU与CPU在数据传输时会自动去除对齐,不需要用户手动操作。
在这里插入图片描述
尾部为BPU节点的模型,需要用户手动去除对齐数据

在这里插入图片描述
尾部为CPU节点的模型,去除对齐的操作会自动进行,无需用户手动干预。

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

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

相关文章

数学建模的赛题类型

一、预测类 指通过分析已有的数据或者现象,找出其内在发展规律,然后对未来情形做出预测的过程。 根据已知条件和求解目的,往往将预测类问题分为:小样本内部预测,大样本内部预测。 解决预测类赛题的一般步骤&#xff…

Minio桶复制(Bucket Replication)入门

文章目录 前言一、部署下载用户组添加 minio.service 文件新建配置文件 minio启动 二、安装 mc三、桶复制1.权限建立 Replication Admin 用户建立 Replication Remote User 用户 2.建立桶3建立桶复制4.验证 总结遇到问题 前言 桶复制: 可以理解像 mysql 主从备份&a…

基于linux下的高并发服务器开发(第二章)- 2.10 进程间通信简介

面试官经常问: ① 你知道进程间通信的方式有哪几种吗? ② 进程间通信当中某一个方式一个具体的原理是什么?怎么去实现呢? 01 / 进程间通讯概念 02 / Linux进程间通信的方式 怎样理解阻塞非阻塞与同步异步的区别? 怎样…

SpringCloud Gateway网关

文章目录 SpringCloud Gateway1.1 网关架构1.2微服务网关介绍1.3Spring Cloud Gateway(技术选型)1.4依赖1.5yaml配置(包含gateway相关配置,实现转发的功能)1.6断言案例:1.7断言详细介绍1.8 整合nacos1.9 nacos整合网关案例1.10动态路由 SpringCloud Gateway 1.1 网关架构 (dub…

专题-【哈夫曼树】

14年三-1) 已知电文信息为“PEFFQ RQRFE QFPQR FPER” (1)请按此信息构造哈夫曼树,求出每个字符的最优编码; (2)若对每个字符进行等长编码,至少需要几位二进制数?哈夫…

小研究 - 面向 Java 的高对抗内存型 Webshell 检测技术(二)

由于 Web 应用程序的复杂性和重要性, 导致其成为网络攻击的主要目标之一。攻击者在入侵一个网站后, 通常会植入一个 Webshell, 来持久化控制网站。但随着攻防双方的博弈, 各种检测技术、终端安全产品被广泛应用, 使得传统的以文件形式驻留的 Webshell 越来越容易被检测到, 内存…

# Linux终端控制字符详解以及简单应用实践

Linux终端控制字符详解以及简单应用实践 文章目录 Linux终端控制字符详解以及简单应用实践1 控制字符表2 控制字符 ESC (0x1B,^[)子参数表3 控制字符 ESC (0x1B,^[)子参数表 - 字符颜色参照表4 实践&#x…

Windows 如何锁定文件

一、背景 如果应用程序有操作本地文件的功能(如:读、写、复制、移动、删除等等),那么在测试或调试该应用程序时,肯定需要测试文件被其他应用程序锁定时,你的应用程序是如何处理的。 那么如何在本地模拟文件…

抓包工具Fiddler的下载安装使用

文章目录 Fiddler1. 安装与使用教程2. 抓包工具的原理 Fiddler 1. 安装与使用教程 下载地址: https://www.telerik.com/fiddler/ 安装过程只用一路next即可; 下图是我们安装好Fiddler打开的界面: 右侧显示就是我们主机发送http/https请求的记录。如果…

黑马头条 分布式任务调度 定时计算热点文章、xxl-job、kafkaStream

xxl-Job分布式任务调度 1 今日内容 1.1 需求分析 目前实现的思路:从数据库直接按照发布时间倒序查询 问题1: 如何访问量较大,直接查询数据库,压力较大问题2: 新发布的文章会展示在前面,并不是热点文章 1.2 …

Flutter——最详细(NavigationRail)使用教程

NavigationRail 简介 一个 Material Design 小部件,旨在显示在应用程序的左侧或右侧,以便在少量视图(通常在三到五个视图之间)之间导航。 使用场景: 通过Row属性,左侧或右侧菜单栏按钮 属性作用onDestinati…

Hadoop——大数据生态体系详解

一.大数据概论 1.1 大数据概念 大数据(big data):指无法在一定时间范围内用常规软件工具进行捕捉、管理 和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程 优化能力的海量、高增长率和多样化的信息资产…

前端 Jenkins 自动化部署

由于公司使用自己搭建的 svn 服务器来进行代码管理,因此这里 Jenkins 是针对 svn 服务器来进行的配置,其实跟Git 配置基本一致。 在没有自动化部署前 之前项目每次修改之后都需要本地 ​​npm run build ​​一次手动发布到服务器上方便测试和产品查看…

微服务组件Feign实战 - 解决日志配置失效

1. RPC概述 思考: 微服务之间如何方便优雅的实现服务间的远程调用? RPC 全称是 Remote Procedure Call ,即远程过程调用,其对应的是我们的本地调用。RPC 的目的是:让我们调用远程方法像调用本地方法一样。 //本地调用…

【unity之IMGUI实践】游戏玩法逻辑实现【四】

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:uni…

3.11 Bootstrap 徽章(Badges)

文章目录 Bootstrap 徽章(Badges)激活导航状态 Bootstrap 徽章(Badges) 下面将讲解 Bootstrap 徽章(Badges)。徽章与标签相似,主要的区别在于徽章的边角更加圆滑。 徽章(Badges&…

短视频seo抖音矩阵号系统源码开发搭建分享

我们自主研发的短视频矩阵系统源码,技术研发的独立核心算法的视频内容管理和展示功能。无需额外的流量接口费用和复杂的配置,轻松地创建和管理短视频内容,短视频矩阵源码是指将抖音平台上的视频资源进行筛选、排序等操作,进而提升…

【ROS】ROS1人机界面开发:在QtCreator中创建ROS1功能包

【ROS】郭老二博文之:ROS目录 1、版本要求 ROS的QtCreator插件要和QtCreator版本对应一致,否则报错。 本人QtCreator版本为:10.0.1,需要下载安装ros_qtc_plugin的版本也要为10.0版本 2、安装 ros_qtc_plugin 2.1 下载插件 github:https://github.com/ros-industrial…

基于fpga实现tft屏幕显示数字、字母

简介 开发平台:ZYNQ 开发工具:Vivado 2018.3 tft屏幕分辨率:800*480 在PL端使用纯verilog实现bitmap模块,基于该模块实现在tft屏幕显示数字0-9,以及FPGA字母 Bitmap模块 该模块为5*5的bitmap,纯组合逻辑&…

7-18作业

#include<iostream>using namespace std; class My_stack { private:int* ptr; //执行堆区空间int top;int size; //记录栈顶元素public:My_stack() :ptr(new int[10]), top(-1), size(10) {}//有参构造My_stack(int size) :ptr(new int[10]), top(-1), size(siz…