融合算子设计

下文将以Matmul+LeakyRelu融合算子的实现为例,介绍Mix融合算子的设计和实现流程。该样例仅支持在Atlas A2训练系列产品上运行。

算子的设计过程分为算子分析、数据流分析、Tiling策略设计三部分。

算子分析

算子分析是指明确算子的数学表达式、输入、输出,核函数的名称等信息。

  1. 明确算子的数学表达式及计算逻辑。该算子的计算逻辑为,先进行一个矩阵乘操作,然后将矩阵乘的结果与一个alpha参数进行LeakyRelu操作。数学表达式如下:

    c = LeakyRelu(a * b + bias, alpha);

  2. 明确输入和输出。

    • MatMul+Leakyrelu算子输入为a、b、bias、alpha,输出为c。
    • 本样例中算子输入a、b支持的数据类型为half(float16),算子输入bias、alpha支持的数据类型为float32,算子输出c的数据类型为float32。
    • 输入矩阵a的形状为[M,K],输入矩阵b的形状为[K, N],输出矩阵c的形状为[M,N],输入bias的形状为[1, N]。
    • 算子输入输出支持的数据格式为:ND。

  3. 确定核函数名称和参数。

    • 您可以自定义核函数名称,本样例中核函数命名为matmul_leakyrelu_custom。
    • 根据对算子输入输出的分析,确定核函数的参数a,b,bias,alpha,c;a,b, bias,alpha为输入在Global Memory上的内存地址,c为输出在Global Memory上的内存地址。

表1 Ascend C MatMul+Leakyrelu算子设计规格

算子类型(OpType)

MATMUL_LEAKYRELU

算子输入

name

shape

data type

format

a

[M, K]

half

ND

b

[K, N]

half

ND

bias

[1, N]

float32

-

alpha

-

float32

-

算子输出

c

[M, N]

float32

ND

核函数名称

matmul_leakyrelu_custom

数据流分析

进行算子的数据流分析:数据流向为在Cube核上完成Matmul计算后将数据搬运至Vector核进行LeakyRelu计算根据上述数据流并结合融合算子的编程范式,规划并行的流水任务。如下图所示:

  1. 将输入数据从Global Memory搬运到Cube核。
  2. 进行MatMul内部的计算,计算公式和计算示意图如下:

    注:bias的shape为[1, N], 对A*B结果矩阵的每一行都采用该bias进行偏置。
    图1 Matmul矩阵乘示意图

  3. 将MatMul的计算结果搬运到Vector核。
  4. 进行Vector矢量计算,该样例中进行LeakyReLU计算。

    Leaky ReLU(带泄露线性整流函数)激活函数是人工神经网络中一种常用的激活函数,其数学表达式和函数图像如下所示

  5. 将输出结果搬运到Global Memory。

前三步的内容都封装在Matmul高阶API内,本样例中可以简化为3个stage。如下图所示:

根据上述分析,明确实现过程中会使用到Matmul高阶API接口LeakyRelu Vector计算接口DataCopy接口EnQueDeQue接口。

Tiling策略设计

Tiling策略的设计主要包括多核切分和核内切分策略。

切分策略示意图如下,更多切分策略相关原理请参考数据分块(Tiling)