数据排布与跨距对齐

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.mzph.cn/news/4829.shtml

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

相关文章

http1.0、http1.1 http 2.0

HTTP/1.0是无状态、无连接的应用层协议。 无连接 无连接:每次请求都要建立连接,需要使用 keep-alive 参数建立长连接、HTTP1.1默认长连接keep-alive   无法复用连接,每次发送请求都要进行TCP连接,TCP的连接释放都比较费事&…

【优选算法题练习】day6

文章目录 一、76. 最小覆盖子串1.题目简介2.解题思路3.代码4.运行结果 二、704. 二分查找1.题目简介2.解题思路3.代码4.运行结果 三、34. 在排序数组中查找元素的第一个和最后一个位置1.题目简介2.解题思路3.代码4.运行结果 总结 一、76. 最小覆盖子串 1.题目简介 76. 最小覆…

魔术之舞:用Python编织无懈可击的WebUI自动化测试奇迹

文末附有精心准备的WebUI自动化测试30道面试题链接~ 一、引言 A. 引入WebUI自动化测试的重要性和挑战 Web应用程序的快速发展和普及使得Web用户界面(WebUI)自动化测试变得异常重要。随着Web应用程序的复杂性和功能需求的增加,传统的手动测试…

2023秋招,网络安全面试题

Hello,各位小伙伴,我作为一名网络安全工程师曾经在秋招中斩获🔟个offer🌼,并在国内知名互联网公司任职过的职场老油条,希望可以将我的面试的网络安全大厂面试题和好运分享给大家~ 转眼2023年秋招已经到了金…

04.MySQL——用户管理

用户管理 用户管理的价值 用户 用户信息 MySQL中的用户,都存储在系统数据库mysql的user表中 use mysql;select host,user,authentication_string from user;host: 表示这个用户可以从哪个主机登陆,如果是localhost,表示只能从…

Qt 获得QTableview所选中的行的某一列数据

1、点击QtableView控件-》右键-》跳到槽-》选择 2、编写槽函数信息 void XXX::on_tableView_CalTable_clicked(const QModelIndex &index) {int rowindex.row();//获得当前行索引int colindex.column();//获得当前列索引QModelIndex index1 CalViewModel->index(row,2)…

Enterprise:通过 App search 摄入数据

App Search 是 Elastic Enterprise Search 的一部分,Elastic Enterprise Search 是由 Elasticsearch 提供支持的内容搜索工具集合。 最初由 App Search 引入的一些功能(例如网络爬虫)现在可以直接通过企业搜索使用。 将这些功能与其他企业搜…

SpringCloud系列:负载均衡组件-Ribbon

作者平台: | CSDN:blog.csdn.net/qq_41153943 | 掘金:juejin.cn/user/651387… | 知乎:www.zhihu.com/people/1024… | GitHub:github.com/JiangXia-10… 本文一共4529字,预计阅读12分钟 前言 前面几…

idea 有时提示找不到类或者符号,日志报java: 找不到符号的解决

解决一&#xff1a; idea maven编译成功&#xff0c;运行失败提示找不到符号&#xff0c;主要是get和set方法找不到符号&#xff0c;此时就是idea的lombok版本冲突 IDEA版本导致的Lombok失效&#xff0c;需要更新lombok版本到1.18.14及之后版本得到解决 <dependency>&…

科技云报道:数字化转型完成后,制造业如何走向“数智”时代?

科技云报道原创。 随着我国数字化转型行动的深入推进和智能制造工程的大力实施&#xff0c;制造业正朝着“数智”时代迈进&#xff0c;生成式AI被视为推动制造业智能化发展的关键驱动力。 据预测&#xff0c;到2027年&#xff0c;将有30%的制造业采用生成式AI来提升产品研发效…

【C++修炼之路】类和对象(下)—— 完结篇

&#x1f451;作者主页&#xff1a;安 度 因 &#x1f3e0;学习社区&#xff1a;StackFrame &#x1f4d6;专栏链接&#xff1a;C修炼之路 文章目录 一、再谈构造函数1、初始化列表2、explicit 关键字 二、static 成员1、概念2、特性 三、友元1、友元函数2、友元类 四、内部类五…

zabbix监控linux主机、监控windows10主机

目录 一、环境准备 1、关闭防火墙 2、准备三台服务器、添加主机声明 3、修改主机名 4、此篇接着上一篇zabbix监控自己的环境下操作&#xff0c;server&#xff08;192.168.147.135&#xff09;已经配置好 二、源码安装zabbix 1、下载包、安装依赖包、联网同步清华时间 2…

十分钟让你了解 Linux ABI

getline() 提供了一种更灵活的方法&#xff0c;可以在不破坏系统的情况下将用户数据读入程序。 在 C 语言中读取字符串是一件非常危险的事情。当读取用户输入时&#xff0c;程序员可能会尝试使用 C 标准库中的 gets 函数。它的用法非常简单&#xff1a; char *gets(char *stri…

Kubernetes对象深入学习之三:对象属性

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 本文是《Kubernetes对象深入学习》系列的第三篇&#xff0c;主要内容是关于对象属性的知识点&#xff0c;关于对象属性&#xff0c;先通过一个具体…

LeetCode·每日一题·1851. 包含每个查询的最小区间·优先队列(小顶堆)

题目 示例 思路 离线查询&#xff1a; 输入的结果数组queries[]是无序的。如果我们按照输入的queries[]本身的顺序逐个查看&#xff0c;时间复杂度会比较高。 于是&#xff0c;我们将queries[]数组按照数值大小&#xff0c;由小到大逐个查询&#xff0c;这种方法称之为离线查询…

Ceph 服务的运用

目录 一、资源池 pool 管理 1.创建一个 Pool 资源池 2.查看集群 Pool 信息 3.查看资源池副本的数量 4.查看 PG 和 PGP 数量 5.修改 pg_num 和 pgp_num 的数量为 128 6.修改 Pool 副本数量为 2 7.修改默认副本数为 2 8.删除 Pool 资源池 8.1修改配置文件 8.2推送 ceph…

TypeScript 1 - 小记

文章目录 关于 TypeScript 关于 TypeScript TypeScript is a superset of JavaScript that compiles to clean JavaScript output. 官网&#xff1a;https://www.typescriptlang.orggithub : https://github.com/microsoft/TypeScriptplayground : https://www.typescriptlan…

BTP Integration Suite学习笔记 - (Unit3) Developing with SAP Integration Suite

BTP Integration Suite学习笔记 - (Unit1) Developing with SAP Integration Suite BTP Integration Suite学习笔记 - (Unit2) Developing with SAP Integration Suite 带着一个问题去学&#xff1a;明明可以直接访问一个后端系统的OData服务&#xff0c;为什么还要再多绕一道C…

Linux5.16 Ceph集群

文章目录 计算机系统5G云计算第四章 LINUX Ceph集群一、Ceph1.存储基础1&#xff09;单机存储设备2&#xff09;单机存储的问题3&#xff09;商业存储解决方案4&#xff09;分布式存储&#xff08;软件定义的存储 SDS&#xff09;5&#xff09;分布式存储的类型 2.Ceph 简介3.C…

获得servlet相关API,获得请求头和cookie-spring23

后台能够成功打印 如何获得请求头 如何获得cookie 获取浏览器信息 把network下user Agent的值赋给他 这个值可以直接赋给Cookie 就是这个cookie 把cookie的值赋值给一边JasonId&#xff0c; 这里面的Value代表着名字,名字是cookie后面那一块&#xff1a;