最近同事碰到了一个不同框架模型互相转换的问题:pytorch模型或caffe模型要转到tensorflow和TFLite上进行移动端的部署。模型从pytorch或caffe转tensorflow通过ONNX作为中转还相对顺利,但是从tensorflow到TFLite的时候却遇到了输入不匹配的问题。原因在于pytorch,caffe输入数据通常以“NCHW”的形式进行排列。虽然转到tensorflow的时候依旧也能按照“NCHW”的方式转成功,但是Tensorflow转TFLite竟然失败了。原来TFLite仅支持“NHWC”这种tensorflow系的数据排布方式。最后我同事虽然解决了,但是我也有了疑问:为啥各个框架的数据内存排布会不一样?

首先,在深度学习框架中,通常的卷积神经网络特征图用四维数组保存,四个维度分别为“N”batch批量大小,“C”channels特征图通道数,“H”特征图的高,和“W”特征图的宽。虽然我们人可以的将数据按照任意维度进行划分,然而对于计算机而言,数据的存储只能是线性的。假如一个特征图维度为[1,3,2,2],实际上存储的是一块1x3x2x2=12个顺序的数据块。

在pytorch和caffe的排布方式中,一张2x2的RGB格式的图像,使用“NCHW”实际存储的是“RRRRGGGGBBBB”,同一个通道的所有像素值顺序存储在一起。而Tensorflow通常的排列使用“NHWC”为“RGBRGBRGBRGB”, 多通道的同一位置的像素值顺序存储在一起。

NCHW(上) 与NHWC(下)

尽管存储的数据实际上是一样的,但是不同的顺序会导致数据的访问特性不一致,因此即使进行同样的运算,相应的计算性能也会不一样。对于"NCHW" 而言,其同一个通道的像素值连续排布,更适合那些需要对每个通道单独做运算的操作,比如"MaxPooling"。对于"NHWC"而言,其不同通道中的同一位置元素顺序存储,因此更适合那些需要对不同通道的同意像素做某种运算的操作,比如“Conv1x1”。如下图:

NCHW MaxPooling (左), NHWC Conv1x1 (右)

从上图可以看出,"NCHW"的计算时需要的存储更多,适合GPU运算,正好利用了GPU内存带宽较大并且并行性强的特点,其访存与计算的控制逻辑相对简单。而"NHWC"更适合多核CPU运算,CPU的内存带宽相对较小,每个像素计算的时延较低,临时空间也很小,有时计算机采取异步的方式边读边算来减小访存时间,因此计算控制灵活且复杂。因此,深度学习以cuDNN为底层的pytoch和caffe框架默认使用了 "NCHW" 格式,而Tensorflow采用了"NHWC",据说是由于早期主要使用CPU加速,这也解释了为何面向移动端部署的TFLite只采用了"NHWC" 格式。

除了这两种排布方式,还有别的排布方式吗? 答案是当然有。

比如说面向移动端的阿里出品的MNN框架,是以 "NC4HW4" 五维数据格式作为排布的,具体详情的可以参考:

Tensor中数据摆放顺序NC4HW4是什么意思,只知道NCHW格式,能解释以下NC4HW4格式吗?​www.zhihu.com

又比如华为海思的昇腾Ascend310芯片系列,其深度学习框架为了提高数据的访存效率,所有的张量数据统一也采用了 "NC1HWC0"的五维格式。由于其AI core的芯片设计,其cube矩阵计算单元的大小要求有要求,只能支持16x16的矩阵运算。其中对于FP16类型的数据要对齐16,对于INT8类型的数据要对齐32(其实与FP16等价)。其中五维度的"C0" 与这个数据对齐强相关,"C0, C1"其实就是从原本"NCHW"的"C"维度进行了拆分,"C1 = C / C0", 如果不能整除,则最后需要补零来对齐。其大致的拆解过程为:

(1)将"NCHW"数据在C维度进行分割,分出C1份NHWC0;

(2) 将C1份"NHWC0"在内存中连续排列,变成了"NC1HWC0"。

从阿里的MNN与华为的昇腾系列芯片的数据排布来看,不难发现他们都在"C"这个Channel维度做文章。看起十分复杂,但其实这非常合理和高效。由于典型的卷积神经网络随着层数的增加,其特征图在下采样后的长和宽逐渐减小,但是channel数随着卷积的filter的个数不断增大是越来越大的,经常会出现channel数为128,256等很深的特征图。这些很深的特征图与filter数很多的卷积层进行运算是很heavy的。为了充分利用有限的矩阵计算单元,进行了Channel维度的拆分是很有必要的。

那么有没有针对H和W维度进行优化的呢?答案也是当然有的。很多运算会关注数据时行优先(Row-Major)还是列优先(Column-Major)。矩阵运算的时候有左右矩阵之分,在这两个矩阵一个需要按行优先,一个需要按列优先访问。但是实际上输入的NCHW数据,HW会根据实际应用改变,比如1080P的输入数据,W比H大;Person-reid任务中图像H比W大。输入大小往往决定了特征图的输出大小。因此在输入矩阵前,往往会通过软件或者硬件对数据进行重排列,以达到最优的计算效率,正如上面所说的华为NCHW->NC1HWC0。

