下文将以Matmul+LeakyRelu融合算子的实现为例,介绍Mix融合算子的设计和实现流程。该样例仅支持在Atlas A2训练系列产品上运行。
算子的设计过程分为算子分析、数据流分析、Tiling策略设计三部分。
算子分析是指明确算子的数学表达式、输入、输出,核函数的名称等信息。
c = LeakyRelu(a * b + bias, alpha);
算子类型(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计算。根据上述数据流并结合融合算子的编程范式,规划并行的流水任务。如下图所示:
Leaky ReLU(带泄露线性整流函数)激活函数,是人工神经网络中一种常用的激活函数,其数学表达式和函数图像如下所示:
前三步的内容都封装在Matmul高阶API内,本样例中可以简化为3个stage。如下图所示:
根据上述分析,明确实现过程中会使用到Matmul高阶API接口,LeakyRelu Vector计算接口、DataCopy接口、EnQue、DeQue接口。
Tiling策略的设计主要包括多核切分和核内切分策略。
切分策略示意图如下,更多切分策略相关原理请参考数据分块(Tiling)。