本帖最后由 Killoser 于 2022-7-8 15:14 编辑

本文分享自华为云社区《【CANN 文档速递 05 期】一文让您了解什么是算子》,作者: 昇腾 CANN 。
  
什么是算子

深度学习算法由一个个计算单元组成,我们称这些计算单元为算子(Operator,简称 OP)。在网络模型中,算子对应层中的计算逻辑,例如:卷积层(Convolution Layer)是一个算子;全连接层(Fully-connected Layer, FC layer)中的权值求和过程,是一个算子。
再例如:tanh、ReLU 等,为在网络模型中被用做激活函数的算子。
v2-0dc6117163fafa1a5ea4a232580eb6ff_720w.jpg
  
算子的名称(Name)与类型(Type)

  • 算子的名称:标识网络中的某个算子,同一网络中算子的名称需要保持唯一。
  • 算子的类型:网络中每个算子根据算子类型进行实现逻辑的匹配,在一个网络中同一类型的算子可能存在多个。
如下图所示,Conv1、Pool1、Conv2 都是此网络中的算子名称,其中 Conv1 与 Conv2 算子的类型都为 Convolution,表示分别做一次卷积计算。
v2-bffc0eb751a3fff1d2251cf408b183ee_720w.jpg
  
张量(Tensor)

  • 张量是算子计算数据的容器,包括输入数据与输出数据。
  • 张量描述符(TensorDesc)是对输入数据与输出数据的描述,主要包含如下属性:
v2-897c50da84c9dafe8c58e2e4571428fc_720w.jpg
下面我们详细介绍下张量描述符中的形状和数据排布格式。

  形状(Shape)
张量的形状,比如形状 (3,4) 表示第一维有 3 个元素,第二维有 4 个元素,是一个 3 行 4 列的矩阵数组。在形状中有多少个数字,就代表这个张量有多少维。形状的第一个元素要看张量最外层的中括号中有几个元素,形状的第二个元素要看张量中从左边开始数第二个中括号中有几个元素,依此类推。例如:
v2-5c41efa3a4b87f1eda0b1a0ace8d3785_720w.jpg
下面我们看一下形状的物理含义,假设 shape=(4, 20, 20, 3)。
假设有 4 张照片,即 shape 里 4 的含义,每张照片的宽和高都是 20,也就是 20*20=400 个像素,每个像素点都由红 / 绿 / 蓝 3 色组成,即 shape 里面 3 的含义,这就是 shape=(4, 20, 20, 3) 的物理含义。
v2-bdabbcffa8e387a884cc4f2f4a40ff94_720w.jpg
  
数据排布格式
在深度学习领域,多维数据通过多维数组存储,比如卷积神经网络的特征图(Feature Map)通常用四维数组保存,即 4D 格式:

  • N:Batch 数量,例如图像的数目。
  • H:Height,特征图高度,即垂直高度方向的像素个数。
  • W:Width,特征图宽度,即水平宽度方向的像素个数。
  • C:Channels,特征图通道,例如彩色 RGB 图像的 Channels 为 3。
由于数据只能线性存储,因此这四个维度有对应的顺序。不同深度学习框架会按照不同的顺序存储特征图数据,比如 Caffe,排列顺序为 [Batch, Channels, Height, Width],即 NCHW。TensorFlow 中,排列顺序为 [Batch, Height, Width, Channels],即 NHWC。
以一张格式为 RGB 的图片为例,NCHW 中,C 排列在外层,实际存储的是 “RRRRRRGGGGGGBBBBBB”,即同一通道的所有像素值顺序存储在一起;而 NHWC 中 C 排列在最内层,实际存储的则是 “RGBRGBRGBRGBRGBRGB”,即不同通道的同一位置的像素值顺序存储在一起。
v2-52377267dcd2b0d6166fe10cd369715f_720w.jpg
尽管存储的数据相同,但不同的存储顺序会导致数据的访问特性不一致,因此即便进行同样的运算,相应的计算性能也会不同。
在昇腾 AI 处理器中,为了提高数据的访问效率,张量数据采用 NC1HWC0 的五维格式。其中 C0 与微架构强相关,等于 AI Core 中矩阵计算单元的大小,这部分数据需要连续存储;C1 是将 C 维度按照 C0 进行拆分后的数目,即 C1=C/C0。如果不整除,最后一份数据需要补齐以对齐 C0。