当然上述的排列方式没有孰优孰劣之分,不同的排布方式也有相应的底层优化算法,对上层用户来说这些差异是看不见的。深度学习引擎特别会在推理的时候,根据实际硬件结构和计算资源,对数据排布进行转换,有些中间过程的数据的排布和访存甚至会有多种优化方式。这也是很多kernel优化所要做的。

深度学习框架zf_谈谈深度学习框架的数据排布相关推荐

  1. 深度学习框架zf_深度学习十大框架比较

    框架比较(转): 1 TensorFlow 对于那些听说过深度学习但还没有太过专门深入的人来说,TensorFlow 是他们最喜欢的深度学习框架,但在这里我要澄清一些事实. 在 TensorFlow ...

  2. 深度学习调用TensorFlow、PyTorch等框架

    深度学习调用TensorFlow.PyTorch等框架 一.开发目标目标 提供统一接口的库,它可以从C++和Python中的多个框架中运行深度学习模型.欧米诺使研究人员能够在自己选择的框架内轻松建立模 ...

  3. 深度学习框架哪家强?国产框架OneFlow做了一份测评报告

    视学算法报道 机器之心编辑部 近日,国产深度学习框架 OneFlow 发布了人工智能方向深度学习领域的 DLPerf 测评报告. 数据显示,OneFlow 在 4 机 32 卡下的 ResNet50- ...

  4. TensorFlow与PyTorch之争,哪个框架最适合深度学习

    (给视学算法加星标,提升Python技能) 编译:机器之心,作者:Vihar Kurama 谷歌的 Tensorflow 与 Facebook 的 PyTorch 一直是颇受社区欢迎的两种深度学习框架 ...

  5. Facebook又放大招!开源框架Pythia让深度学习更高效

    https://www.toutiao.com/a6693693085001449995/ 2019-05-22 11:47:49 [新智元导读]Facebook的人工智能研究部门近期推出Pythia ...

  6. 针对深度学习(神经网络)的AI框架调研

    针对深度学习(神经网络)的AI框架调研 在我们的AI安全引擎中未来会使用深度学习(神经网络),后续将引入AI芯片,因此重点看了下业界AI芯片厂商和对应芯片的AI框架,包括Intel(MKL CPU). ...

  7. DL框架:主流深度学习框架(TensorFlow/Pytorch/Caffe/Keras/CNTK/MXNet/Theano/PaddlePaddle)简介、多个方向比较、案例应用之详细攻略

    DL框架:主流深度学习框架(TensorFlow/Pytorch/Caffe/Keras/CNTK/MXNet/Theano/PaddlePaddle)简介.多个方向比较.案例应用之详细攻略 目录 深 ...

  8. 深度学习“奠基人”特伦斯:人工智能算法框架可被科学家掌控

    图片来源:摄图网 1989年,特伦斯·谢诺夫斯基在MIT以苍蝇的视觉网络迭代发展举例,将当时并不被看好的神经网络概念普及给支持逻辑计算程序的教员们.到今天,"深度神经网络"已成为人 ...

  9. 【华为云技术分享】Spark如何与深度学习框架协作,处理非结构化数据

    随着大数据和AI业务的不断融合,大数据分析和处理过程中,通过深度学习技术对非结构化数据(如图片.音频.文本)进行大数据处理的业务场景越来越多.本文会介绍Spark如何与深度学习框架进行协同工作,在大数 ...

最新文章

  1. 计算机组成原理(哈工大刘宏伟)
  2. java吧 博客系统_【Java】SpringMVC + Mybatis 实现的个人博客系统
  3. MyBatis使用in进行列表中数据的批量删除
  4. js判断字符串是否在数组中
  5. main.cpp first defined here 解决
  6. 【转载好文】对char *和char []做形参的深入理解+const char*/char const*/char *const的解析
  7. ESET NOD32
  8. win10 怎么把任务栏变透明
  9. STM32通过IIC驱动MLX90614红外温度传感器
  10. 文学写作素材网站分享
  11. arduino动态刷新显示_玩家国度XG27UQ绝影游戏显示器评测:DSC加持的满血4K显示器...
  12. 如何生成smali文件
  13. C++ Reference: Standard C++ Library reference: C Library: cmath: erf
  14. Mongodb修改器
  15. iNFTnews丨模因、神话和NFT是如何建立文化认同的?
  16. ubuntu16.04编译ORBSLAM2问题解决
  17. iOS 模态视图,阻尼动画
  18. 玩转数据,和echar
  19. 滚动页面,实现导航栏固定在顶部(吸顶效果)
  20. 如何为博客增加打赏功能

热门文章

  1. 迁移桌面程序到MS Store(8)——通过APPX下载Win32Component
  2. 20164301 Exp3 免杀原理与实践
  3. 如何让Excel单元格中的名字分散对齐
  4. linux(cat,more,less,head)——对文件显示进行查看操作
  5. BigPipe 大的页面分割成一个一个管道
  6. mac下增加eclipse内存
  7. (译)如何优化cocos2d程序的内存使用和程序大小:第二部分(完)
  8. 仿新浪微博实现ListBox下拉刷新和到底部自动加载
  9. “3D几何与视觉技术”全球在线研讨会第二期
  10. YOLACT++:目前最热门的实时实例分割开源库