CANN-AICPU算子开发

1.算子

算子是一个函数空间到函数空间上的映射O:X->X;广义的讲,对任何函数进行某一项操作都可以认为是一个算子。在Caffe中,算子对应层中的计算逻辑,例如:卷积层中的卷积算法,是一个算子;全连接层中的权值求和过程,是一个算子。
算子举例:在网络模型中被用作激活函数的算子:tanh、ReLU、Sigmoid等

1.1张量(Tensor)

Tensor是算子中的数据,包括输入数据与输出数据,TensorDesc是对输入输出数据与输出数据的描述,TensorDesc数据结构包含如下属性:

属性 定义
名称(name) 用于定义Tensor进行索引,不同Tensor的name需要保持唯一
形状(shape) Tensor的形状,比如(10,)或者(1024,1024)或者(2,3,4)等
数据类型(dtype) 功能描述:指定Tensor对象的数据类型
数据排布格式(format) 多个维度的排布顺序

1.2张量的形状(Shape)

张量的形状,以(D0,D1,…Dn-1)的形式表示,D0到Dn是任意的正整数

张量 形状
1 (0,)
[1,2,3] (3,)
[[1,2],[3,4]] (2,2)
[[[1,2],[3,4]],[[5,6],[7,8]]] (2,2,2)

1.3张量的物理含义

假设有一个shape=(4,20,20,3)。该shape表示有4张图片,宽高都是20,即20*20=400个像素,每个像素点由RGB三原色组成

1.4数据排布格式(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",多个通道的同一位置的像素值顺序存储在一起
    CANN-AICPU算子开发_第1张图片

2.CANN算子

Ascend 310处理器逻辑架构(AI Inference SoC)

AI Core
昇腾AI芯片的计算核心,负责执行矩阵、向量、标量计算密集的算子任务,采用达芬奇架构。Ascend 310集成了2个AI Core
ARM CPU核心
集成了8个ARM A55。其中一部分部署为AI CPU,负责执行不适合跑在AI Core上的算子(承担非矩阵类复杂计算);一部分部署为专用于控制芯片整体运行的控制CPU。两类任务占用的CPU核数可由软件根据系统实际运行情况动态分配。此外,还部署了一个专用CPU作为任务调度器(Task Scheduler,TS),以实现计算任务在AI Core上的高效分配和调度;该CPU专门服务于AI Core和AI CPU,不承担任何其他工作CANN-AICPU算子开发_第2张图片
CANN算子
NPU算子:通过TBE编译器编译后,可以运行在Device NPU中的AI Core上算子
CPU算子:通过GCC编译器编译后,可以运行在Host CPU和Device NPU中的AICPU上的算子
CANN-AICPU算子开发_第3张图片

2.1.AI CPU

AI CPU算子,是指运行在昇腾AI处理器AI CPU计算单元上的表达一个完整计算逻辑的运算,需要开发者自定义AI CPU算子的情况主要有以下两种:

  • 在NN模型训练或者推理过程中,将第三方开源框架转化为适配昇腾AI处理器的模型时遇到了昇腾AI处理器不支持的算子。此时,为了快速打通模型执行流程,用户可以通过自定义AI CPU算子进行功能调测,提升调测效率。功能调通后,后续性能调测过程中再将AI CPU自定义算子转换成TBE自定义算子的实现。
  • 某些场景下,无法通过AI Core实现自定义算子(比如部分算子需要Int64类型,但AI Core指令不支持),且该算子不是网络的性能瓶颈,此时可以通过开发AI CPU自定义算子实现昇腾AI处理器对此算子的支持。

2.2.AI CPU算子执行流程

流程说明:

  • 1 第三方框架介入,caffe/tensorflow等等,经过Parse解析后转换为中间态的IR Graph
  • 2 GE接收到IR Graph后对图进行优化以及拆分
  • 3 拆分过程中,优先由FE基于TBE算子信息库判断算子支持度,若不支持则由AICPU Engine基于AI CPU算子信息库判断是否支持
  • 4 GE拆分后的图进行合并为可执行的整图
  • 5 在图执行阶段,根据任务类型将AICPU的任务下发AICPU进行算子执行

关键概念:

  • 算子Parser:将第三方框架的算子转换为内部算子IR,Caffe框架针对Layer进行处理,TensorFlow针对Operator进行处理
  • 算子IR:算子对外API,定义算子的输入、输出、属性,还有算子的形状推导逻辑
  • 算子信息库:描叙算子的支持度
  • 算子实现库:算子的运算逻辑
    CANN-AICPU算子开发_第4张图片

3.AI CPU算子开发流程

CANN-AICPU算子开发_第5张图片
AI CPU算子开发流程-算子分析
使用AI CPU方式开发算子前,先确定算子功能、输入、输出、算子开发方式、算子类型以及算子实现函数名称等
1.明确算子的功能,若涉及到数学表达式,需要分析数学表达式
例如:

z = x < y ? true : false

2.明确输入和输出

REG_OP(Less)
.INPUT(X1,TensorType({DT_FLOAT,DT_FLOAT16,DT_DOUBLE,DT_UINT8,DT_INT8,DT_UINT16,DT_INT16,DT_INT32,DT_INT64}))
.INPUT(X2,TensorType({DT_FLOAT,DT_FLOAT16,DT_DOUBLE,DT_UINT8,DT_INT8,DT_UINT16,DT_INT16,DT_INT32,DT_INT64}))
.OUTPUT(y,TensorType({DT_BOOL}))
.OP_END_FACTORY_REG(Less)

3.明确算子实现文件名称以及算子的类型(OpType)

算子类型 算子名称、形状 data type 数据排布格式
算子输入 name:x1;shape:all float16、float32、double、int8、int16、int32、int64、uint8、uint16、uint32、uint64 NCHW、NHWC、ND
算子输入 name:x2;shape:all float16、float32、double、int8、int16、int32、int64、uint8、uint16、uint32、uint64 NCHW、NHWC、ND
算子输出 name:y;shape:all bool NCHW、NHWC、ND
算子实现文件名称 less

你可能感兴趣的:(昇腾AI,人工智能,深度学习,tensorflow,caffe)