人工智能入门-TBE基本概念

人工智能入门-TBE基本概念

  • 前言
  • TBE基础知识
  • TBE基本概念
    • NPU
    • 算子
    • TVM
  • TBE开发方式

前言

本文介绍了TBE的基本知识、概念以及两种开发场景

TBE基础知识

TBE(Tensor Boost Engine)自定义算子开发工具:

  • 一款华为自研的NPU算子开发工具
  • 在TVM(Tensor Virtual Machine)框架基础上扩展
  • 提供了一套Python API来实施开发活动

TBE基本概念

NPU

NPU(Neural-network Processing Unit),神经网络处理器。

在维基百科中,NPU这个词条被直接指向了“人工智能加速器”,释义是这样的:
“人工智能加速器(英语:AI accelerator)是一类专用于人工智能(特别是人工神经网络、机器视觉、机器学习等)硬件加速的微处理器或计算系统。典型的应用包括机器人学、物联网等数据密集型应用或传感器驱动的任务。”
本文中,NPU可以特指为昇腾910处理器。
人工智能入门-TBE基本概念_第1张图片

算子

  • 算子基本概念
    算子是一个函数空间到函数空间上的映射O:X→X;广义的讲,对任何函数进行某一项操作都可以认为是一个算子。于我们而言,我们所开发的算子是网络模型中涉及到的计算函数。在Caffe中,算子对应层中的计算逻辑,例如:卷积层(Convolution Layer)中的卷积算法,是一个算子;全连接层(Fully-connected Layer, FC layer)中的权值求和过程,是一个算子。
  • 算子举例:
    在网络模型中被用作激活函数的算子:tanh ReLU Sigmoid等
    人工智能入门-TBE基本概念_第2张图片人工智能入门-TBE基本概念_第3张图片人工智能入门-TBE基本概念_第4张图片
  • 算子类型(Type):
    算子的type,代表算子的类型,例如卷积算子的类型为Convolution,在一个网络中同一类型的算子可能存在多个。
  • 算子名称(Name):
    算子的名称,用于标识网络中的某个算子,同一网络中算子的名称需要保持唯一。如下图所示conv1,pool1,conv2都是此网络中的算子名称,其中conv1与conv2算子的类型为Convolution,表示分别做一次卷积运算。
    Convolution
  • 张量(Tensor):
    Tensor是TBE算子中的数据,包括输入数据与输出数据,TensorDesc(Tensor描述符)是对输入数据与输出数据的描述,TensorDesc数据结构包含如下属性:
    人工智能入门-TBE基本概念_第5张图片
    • 形状(Shape):
      张量的形状,以(D0, D1, … ,Dn-1)的形式表示,D0到Dn是任意的正整数。
      如形状(3,4)表示第一维有3个元素,第二维有4个元素,(3,4)表示一个3行4列的矩阵数组。
      在形状的中括号中有多少个数字,就代表这个张量是多少维的张量。形状的第一个元素要看张量最外层的中括号中有几个元素,形状的第二个元素要看张量中从左边开始数第二个中括号中有几个元素,依此类推。例如:
      人工智能入门-TBE基本概念_第6张图片
    • 张量形状的物理含义:
      假设我们有这样一个shape=(4, 20, 20, 3)。
      假设有一些照片,每个像素点都由红/绿/蓝3色组成,即shape里面3的含义,照片的宽和高都是20,也就是20*20=400个像素,总共有4张的照片,这就是shape=(4, 20, 20, 3)的物理含义。
      人工智能入门-TBE基本概念_第7张图片
    • 数据排布格式(Format):
      在深度学习框架中,多维数据通过多维数组存储,比如卷积神经网络的特征图用四维数组保存,四个维度分别为批量大小(Batch,N)、特征图高度(Height,H)、特征图宽度(Width,W)以及特征图通道(Channels,C)。
      由于数据只能线性存储,因为这四个维度有对应的顺序。不同深度学习框架会按照不同的顺序存储特征图数据,比如Caffe,排列顺序为[Batch, Channels, Height, Width],即NCHW。Tensorflow中,排列顺序为[Batch, Height, Width, Channels],即NHWC。
      如下图所示,以一张格式为RGB的图片为例,NCHW实际存储的是“RRRGGGBBB”,同一通道的所有像素值顺序存储在一起,而NHWC实际存储的则是“RGBRGBRGB”,多个通道的同一位置的像素值顺序存储在一起。
      人工智能入门-TBE基本概念_第8张图片
    • 张量数据排布格式:
      昇腾AI软件栈中,为了提高数据访问效率,所有张量数据统一采用NC1HWC0的五维数据格式。其中C0与微架构强相关,等于AI Core中矩阵计算单元的大小,对于FP16类型为16,对于INT8类型则为32,这部分数据需要连续存储;C1是将C维度按照C0进行拆分后的数目,即C1=C/C0。如果结果不整除,最后一份数据需要补零以对齐C0。
      整个NHWC -> NC1HWC0的转换过程为:
      a. 将NHWC数据在C维度进行分割,变成C1份NHWC0。
      b. 将C1份NHWC0在内存中连续排列,由此变成NC1HWC0。
      NHWC->NC1HWC0的转换场景示例:
      a. 首层RGB图像通过AIPP转换为NC1HWC0格式。
      b. 中间层Feature Map每层输出为NC1HWC0格式,在搬运过程中需要重排。
      人工智能入门-TBE基本概念_第9张图片
  • 算子属性
    不同的算子包含的属性值不同,下面介绍几个常见的算子属性:
    • 轴(Axis):
      axis代表张量中维度的下标,比如张量a是一个5行6列的二维数组,即shape是(5,6),则axis=0表示是张量中的第一维,即行。axis=1表示是张量中的第二维,即列。
      例如张量数据[[[1,2],[3,4]], [[5,6],[7,8]]],Shape为(2,2,2),则轴0代表第一个维度的数据即[[1,2],[3,4]]与[[5,6],[7,8]]这两个矩阵,轴1代表第二个维度的数据即[1,2]、[3,4]、[5,6]、[7,8]这四个数组,轴2代表第三个维度的数据即1,2,3,4,5,6,7,8这八个数。
      轴axis可以为负数,此时表示是倒数第axis个维度。
      N维Tensor的轴有:0 , 1, 2,……,N-1。
      轴
    • 权重(Weight):
      当输入数据进入计算单元时,会乘以一个权重。例如,如果一个算子有两个输入,则每个输入会分配一个关联权重,一般将认为较重要数据赋予较高的权重,不重要的数据赋予较小的权重,为零的权重则表示特定的特征是无需关注的。
      如下图所示,假设输入数据为X1,与其相关联的权重为W1,那么在通过计算单元后,数据变为了X1*W1。
      人工智能入门-TBE基本概念_第10张图片
    • 偏差(Bias):
      偏差是除了权重之外,另一个被应用于输入数据的线性分量。它被加到权重与输入数据相乘的结果中,用于改变权重与输入相乘所得结果的范围。
      如图所示,假设输入数据为X1,与其相关联的权重为W1,偏差为B1,那么在通过计算单元后,数据变为了X1*W1+B1。
      人工智能入门-TBE基本概念_第11张图片
  • 升维—广播机制(Broadcast):
    TBE支持的广播规则:可以将一个数组的每一个维度扩展为一个固定的shape,需要被扩展的数组的每个维度的大小或者与目标shape相等,或者为1,广播会在元素个数为1的维度上进行。
    例如:原数组a的维度为(2, 1, 64),目标shape为(2, 128, 64),则通过广播可以将a的维度扩展为目标shape(2, 128, 64)。
    TBE的计算接口加、减、乘、除等不支持自动广播,要求输入的两个Tensor的shape相同,所以操作前,我们需要先计算出目标shape,然后将每个输入Tensor广播到目标shape再进行计算。
    例如,Tensor A的shape为(4, 3, 1, 5),Tensor B的shape为(1, 1, 2, 1),执行Tensor A + Tensor B ,具体计算过程如下:
  1. 计算出目标shape。
    在这里插入图片描述
    取Tensor A与Tensor B中每个维度的大值,作为目标Shape,C(4, 3, 2, 5)。
  2. 调用广播接口分别将Tensor A与Tensor B扩展到目标Shape C。
  3. 调用计算接口,进行Tensor A + Tensor B。
    如果需要广播的tensor的shape不满足每一个维度的大小与目标shape相等或者为1的要求,则无法进行广播,如下示例所示:
    在这里插入图片描述
  • 降维(Reduction):
    前面我们介绍升维-广播机制,有升就有降,Reduction是将多维数组的指定轴做降维操作。
    • Reduction算子的关键属性:
      • ReductionOp:常见支持的操作类型,包含四种类型:
        人工智能入门-TBE基本概念_第12张图片
      • Axis:Reduction需要指定若干个轴,会对这些轴进行reduce操作,取值范围为:[-N,N-1]。
      • keepdim: 对指定轴降维后,该轴是被消除还是保留为1,即此维度是否保留。取值为0表示消除,1表示保留。
        比如,输入的张量的形状为(5,6,7,8)。
        • 如果指定的轴是3,keepdim是0,则输出tensor的形状为(5,6,7)。
        • 如果指定的轴是2,keepdim是1,则输出tensor的形状为(5,6,1,8)。
        • 如果指定的轴是{1,2},keepdim是0,则输出tensor的形状为(5,8)。
        • 如果指定的轴是{0,1,2},keepdim是1,则输出tensor的形状为(1,1,1,8)。
    • 下面通过示例了解降维操作。
      如果对轴Axis=0 进行降维, 对2维矩阵来说就是行,也就是对这个2维矩阵每行对应的数据进行相加,得到[2,2,2],降为1维,如图所示:
      在这里插入图片描述
      如果Axis=1,就是每列对应的数据进行相加。
      在这里插入图片描述
      如果Axis=[0,1],可以理解为先对轴0进行降维求和得到[2,2,2], 再对[2,2,2]继续降维求和得到6,最后得到是0维;
      如果Axis=[],就是不降维,原样输出。
      如果Axis为空,就是对所有维度进行降维,最后得到0维的标量。
  • 转换算子:
    转换算子是一种特殊的算子,用于转换Tensor的Data Type与Format等信息,使得图中上下游节点能够被正常处理。
    图经过一系列处理后,如下沉、优化、融合等,节点中的Tensor信息可能发生了变化,所以需要插入转换算子使图能够继续被正常处理。

