MindSpore是华为公司推出的新一代深度学习框架,是源于全产业的最佳实践,最佳匹配昇腾处理器算力,支持终端、边缘、云全场景灵活部署,开创全新的AI编程范式,降低AI开发门槛。为了助力开发者与产业更加从容地应对这一系统级挑战,新一代AI框架MindSpore具有编程简单、端云协同、调试轻松、性能卓越、开源开放等特点,降低了AI开发门槛。
AICPU算子,是运行在昇腾AI处理器中AICPU计算单元上的表达一个完整计算逻辑的运算,如下情况下,开发者需要自定义AICPU算子。
一个完整的AICPU算子包含四部分:算子原型定义、对应开源框架的算子适配插件、算子信息库定义和算子实现。
CANN开发套件包中提供了自定义算子工程生成工具msopgen,可基于算子原型定义输出算子开发相关交付件,包括算子代码实现文件、算子适配插件、算子原型定义、算子信息库定义以及工程编译配置文件。
CANN开发套件包中提供了ST测试工具:msopst,支持生成算子的ST测试用例并在硬件环境中执行。具有如下功能:
进行基于mindspore框架的AICPU算子开发前需要配置好远端环境。远端环境为linux服务器,linux系统版本Ubuntu 18.04.6。
依赖 |
版本 |
Python |
3.7.5 |
mindspore |
1.8.0 |
coverage |
6.4.4 |
absl-py |
1.0.0 |
xlrd |
1.2.0 |
配置好Ascend-cann-toolkit开发套件包(参考可参考《CANN 软件安装指南》的“安装开发环境”章节)。
Linux服务器上需安装部署好对应固件与驱动,并配置好mindspore 1.8.0。
安装mindpspore工具包。用户可参考Mindspore官网中的《MindSpore1.8.0安装指南》进行安装。
验证mindspore是否安装成功。在xshell上运行python -c "import mindspore;mindspore.run_check()",如果输出:
说明MindSpore安装成功。
AICPU类型的自定义算子采用AOT编译方式,要求算子开发者基于提供的特定接口,手写算子实现函数对应的源码文件,并提前将源码文件编译为动态链接库,然后框架会根据开发者在算子属性中配置的动态链接库名称,找到对应动态链接库并加载算子。具体算子实现参考CANN AICPU 自定义算子开发。
算子输出shape和数据类型推理可以通过定义Python函数实现,描述算子输出shape和数据类型的推导逻辑。
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
CANN组合包提供进程级环境变量设置脚本,供用户在进程中引用,以自动完成环境变量设置。分为root用户和非root用户,执行命令参考如下:
同时我们需要安装msopgen工具所需的依赖包,执行如下的命令:
pip3 install xlrd==1.2.0
自定义算子工程生成工具支持输入三种类型的原型定义文件创建算子工程,分别为:
TensorFlow的原型定义文件可用于生成TensorFlow、Caffe、PyTorch框架的算子工程
注: msopgen工具未来不再支持.xlsx格式的模板配置文件
本案例使用从CANN软件安装后文件存储路径下的“python/site-packages/op_gen/json_template”中获取模板文件MS_json.json,并进行修改,其文件参数配置说明请参见《基于msopgen》中的表1。
创建算子工程
进入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
生成的模板文件是基于Reshape的AI算子文件,需要用户自行修改具体的实现方法以及文件命名。
AI CPU算子的实现包括两部分:
图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算子信息脚本:
图7
在工程的根目录下,需要修改build.sh中依赖的环境变量,包括:
如图8所示。默认生成的算子实现为libcust_aicpu_kernels.so,如需修改,请修改AICPU_KERNEL_TARGET的环境变量。
图8
修改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
参数名称 |
参数描述 |
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
进入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
如果遇到其他上述步骤中未能出现的错误,欢迎大家到昇腾论坛(进入昇腾论坛_开发者论坛-华为云论坛 (huaweicloud.com),选择开发者选项,点击进入昇腾论坛或者昇腾)中提出自己的问题在这里有很多技术大拿可以解决你的问题。或者也可以访问昇腾博客,搜索他人的独到见解。