一、MindSpore AI算子介绍
1.1 MindSpore框架介绍
MindSpore是华为公司推出的新一代深度学习框架,是源于全产业的最佳实践,最佳匹配昇腾处理器算力,支持终端、边缘、云全场景灵活部署,开创全新的AI编程范式,降低AI开发门槛。为了助力开发者与产业更加从容地应对这一系统级挑战,新一代AI框架MindSpore具有编程简单、端云协同、调试轻松、性能卓越、开源开放等特点,降低了AI开发门槛。
1.2 AICPU算子基本介绍
AICPU算子,是运行在昇腾AI处理器中AICPU计算单元上的表达一个完整计算逻辑的运算,如下情况下,开发者需要自定义AICPU算子。
- 在NN模型训练或者推理过程中,将第三方开源框架转化为适配昇腾AI处理器的模型时遇到了昇腾AI处理器不支持的算子。此时,为了快速打通模型执行流程,用户可以通过自定义AICPU算子进行功能调测,提升调测效率。功能调通之后,后续性能调测过程中再将AICPU自定义算子转换成TBE算子实现。
- 某些场景下,无法通过AI Core实现自定义算子(比如部分算子需要int64类型,但AI Core指令不支持),且该算子不是网络的性能瓶颈,此时可以通过开发AICPU自定义算子实现昇腾AI处理器对此算子的支持。
一个完整的AICPU算子包含四部分:算子原型定义、对应开源框架的算子适配插件、算子信息库定义和算子实现。
1.3 msopgen工具介绍
CANN开发套件包中提供了自定义算子工程生成工具msopgen,可基于算子原型定义输出算子开发相关交付件,包括算子代码实现文件、算子适配插件、算子原型定义、算子信息库定义以及工程编译配置文件。
1.4 msopst工具介绍
CANN开发套件包中提供了ST测试工具:msopst,支持生成算子的ST测试用例并在硬件环境中执行。具有如下功能:
- 根据算子信息库定义文件(.ini)生成算子测试用例定义文件(*.json),作为算子ST测试用例的输入。
- 根据算子测试用例定义文件生成ST测试数据及测试用例执行代码,在硬件环境上执行算子测试用例。
- 自动生成运行报表(st_report.json)功能,报表记录了测试用例信息及各阶段运行情况。
- 根据用户定义并配置的算子期望数据生成函数,回显期望算子输出和实际算子输出的对比测试结果。
二、环境配置
进行基于mindspore框架的AICPU算子开发前需要配置好远端环境。远端环境为linux服务器,linux系统版本Ubuntu 18.04.6。
2.1 Python相关依赖
依赖 | 版本 |
Python | 3.7.5 |
mindspore | 1.8.0 |
coverage | 6.4.4 |
absl-py | 1.0.0 |
xlrd | 1.2.0 |
2.2 CANN安装
配置好Ascend-cann-toolkit开发套件包(的“安装开发环境”章节)。
2.3 mindspore配置
Linux服务器上需安装部署好对应固件与驱动,并配置好mindspore 1.8.0。
安装mindpspore工具包。用户可参考Mindspore官网中的《MindSpore1.8.0安装指南》进行安装。
验证mindspore是否安装成功。在xshell上运行python -c "import mindspore;mindspore.run_check()",如果输出:
说明MindSpore安装成功。
2.4 AICPU算子开发流程
- 算子分析:明确算子的功能、输入、输出,规划算子类型名称以及算子编译生成的库文件名称等。
- 工程创建:通过msopgen工具创建AICPU算子工程,创建完成后,会自动生成算子工程目录及相应的文件模板,开发者可以基于这些模板进行算子开发。
- 算子实现:实现算子的计算逻辑。
- 算子原型定义:子原型定义规定了在昇腾AI处理器上可运行算子的约束,主要体现算子的数学含义,包含定义算子输入、输出、属性和取值范围,基本参数的校验和shape的推导,原型定义的信息会被注册到GE的算子原型库中。离线模型转换时,GE会调用算子原型库的校验接口进行基本参数的校验,校验通过后,会根据原型库中的推导函数推导每个节点的输出shape与dtype,进行输出tensor的静态内存的分配。
- 算子信息定义:算子信息配置文件用于将算子的相关信息注册到算子信息库中,包括算子的OpType、输入输出dtype、name等信息。网络运行时,AICPU Engine会根据算子信息库中的算子信息做基本校验,并进行算子匹配。
- 算子编译:将算子适配插件实现文件、原型定义文件、算子原型库、算子信息库。
- 算子ST测试:即系统测试(System Test),可以自动生成测试用例,在真实的硬件环境中,验证算子功 能的正确性。
三、MindSpore AICPU算子开发
AICPU类型的自定义算子采用AOT编译方式,要求算子开发者基于提供的特定接口,手写算子实现函数对应的源码文件,并提前将源码文件编译为动态链接库,然后框架会根据开发者在算子属性中配置的动态链接库名称,找到对应动态链接库并加载算子。
算子输出shape和数据类型推理可以通过定义Python函数实现,描述算子输出shape和数据类型的推导逻辑。
3.1基于msopgen工具创建AICPU算子模板文件
3.1.1 msopgen工具准备
msopgen工具所在目录:CANN软件安装后文件存储路径+/python/site-packages/bin。例如CANN的安装目录是/usr/local/Ascend/ascend-toolkit/5.1.RC2,则msopgen工具所在目录为/usr/local/Ascend/ascend-toolkit/latest/python/site-packages/bin
3.1.2 msopgen工具使用前提
CANN组合包提供进程级环境变量设置脚本,供用户在进程中引用,以自动完成环境变量设置。分为root用户和非root用户,执行命令参考如下:
- /usr/local/Ascend/ascend-toolkit+/set_env.sh(root用户)
- ${HOME}/Ascend/ascend-toolkit+/set_env.sh(非root用户)
同时我们需要安装msopgen工具所需的依赖包,执行如下的命令:
pip3 install xlrd==1.2.0
3.1.3 msopgen工具使用方法
自定义算子工程生成工具支持输入三种类型的原型定义文件创建算子工程,分别为:
- 适配昇腾AI处理器算子IR定义文件(.json)
- TensorFlow的原型定义文件(.txt)
TensorFlow的原型定义文件可用于生成TensorFlow、Caffe、PyTorch框架的算子工程
- 适配昇腾AI处理器算子IR定义文件(.xlsx)
注: msopgen工具未来不再支持.xlsx格式的模板配置文件
本案例使用从CANN软件安装后文件存储路径下的“python/site-packages/op_gen/json_template”中获取模板文件MS_json.json,并进行修改
创建算子工程
进入msopgen工具所在目录执行如下命令,参数说明请参见参数表1。
./msopgen gen -i {operator define file} -f {framework type} -c {Compute Resource} -out {Output Path}
参数名称 | 参数描述 |
gen(必选) | 用于生成算子开发交付件。 |
-i, --input (必选) | 算子定义文件路径,可配置为绝对路径或者相对路径。 工具执行用户需要有此路径的可读权限。 算子定义文件支持如下三种类型:
|
-f, --framework (必选) | 框架类型。
说明: 所有参数值大小写不敏感。 |
-c (必选) | 算子使用的计算资源。
ai_core-Ascend310 ai_core-Ascend910 请根据实际昇腾AI处理器版本进行选择。 说明: {Soc Version}可从CANN软件安装后文件存储路径的"compiler/data/platform_config"路径下查看支持的昇腾AI处理器的类型,对应“*.ini”文件的名字即为${soc_version}。
|
-out, (非必选) | 生成文件所在路径,可配置为绝对路径或者相对路径,并且工具执行用户具有可读写权限。 若不配置,则默认生成在执行命令的当前路径。 |
-m, (非必选) | 生成交付件模式。
默认值:0。 |
-op, (非必选) | 此参数针对-i为算子IR定义文件的场景。 配置算子的类型,如:Conv2DTik 若不配置此参数,当IR定义文件中存在多个算子时,工具会提示用户选择算子。 |
参数表1
本案例使用mindspore框架的AI算子开发,进入msopgen工具所在目录执行如下命令:
./msopgen gen -i /usr/local/Ascend/ascend-toolkit/latest/python/site-packages/op_gen/json_template/MS_json.json -f mindspore -c aicpu -out ./projectname
注意本案例基于mindspore框架的AI算子开发,所需要的IR定义文件与其他框架算子开发所需IR定义文件不同,基于mindspore框架的AI算子所需的配置文件type和format合在一起的,若使用《基于msopgen》中IR_json.json会产生错误,如图1。
图1
执行成功后会生成一下文件结构,如图2所示。
图2
- cpukernel/impl/ 是.h头文件和算子逻辑实现.cc文件
- framework/mindspore/op_impl存放算子注册信息脚本{op_name}_impl.py
- framework/mindspore/op_proto存放算子调用信息脚本{op_name}.py
- op_info_cfg/acicpu_kernel里是.ini信息库文件
生成的模板文件是基于Reshape的AI算子文件,需要用户自行修改具体的实现方法以及文件命名。
3.2 自定义AICPU算子实现
AI CPU算子的实现包括两部分:
- 头文件(cpukernel/impl/.h文件):进行算子类的声明,自定义算子类需要继承CpuKernel基类,如图3所示。
- 源文件(cpukernel/impl/.cc文件):重写算子类中的Compute函数,进行算子计算逻辑的实现,如图4所示
图3
图4
算子信息库配置:
进入“cpukernel/op_info_cfg/aicpu_kernel”目录,配置算子信息库文件“reshape_cust.ini”,配置信息如图5。
图5
参数说明请参见参数表2。
信息 | ReshapeCust算子配置 | 说明 |
[OpType] | [ReshapeCust] | 算子类型,以英文半角范括号,标识一个算子信息开始,根据算子分析,算子类型为ReshapeCust。 |
opInfo.engine | DNN_VM_AICPU | 配置算子调用的引擎。 AI CPU自定义算子的引擎固定为“DNN_VM_AICPU”。 |
opInfo.flagPartial | False | 此字段为预留字段,请保持固定值“False”。 |
opInfo.computeCost | 100 | 此字段为预留字段,请保持固定值“100”。 |
opInfo.flagAsync | False | 此字段为预留字段,请保持固定 值“False”。 |
opInfo.opKernelLib | CUSTAICPUKernel | 配置算子调用的kernelLib。 AI CPU自定义算子调用的kernelLib固定为“CUSTAICPUKernel”。 |
opInfo.kernelSo | libcust_aicpu_kernels.so | 配置AI CPU算子编译生成的so的名称。 |
opInfo.functionName | RunCpuKernel | 配置自定义算子调用的kernel函数接口名称。 自定义算子的kernel函数接口固定为“RunCpuKernel”。 |
opInfo.workspaceSize | 1024 | 此字段为预留字段。 配置为内存空间,用于分配算子临时计算的内存。 单位为KB,取值范围为:0~1048576(1G)。 建议配置为:1024 |
参数表2
AICPU算子信息脚本:
- 算子注册信息脚本/framework/mindspore/op_impl/reshape_cust_impl.py,注册信息包括输入、输出、算子额外的参数和输入输出的数据类型,具体如图6所示
- 算子调用信息脚本/framework/mindspore/op_proto/reshape_cust.py,引入算子注册信息脚本,在后续的ST测试时调用,如图7所示
图6
图7
3.3 编译AICPU算子
3.3.1 配置build.sh文件
在工程的根目录下,需要修改build.sh中依赖的环境变量,包括:
- ASCEND_OPP_PATH
- ASCEND_AICPU_PATH
- ASCEND_TENSOR_COMPILER_INCLUDE
- TOOLCHAIN_DIR
- AICPU_KERNEL_TARGET
如图8所示。默认生成的算子实现为libcust_aicpu_kernels.so,如需修改,请修改AICPU_KERNEL_TARGET的环境变量。
图8
3.3.2 编译
修改build.sh完成后,在工程的根目录下,执行命令bash build.sh。执行完成后,将会在工程路径下生成build_out文件夹,如图9所示。在/build_out/makepkg/packages/op_impl/custom/cpu/aicpu_kernel/custom_impl/路径下会找到libcust_aicpu_kernels.so的动态链接库,将其拷贝到mindspore/lib目录下。mindspore就是mindspore包所在的路径。
图9
3.4 ST测试
3.4.1 生成测试用例json文件
- 需要mindspore环境所需要的配置环境变量:mindspore官网
- ST工具依赖的环境变量:export PYTHONPATH=${mindspore_op_path}/impl:${mindspore_op_path}/op_proto:$PYTHONPATH。其中mindspore_op_path的值为算子根目录/framework/mindspore/。如果在后续执行ST测试时发生/framework/mindspore/op_proto中的{oprator_name}.py报错找不到/framework/mindspore/impl中的{oprator_name}_impl.py中的模块,一般是这个环境变量配置出现问题。
- 生成测试用例json文件
进入msopst工具所在目录,执行如下命令生成算子测试用例定义文件。
./msopst create -i {operator define file} -out {output path} -m {pb file} -q
参数说明请参见参数表3。
参数名称 | 参数描述 |
Create (必选) | 用于生成算子测试用例定义文件(*.json)。 |
-i,--input (必选) | 算子信息库定义文件路径(*.ini文件),可配置为绝对路径或者相对路径。 说明:输入的算子信息库定义文件(*.ini)仅能包含一个算子的定义。 |
-out,--output (非必选) | 生成文件所在路径,可配置为绝对路径或者相对路径,并且工具执行用户具有可读写权限。 若不配置,则默认生成在执行命令的当前路径。 |
-m,--model (非必选) | 配置为TensorFlow模型文件的路径,可配置为绝对路径或者相对路径。 若配置此参数,工具会从TensorFlow模型文件中获取首层算子的shape信息,并自动dump出算子信息库定义文件中算子的shape、dtype以及属性的value值,如果dump出的值在算子信息库定义文件所配置的范围内,则会自动填充到生成的算子测试用例定义文件中;否则会报错。 须知: 若配置此参数,系统中需要安装1.15或2.4版本的TensorFlow。 |
-q,--quiet (非必选) | 当前版本仅针对-m参数生效,代表是否进行人机交互。 若不配置-q参数,则会提示用户修改获取到的模型中的首层shape信息。 若配置了-q参数,则不会提示用户更改首层shape信息。 |
参数表3
示例:
./msopst create -i {oprator_name}/framework/mindspore/impl/reshapecust_impl.py -out ./out_put
执行完成后将会在msopst工具所在目录生成out_put文件夹,里面包含ST测试所需的测试配置文件,如图10所示。
图10
3.4.2 执行ST测试用例
进入msopst工具所在目录,执行如下命令执行测试用例。
./msopst run -i {**.json} -soc {Soc Version} -out {output path} -c {case name} -d {device id} -conf {msopst.ini path} -err_thr "[threshold1,threshold2]"
其中参数说明详见参数表4。
参数名称 | 参数描述 |
Run (必选) | 用于生成算子的ST测试用例。 |
-i,--input (必选) | 算子测试用例定义文件(*.json)的路径,可配置为绝对路径或者相对路径。此处的json文件为执行msopst create命令后的输出,算子测试用例定义文件的详细说明请参见参数表3。 |
-soc (必选) | 配置为昇腾AI处理器的类型,如: Ascend310, Ascend310P,Ascend910 可从CANN软件安装后文件存储路径的“compiler/data/platform_config”路径下查看支持的昇腾AI处理器的类型,对应“*.ini”文件的名字即为昇腾AI处理器的类型。 |
-out (非必选) | 生成文件所在路径,可配置为绝对路径或者相对路径,并且工具执行用户具有可读写权限。 |
-c (非必选) |
|
-d (非必选) | NPU设备ID,设置运行ST测试用例的昇腾AI处理器的ID。 若未设置此参数,默认为:0。 |
-err_thr (非必选) | 配置自定义精度标准,取值为含两个元素的列表:"[threshold1,threshold2]"
默认值为:"[0.01,0.05]"。 取值范围为:"[0.0,1.0]"。 说明:
|
-conf (非必选) | ST测试高级功能配置文件(msopst.ini)存储路径,可配置为绝对路径或者相对路径。 用户可通过修改msopst.ini配置文件,实现如下高级功能:
|
-err_report (非必选) | 针对比对失败的用例,获取算子期望数据与实际用例执行结果不一致的数据。若未设置此参数,默认为:“false”。
说明: 设置此参数为“true”时,获取的比对数据会根据每个case_name生成独立的csv文件,{case.name}_error_report.csv文件所在目录为{output_path}/{time_stamp}/{op_type}/run/out/test_data/data/st_error_reports。 |
参数表4
示例:
./msopst run -i ./out_put/ReshapeCustcase_20220920113623.json -soc Ascend310 -out ./result
运行成功后将会产生-out指定的目录下生成测试文件目录。生成的目录结构如图11所示。
图11
其中st_report.json文件中包含了ST的测试结果,如图12所示。
图12
四、从昇腾论坛获得更多支持
如果遇到其他上述步骤中未能出现的错误,欢迎大家到昇腾论坛,选择开发者选项,点击进入昇腾论坛或者昇腾)中提出自己的问题在这里有很多技术大拿可以解决你的问题。或者也可以访问昇腾博客,搜索他人的独到见解。