算子开发
什么是算子?
深度学习算法由一个个计算单元组成,可以称这些计算单元为算子(Operator,简称OP)。
在网络模型中,算子对应层中的计算逻辑,例如:卷积层(Convolution Layer)是一个算子;全连接层(Fully-connected Layer, FC layer)中的权值求和过程,是一个算子。
在数学领域,一个函数空间到函数空间上的映射O:X→Y,都称为算子;再例如:tanh、ReLU等,为在网络模型中被用做激活函数的算子。
广义的讲,对任何函数进行某一项操作都可以认为是一个算子,比如微分算子,不定积分算子等。
什么是Ascend C算子?
Ascend C算子是一种高性能计算加速器芯片Ascend的计算操作符。它是一种基于硬件的计算加速器,可以在Ascend芯片上实现高效的计算加速,提高计算效率和性能。
Ascend C算子库包含了多种常用的算子,如卷积、池化、全连接、归一化等,同时还支持自定义算子的开发。它采用了高度优化的算法和数据结构,可以充分利用Ascend芯片的硬件资源,实现高效的计算加速。
Ascend C算子库还提供了丰富的API接口和开发工具,方便开发者进行算子的调用和开发。
如何基于CANN进行算子开发?
CANN支持用户使用多种方式来开发自定义算子,包括TBE DSL、TBE TIK、AICPU三种开发方式。
- 基于TBE开发框架的算子开发:TBE(Tensor Boost Engine:张量加速引擎)是CANN提供的算子开发框架,可以基于此框架使用Python语言开发自定义算子。
通过TBE进行算子开发有TBE DSL和TBE TIK两种方式,TBE负责执行昇腾AI处理器中运行在AI Core上的算子。
- AI CPU算子开发:AI CPU算子的开发接口即为原生C++接口,具备C++程序开发能力就能够较容易的开发出AI CPU算子,且AI CPU开发方式无需感知硬件内部逻辑,可以较快入门。
- Ascend C算子开发:Ascend C是CANN针对算子开发场景推出的编程语言,原生支持C和C++标准规范,最大化匹配用户开发习惯;通过多层接口抽象、自动并行计算、孪生调试等关键技术,极大提高算子开发效率,助力AI开发者低成本完成算子开发和模型调优部署。
如何获取自定义算子安装包?
算子开发过程完成后,可以编译自定义算子工程,生成自定义算子安装包*.run(编译生成算子包的操作系统版本与架构需要与执行算子包部署操作的操作系统版本与架构相同)。
- 推理场景下,进行模型推理前使用ATC模型转换工具将原始网络模型转换为适配昇腾AI处理器的离线模型,此过程中需要对网络中的算子进行编译。
- 训练场景下,运行训练脚本时,CANN内部实现逻辑会先将开源框架网络模型下发给Graph Engine进行图编译,此过程中需要对网络中的算子进行编译。
- 进入算子工程目录修改build.sh脚本,配置算子编译所需环境变量。
- 执行如下命令,进行算子工程编译。
./build.sh
- 编译成功后,会在当前目录下创建build_out目录,并在build_out目录下生成自定义算子安装包custom_opp_<target os>_<target architecture>.run。
如何部署自定义算子包?
进入算子工程路径下的build_out目录,以运行用户执行如下命令,安装自定义算子包。
./custom_opp_<target os>_<target architecture>.run
命令执行成功后,自定义算子包中的相关文件部署到CANN算子库中。
- 推理场景下,自定义算子直接部署到开发环境的CANN算子库。
- 训练场景下,自定义算子安装包需要部署到运行环境的CANN算子库中。
如何获取算子开发样例工程?
单击Gitee或Github,进入Ascend samples开源仓,参见README中的“版本说明”下载配套版本的sample包,从“cplusplus/level1_single_api/4_op_dev/1_custom_op”目录中获取样例。
此样例包含了TBE算子、AI CPU算子以及TensorFlow Scope融合规则开发的代码样例,同时提供了算子编译规则文件。可以直接基于此样例编译出算子安装包,也可以基于此样例追加自己的自定义算子实现代码,进行算子的开发。
更多样例可在CANN软件安装后文件存储路径中的“tools/msopgen/template/custom_operator_sample”目录下获取。
CANN当前支持哪些算子类型?
CANN算子有两种类型,TBE算子与AI CPU算子。
- AI Core是昇腾AI处理器的计算核心,负责执行矩阵、向量、标量计算密集的算子任务,在AI Core上执行的算子称为TBE(Tensor Boost Engine)算子。
- AI CPU负责执行不适合跑在AI Core上的算子,是AI Core算子的补充,主要承担非矩阵类、逻辑比较复杂的分支密集型计算,在AI CPU上执行的算子称为AI CPU算子。