数据排布与跨距对齐

news/2024/7/7 20:57:59

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://lihuaxi.xjx100.cn/news/1356273.html

相关文章

在 Linux 系统上安装Docker Compose

在Linux系统上安装Docker Compose需要以下步骤: 首先,确保已经安装了Docker。如果没有安装,请按照Docker官方文档进行安装。 打开终端或命令行界面,并使用以下命令下载Docker Compose二进制文件: sudo curl -L &quo…

自制编译器代码4.6含义

规则一,识别一个" 规则二,识别除了",,\n.\r的其他字符 规则三,这里第一个\意思是一个转义字符\,意思是ASCII码 比如\077就是八进制ASCII码的? 规则四,识别其他所有字符 规则五,回到defailt状态 …

【Trace32】使用Python调用cmm脚本,实现劳特巴赫Trace32的自动化操作

文章目录 1. cmm脚本命令2. 使用python调用cmm脚本 1. cmm脚本命令 cmm脚本自动化操作Trace32的常用命令如下: 注: 1.cmm脚本命令不区分大小写 2.;分号为cmm脚本的注释 1.重启单板 SYStem.RESetTarget r.s pc _start注:SYStem.RESetTarget…

Spring Boot Helper插件免费版的下载

在使用idea的社区版的时候,我们创建springboot项目就要下载springboot helper插件,下载是很简单,但是呢,有一个问题就是: 可以看到它是收费的,要想免费创建spring boot项目那么我们第一可以采用网页版创建&…

【Unity 实用插件篇】| ReferenceFinder 引用查找插件,提高引擎查找使用效率

前言 【Unity 实用插件篇】| ReferenceFinder 引用查找插件,提高引擎查找使用效率一、ReferenceFinder 介绍二、使用示例三、实现方案3.1 方案选择3.2 查找及缓存3.3 界面实现 总结 前言 ReferenceFinder 是一个比较小众的插件,主要用来查找资源引用和…

linux图形界面总结——X、Xorg、WM、QT、GTK、KDE、GNOME的区别与联系

文章目录 一、 linux图形界面二、X协议三、Xfree86 Xorg四、WM(window manager:窗口管理器)五、X协议的Client端实现六、KDE、GNOME、QT和GTK直接关系七、参考: 一、 linux图形界面 linux本身没有图形界面,linux现在的图形界面的实现只是linux下的应用程…

【C++】STL之list容器的模拟实现

个人主页:🍝在肯德基吃麻辣烫 分享一句喜欢的话:热烈的火焰,冰封在最沉默的火山深处。 文章目录 前言一、list的三个类的关系分析图vector和list的区别1.节点的成员变量以及构造函数2.list的迭代器 二、list的增删查改工作2.1inse…

[工具|绘图] markdown的绘图工具Graphviz示例

Graphviz: Graphviz 是一个开源的图形可视化工具,它使用 DOT 语言描述图形结构和属性,并将其转换为图形形式。你可以在 Markdown 中使用 Graphviz 的语法来创建有向图、无向图、流程图等。 示例代码 digraph BusinessModelCanvas {rankdirRL;edge[styl…