昇腾社区首页
中文
注册

算子开发流程

开发方式总览

TBE自定义算子提供通过MindStudio工具进行开发和基于后台命令行模式进行开发两种方式,两种开发方式的整体流程基本相同,开发方式的区别请参见表1,开发者可基于自身需求进行选择。

表1 TBE支持的自定义算子开发方式

阶段

MindStudio开发方式

命令行开发方式

算子工程创建

提供可视化工程创建界面,工程创建完成后自动生成算子工程目录及相应的文件模板。

开发者可直接基于模板进行算子开发。

有以下两种实现方式:
  • 开发者可直接基于内置自定义算子样例工程进行开发,无代码模板,开发者需要自己创建算子相关实现文件,或者基于已有样例进行修改。
  • 基于自定义算子工程生成工具进行开发,会自动生成算子工程及代码模板。

UT测试

MindStudio集成了UT(Unit Test)测试框架,支持算子功能仿真验证,当前支持算子功能实现代码的测试以及算子原型定义的测试。

暂不支持命令行场景下的UT测试。

编译部署

MindStudio提供一键式编译部署界面,无需手工配置环境变量。

  • 编译部署前,开发者需要手工配置相关环境信息。
  • 开发者需要手工将编译好的自定义算子部署到算子库。

ST测试

MindStudio集成了ST(System Test)测试框架,支持在硬件环境中验证算子功能。

开发者仅需配置生成ST测试用例的定义文件,即可自动生成测试用例,用户可以选择全部或部分测试用例的执行。

  • 开发者可通过ST测试用例生成工具生成ST用例进行测试并执行。
  • 基于Sample样例进行修改,进行算子功能的测试。

算子网络测试

推理场景下:MindStudio提供了可视化编辑界面进行网络模型的转换及应用程序的开发,工程创建时会自动生成编译脚本,开发者只关注功能代码的开发即可。通过执行包含自定义算子的模型推理功能验证算子在网络中功能是否正确。

训练场景下:MindStudio提供了模型训练工程“Ascend Training”的创建及运行能力,用户只需进行数据的准备及训练脚本的开发。

推理场景下:用户需要通过ATC工具进行模型转换,然后进行应用代码的开发。应用程序的开发有以下两种方式:
  • 用户需要手工创建工程、代码文件及编译配置文件,无代码模板。
  • 基于已有样例进行修改。

训练场景下:用户可通过手工编写只包含自定义算子的单算子网络进行测试。也可以直接对包含自定义算子的第三方网络进行网络迁移训练,用户需要手工配置环境变量并触发脚本的执行。

开发流程介绍

通过MindStudio进行自定义算子开发与命令行方式进行自定义算子开发的流程相同。

自定义算子开发主要包含如下几个场景:

  • 全新开发:昇腾AI软件栈中不包含相应的算子,需要先完成TBE自定义算子的开发,再进行第三方框架的适配。若用户开发的TBE自定义算子仅用于构造Ascend Graph或者通过AscendCL进行单算子调用,则无需进行第三方框架的适配(即算子适配插件开发)。
    算子开发的流程如下所示:
    图1 基于MindStudio全新开发算子流程
    图2 命令行方式全新开发算子流程
  • 框架适配开发:昇腾AI软件栈中已实现了相应的TBE算子,可直接进行第三方框架的适配。
    此种场景下,适配算子开发的流程如下所示:
    图3 算子框架适配开发流程

    针对PyTorch框架的适配开发,无需进行工程创建。

  • 硬件升级后适配开发:开发者已实现了某种型号昇腾AI处理器的TBE自定义算子,当硬件升级后,需要重新针对新的昇腾AI处理器进行TBE自定义算子的适配。

    此种场景下,开发者需要基于原有算子工程进行算子交付件的修改,假设CANN软件环境以及原有算子工程都已准备完毕,详细的适配流程如下所示:

    图4 算子硬件适配开发流程

    算子适配插件为将第三方框架算子映射为适配昇腾AI处理器的算子,与昇腾AI处理器型号无关,一般无需修改。

    1. 算子分析。

      不同昇腾AI处理器之间的主要差异为计算接口在昇腾AI处理器上支持的程度不同。包含:

      • 计算接口在不同的昇腾AI处理器上是否支持。
      • 若支持的话,支持的数据类型是否有差异,每个参数的含义是否有差异等。

      具体需要根据算子实现中使用的每个计算接口进行详细的分析。

    2. 进行算子交付件的适配开发。

      根据算子分析出来的不同计算接口之间的差异,进行如下操作:

      • 修改“算子原型定义”、“算子代码实现”文件,若计算接口在不同的昇腾AI处理器间无差异,则此操作跳过。
      • 新增对应昇腾AI处理器的算子信息库定义。
    3. 算子工程编译部署。
    4. 进行算子ST测试与网络测试。
表2 算子开发步骤详解

序号

步骤

描述

参考

1

环境准备

准备算子开发及运行验证所依赖的开发环境与运行环境。

算子开发准备

2

算子速查

查看当前昇腾AI处理器支持的算子列表及支持的算子的详细规格约束。

3

算子分析

算子开发前进行算子分析,明确算子的功能、输入、输出,选取算子代码实现方式,规划算子类型名称以及算子实现函数名称等。

4

工程创建

创建算子开发工程。

5

算子原型定义

算子原型定义规定了在昇腾AI处理器上可运行算子的约束,主要体现算子的数学含义,包含定义算子输入、输出、属性和取值范围,基本参数的校验和shape的推导,原型定义的信息会被注册到GE的算子原型库中。离线模型转换时,GE会调用算子原型库的校验接口进行基本参数的校验,校验通过后,会根据原型库中的推导函数推导每个节点的输出shape与dtype,进行输出tensor的静态内存的分配。

算子原型定义

6

算子代码实现

算子计算逻辑及调度的实现。

算子代码实现(DSL开发方式)

算子代码实现(TIK开发方式)

7

算子信息库定义

算子信息库文件用于将算子的相关信息注册到算子信息库中,包括算子的输入输出dtype、format以及输入shape信息。离线模型转换时,FE会根据算子信息库中的算子信息做基本校验,判断是否需要为算子插入合适的转换节点,并根据算子信息库中信息找到对应的算子实现文件进行编译,生成算子二进制文件进行执行。

算子信息库定义

8

算子UT测试

仿真场景下验证算子实现代码及算子原型定义的功能及逻辑正确性。

UT测试当前仅支持基于MindStudio进行算子开发的场景。

算子UT测试

9

算子适配

基于第三方框架(TensorFlow/Caffe)进行自定义算子开发的场景,开发人员需要进行插件的开发,将基于第三方框架的算子属性映射成适配昇腾AI处理器的算子属性。

算子适配插件开发

10

算子工程编译部署

编译自定义算子工程,生成自定义算子安装包并进行自定义算子包的安装,将自定义算子部署到算子库(OPP)。

算子工程编译部署

11

算子ST测试

系统测试(System Test),在真实的硬件环境中,验证算子的正确性。

算子ST测试

12

算子网络测试

将自定义算子加载到网络模型中进行运行验证。

算子网络测试(推理)

算子网络测试(训练,TensorFlow)

算子网络测试(训练,PyTorch)