算子分析

进行算子开发前,开发者应首先进行算子分析,算子分析包含:明确算子的功能及数学表达式,选择算子开发方式(DSL方式或者TIK方式),最后细化并明确算子规格,分析流程如下所示:

图1 算子分析流程
  1. 分析算子算法的原理,提取出算子的数学表达式。

    例如Atanh算子,反双曲正切函数atanh是双曲正切函数tanh的反函数,等价于tanh-1x,数学表达式如下:

    定义区间为(-1, 1),值域范围为(-∞, +∞),关于原点对称,为奇函数。

  2. 明确算子开发方式及使用的计算接口,详细接口请参见TBE DSL APITBE TIK API

    1. 基于算子的数学表达式,提取出需要使用的基本运算。

      根据Atanh算子的数学表达式,可看出用到的基本运算有:

      +,-,*,/,ln()

    2. 分析TBE DSL提供的接口是否可满足计算逻辑描述的要求,若能够满足,则优先选用DSL方式进行开发。

      DSL开发方式的主要特点是CANN预先在TVM的机制上面封装了若干运算接口,并配备了常用的运算模板,开发过程中只需要关注算子的运算逻辑,不需要关注底层昇腾AI处理器的数据适配和指令的运算流程。DSL开发的方式最方便快捷,可以满足Pow、Sqrt、ReduceSum等这些基本数学运算的实现。当前DSL提供了加减乘除、对数、指数等的计算接口,开发者可以基于这些接口组合出需要的逻辑。

      例如,Atanh算子用到的基本运算有+,-,*,/,ln(),分析TBE DSL提供的API是否可满足这些运算要求:

      • +:可通过tbe.dsl.vadd接口实现。
      • -:可通过tbe.dsl.vmul接口实现参数乘以-1,从而得到负数,然后与被减数相加。
      • *:可通过tbe.dsl.vmul接口实现tensor乘以标量0.5。
      • /:可通过tbe.dsl.vdiv接口实现两个tesnor相除。
      • ln():可通过tbe.dsl.vlog接口实现对数运算。

      通过如上分析,可看出TBE DSL接口满足Atanh算子的实现要求,所以可优先选择TBE DSL方式进行Atanh算子的实现。

    3. 若DSL接口无法满足计算逻辑描述或者实现后性能无法满足开发者要求,则选择TIK方式进行开发。

      基于TIK的自定义算子开发,提供了对Buffer的管理和数据自动同步机制,但需要开发者手动计算数据的分片和索引,需要开发者对AI Core架构非常了解,入门难度更高。理论上所有的算子都是可以使用TIK的开发方式,当DSL不能满足开发诉求的时候,可以选择TIK开发方式。

  3. 明确详细算子规格。

    2明确使用的算子实现方式及算子实现接口后,需要进一步明确算子输入输出支持的数据类型,形态以及数据排布格式,明确算子实现文件名称、算子实现函数名称以及算子的类型(OpType)。

    以上作为算子开发设计规格。