TVM

随着深度学习的广泛应用,大量的深度学习框架及深度学习硬件平台应运而生,但不同平台的神经网络模型难以在其他硬件平台便捷的运行,无法充分利用新平台的运算性能。TVM(Tensor Virtual Machine)的诞生解决了以上问题,它是一个开源深度学习编译栈,它通过统一的中间表达(Intermediate Representation)堆栈连接深度学习模型和后端硬件平台,通过统一的结构优化Schedule,可以支持CPU、GPU和特定的加速器平台和语言。TVM堆栈始于华盛顿大学Paul G. Allen计算机科学与工程学院SAMPL小组的研究项目。该项目现在由一个涉及多个行业和学术机构的开源社区推动,遵循Apache协议。
TVM的架构详细介绍请参考 https://tvm.ai/
人工智能入门-TBE基本概念_第13张图片

  • DSL
    DSL语言本身是指一类语言,意为领域特定语言。TBE算子中使用到的DSL语言即为D芯片算子开发专门设计的描述语言。
    为了方便开发者进行自定义算子开发,TBE(Tensor Boost Engine)提供了一套计算接口供开发者用于组装算子的计算逻辑,使得70%以上的算子可以基于这些接口进行开发,极大的降低自定义算子的开发难度。TBE提供的这套计算接口,称之为DSL(Domain-Specific Language)。基于DSL开发的算子,可以直接使用TBE提供的Auto Schedule机制,自动完成调度过程,省去最复杂的调度编写过程。
  • HalideIR:Halide的中间表示
    “Halide的特点是其图像算法的计算的实现(Function和Expression)和这些计算在计算硬件单元上的调度(Schedule)是分离的,其调度以Function为单位。最终将整个图像算法转换为高效率的多层for循环,for循环的分部数据范围划分和数据加载都是由Halide来完成的,而且可以实现数据的加载和算法计算的Overlay,掩盖数据加载导致的延迟。Halide的Schedule可以由程序员来指定一些策略,指定硬件的buffer大小,缓冲线的相关设置,这样可以根据不同的计算硬件的特性来实现高效率的计算单元的调度,而图像算法的计算实现却不需要修改。”
    • 打印方法:
      print(tvm.lower(sch, [TensorA, TensorB, TensorC], simple_mode=True))
    • 示例如下:
    produce TensorB {
      for (i0, 0, 1024) {
        for (i1, 0, 1024) {
          TensorB[((i0*1024) + i1)] = (TensorA[((i0*1024) + i1)] + 1.000000h)
        }
      }
    }
    produce TensorC {
      for (i0, 0, 1024) {
        for (i1, 0, 1024) {
          TensorC[((i0*1024) + i1)] = (TensorB[((i0*1024) + i1)] * 2.000000h)
        }
      }
    }
    

TBE开发方式

TBE算子开发方式
人工智能入门-TBE基本概念_第14张图片
TBE DSL:算子开发者基于TBE提供DSL接口来描述计算过程和自动最优调度操作。
当前TBE涉及的DSL接口主要如下:
人工智能入门-TBE基本概念_第15张图片
TIK:
当前TIK涉及的DSL接口主要如下:
人工智能入门-TBE基本概念_第16张图片

你可能感兴趣的:(TBE,huawei,人工智能,人工智能,python,机器学习,深度学习,算法)