视频案例,可以查看哔哩哔哩MindSpore框架AICPU算子演示视频

一、MindSpore AI算子介绍

1.1 MindSpore框架介绍

MindSpore是华为公司推出的新一代深度学习框架,是源于全产业的最佳实践,最佳匹配昇腾处理器算力,支持终端、边缘、云全场景灵活部署,开创全新的AI编程范式,降低AI开发门槛。为了助力开发者与产业更加从容地应对这一系统级挑战,新一代AI框架MindSpore具有编程简单、端云协同、调试轻松、性能卓越、开源开放等特点,降低了AI开发门槛。

1.2 AICPU算子基本介绍

AICPU算子,是运行在昇腾AI处理器中AICPU计算单元上的表达一个完整计算逻辑的运算,如下情况下,开发者需要自定义AICPU算子。

  1. 在NN模型训练或者推理过程中,将第三方开源框架转化为适配昇腾AI处理器的模型时遇到了昇腾AI处理器不支持的算子。此时,为了快速打通模型执行流程,用户可以通过自定义AICPU算子进行功能调测,提升调测效率。功能调通之后,后续性能调测过程中再将AICPU自定义算子转换成TBE算子实现。
  2. 某些场景下,无法通过AI Core实现自定义算子(比如部分算子需要int64类型,但AI Core指令不支持),且该算子不是网络的性能瓶颈,此时可以通过开发AICPU自定义算子实现昇腾AI处理器对此算子的支持。

一个完整的AICPU算子包含四部分:算子原型定义、对应开源框架的算子适配插件、算子信息库定义和算子实现。

1.3 msopgen工具介绍

CANN开发套件包中提供了自定义算子工程生成工具msopgen,可基于算子原型定义输出算子开发相关交付件,包括算子代码实现文件、算子适配插件、算子原型定义、算子信息库定义以及工程编译配置文件。

1.4 msopst工具介绍

CANN开发套件包中提供了ST测试工具:msopst,支持生成算子的ST测试用例并在硬件环境中执行。具有如下功能:

  1. 根据算子信息库定义文件(.ini)生成算子测试用例定义文件(*.json),作为算子ST测试用例的输入。
  2. 根据算子测试用例定义文件生成ST测试数据及测试用例执行代码,在硬件环境上执行算子测试用例。
  3. 自动生成运行报表(st_report.json)功能,报表记录了测试用例信息及各阶段运行情况。
  4. 根据用户定义并配置的算子期望数据生成函数,回显期望算子输出和实际算子输出的对比测试结果。

二、环境配置

进行基于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开发套件包(参考可参考《CANN 软件安装指南》的“安装开发环境”章节)。

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算子开发流程

  1. 算子分析:明确算子的功能、输入、输出,规划算子类型名称以及算子编译生成的库文件名称等。
  2. 工程创建:通过msopgen工具创建AICPU算子工程,创建完成后,会自动生成算子工程目录及相应的文件模板,开发者可以基于这些模板进行算子开发。
  3. 算子实现:实现算子的计算逻辑。                      
  4. 算子原型定义:子原型定义规定了在昇腾AI处理器上可运行算子的约束,主要体现算子的数学含义,包含定义算子输入、输出、属性和取值范围,基本参数的校验和shape的推导,原型定义的信息会被注册到GE的算子原型库中。离线模型转换时,GE会调用算子原型库的校验接口进行基本参数的校验,校验通过后,会根据原型库中的推导函数推导每个节点的输出shape与dtype,进行输出tensor的静态内存的分配。
  5. 算子信息定义:算子信息配置文件用于将算子的相关信息注册到算子信息库中,包括算子的OpType、输入输出dtype、name等信息。网络运行时,AICPU Engine会根据算子信息库中的算子信息做基本校验,并进行算子匹配。
  6. 算子编译:将算子适配插件实现文件、原型定义文件、算子原型库、算子信息库。
  7. 算子ST测试:即系统测试(System Test),可以自动生成测试用例,在真实的硬件环境中,验证算子功 能的正确性。                                    

三、MindSpore AICPU算子开发

AICPU类型的自定义算子采用AOT编译方式,要求算子开发者基于提供的特定接口,手写算子实现函数对应的源码文件,并提前将源码文件编译为动态链接库,然后框架会根据开发者在算子属性中配置的动态链接库名称,找到对应动态链接库并加载算子。具体算子实现参考CANN AICPU 自定义算子开发。

算子输出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用户,执行命令参考如下:

  1. /usr/local/Ascend/ascend-toolkit+/set_env.sh(root用户)
  2. ${HOME}/Ascend/ascend-toolkit+/set_env.sh(非root用户)

同时我们需要安装msopgen工具所需的依赖包,执行如下的命令:

pip3 install xlrd==1.2.0

3.1.3 msopgen工具使用方法

自定义算子工程生成工具支持输入三种类型的原型定义文件创建算子工程,分别为:

  1. 适配昇腾AI处理器算子IR定义文件(.json)
  2. TensorFlow的原型定义文件(.txt)

TensorFlow的原型定义文件可用于生成TensorFlow、Caffe、PyTorch框架的算子工程

  1. 适配昇腾AI处理器算子IR定义文件(.xlsx)

注: 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

(必选)

算子定义文件路径,可配置为绝对路径或者相对路径。

工具执行用户需要有此路径的可读权限。

算子定义文件支持如下三种类型:

  • 适配昇腾AI处理器算子IR定义文件(.json)
  • TensorFlow的原型定义文件(.txt)
  • 适配昇腾AI处理器算子IR定义文件(.xlsx)

-f,

--framework

(必选)

框架类型。

  • TensorFlow框架,参数值:tf或者tensorflow
  • Caffe框架,参数值:caffe
  • PyTorch框架,参数值:pytorch
  • ONNX框架,参数值:onnx
  • MindSpore框架,参数值:mindspore或者ms

说明:

所有参数值大小写不敏感。

-c

(必选)

算子使用的计算资源。

  • 针对TBE算子,配置格式为:ai_core-{Soc Version},ai_core与{Soc Version}之间用中划线“-”连接,如下所示:

ai_core-Ascend310

ai_core-Ascend910

请根据实际昇腾AI处理器版本进行选择。

说明:

{Soc Version}可从CANN软件安装后文件存储路径的"compiler/data/platform_config"路径下查看支持的昇腾AI处理器的类型,对应“*.ini”文件的名字即为${soc_version}。

  • 针对AI CPU算子,请配置为:aicpu。

-out,

(非必选)

生成文件所在路径,可配置为绝对路径或者相对路径,并且工具执行用户具有可读写权限。

若不配置,则默认生成在执行命令的当前路径。

-m,

(非必选)

生成交付件模式。

  • 0:创建新的算子工程,若指定的路径下已存在算子工程,则会报错退出。
  • 1:在已有的算子工程中追加算子

默认值: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

  1. cpukernel/impl/ 是.h头文件和算子逻辑实现.cc文件
  2. framework/mindspore/op_impl存放算子注册信息脚本{op_name}_impl.py
  3. framework/mindspore/op_proto存放算子调用信息脚本{op_name}.py
  4. op_info_cfg/acicpu_kernel里是.ini信息库文件

生成的模板文件是基于Reshape的AI算子文件,需要用户自行修改具体的实现方法以及文件命名。

3.2 自定义AICPU算子实现

AI CPU算子的实现包括两部分

  1. 头文件(cpukernel/impl/.h文件):进行算子类的声明,自定义算子类需要继承CpuKernel基类,如图3所示。
  2. 源文件(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算子信息脚本:

  1. 算子注册信息脚本/framework/mindspore/op_impl/reshape_cust_impl.py,注册信息包括输入、输出、算子额外的参数和输入输出的数据类型,具体如图6所示
  2. 算子调用信息脚本/framework/mindspore/op_proto/reshape_cust.py,引入算子注册信息脚本,在后续的ST测试时调用,如图7所示

图6

图7

3.3 编译AICPU算子

3.3.1 配置build.sh文件

在工程的根目录下,需要修改build.sh中依赖的环境变量,包括:

  1. ASCEND_OPP_PATH
  2. ASCEND_AICPU_PATH
  3. ASCEND_TENSOR_COMPILER_INCLUDE
  4. TOOLCHAIN_DIR
  5. 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文件

  1. 需要mindspore环境所需要的配置环境变量:mindspore官网
  2. 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中的模块,一般是这个环境变量配置出现问题。
  3. 生成测试用例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 Ascend310PAscend910

可从CANN软件安装后文件存储路径的“compiler/data/platform_config”路径下查看支持的昇腾AI处理器的类型,对应“*.ini”文件的名字即为昇腾AI处理器的类型。

-out

(非必选)

生成文件所在路径,可配置为绝对路径或者相对路径,并且工具执行用户具有可读写权限。

-c

(非必选)

  • 配置为需要执行的case的名字,若需要同时运行多个case,多个case之间使用逗号分隔。
  • 若配置为“all”,或者不配置此参数,代表执行所有case。

-d

(非必选)

NPU设备ID,设置运行ST测试用例的昇腾AI处理器的ID。

若未设置此参数,默认为:0。

-err_thr

(非必选)

配置自定义精度标准,取值为含两个元素的列表:"[threshold1,threshold2]"

  • threshold1:算子输出结果与标杆数据误差阈值,若误差大于该值则记为误差数据。
  • threshold2:误差数据在全部数据占比阈值。若误差数据在全部数据占比小于该值,则精度达标,否则精度不达标。

默认值为:"[0.01,0.05]"。

取值范围为:"[0.0,1.0]"。

说明:

  • 配置的列表需加引号以避免一些问题。例如配置为:-err_thr "[0.01,0.05]"。
  • 若测试用例json文件和执行msopst命令时均配置该参数,以执行msopst命令时配置的精度标准进行比对。若均未配置,则以执行msopst命令时默认精度标准[0.01,0.05]进行比对。

-conf

(非必选)

ST测试高级功能配置文件(msopst.ini)存储路径,可配置为绝对路径或者相对路径。

用户可通过修改msopst.ini配置文件,实现如下高级功能:

  • ST测试源码可编辑
  • 已编辑的ST测试源码可执行
  • 设置host日志级别环境变量
  • 设置日志是否在控制台显示
  • 设置atc模型转换的日志级别
  • 设置模型精度
  • 读取算子在昇腾AI处理器上运行的性能数据

-err_report

(非必选)

针对比对失败的用例,获取算子期望数据与实际用例执行结果不一致的数据。若未设置此参数,默认为:“false”。

  • true:针对比对失败的用例,将算子期望数据与实际用例执行结果不一致的数据保存在{case.name}_error_report.csv文件中。
  • 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),选择开发者选项,点击进入昇腾论坛或者昇腾)中提出自己的问题在这里有很多技术大拿可以解决你的问题。或者也可以访问昇腾博客,搜索他人的独到见解。

MindSpore框架AICPU算子开发全流程相关推荐

  1. MindSpore框架TBE算子开发全流程

    本文为MindSpore框架TBE算子开发全流程的图文案例.         视频案例请移步MindsSpore框架TBE算子开发全流程 MindSpore框架TBE算子开发全流程 一.工具介绍 1. ...

  2. 智能门锁开发全流程分享

    本文分享自中移OneOS微信公众号<智能门锁开发全流程>,作者:小O. <<<Python是计算机中一门公认的简单并且容易学习的语言,它的语法简单友好,拥有丰富的库资源和 ...

  3. 一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

    一文解锁华为云新技能-AIOT开发全流程[设备接入-ESP端侧数据收集[MQTT]-实时数据分析](步步截图较详细) 在这篇你将会接触到:从物联网工程师从硬件层-通信层到应用层全流程:开发华为云最基本 ...

  4. 深度学习大厂前端项目开发全流程全流程

    用户审美的要求越来越高,也就使得越来越多的公司和企业注重线上用户的体验,都想要向外界传达出众的气质形象和重要信息,所以,Web前端人员的需求也越来越大. 深度学习大厂项目开发全流程全流程 在国外企业, ...

  5. 次世代游戏美术资源开发全流程及常用的软件

    次世代游戏美术资源开发全流程案例 外国艺术家FlyCat用Blender完成的次世代悟空(胸像)全流程 外国艺术家FlyCat用Blender完成的次世代悟空(胸像)全流程 流程图

  6. RPD快速产品开发全流程详解

    一.什么是RPD? RPD定义-Rapid Product Development(快速产品开发): 借鉴了业界主流的产品开发流程:IPD.敏捷开发等: 结合企业当前软硬件开发实践,RPD是包括了思想 ...

  7. 【CANN训练营】CANN:AICPU算子开发

    创建一个LessEqual算子,对标torch.le https://pytorch.org/docs/1.5.0/torch.html?highlight=torch%20le#torch.le 下 ...

  8. 【微信小程序开发全流程】篇章0:基于JavaScript开发的校园综合类微信小程序的概览

    基于JavaScript开发的校园综合类微信小程序的概览 本文仅供学习,未经同意请勿转载 一些说明:上述项目来源于笔者我本科大三阶段2020年电子设计课程项目,在这个项目中,我主要是负责的部分有前端, ...

  9. 菜鸟看的Android应用开发全流程

    给菜鸟看的Android应用开发全流程--好多Android开发中,没人告诉过你的事 很多菜鸟开始学习Android开发,去网上搜集过很多"Android开发教程",但是搜索出来的 ...

最新文章

  1. 基于GEMM实现的CNN底层算法被改?Google提出全新间接卷积算法
  2. Indigo | Indigo(Python)简介、安装与入门
  3. ACL 2018论文解读 | 基于排序思想的弱监督关系抽取选种与降噪算法
  4. 转 IDEA 解决代码提示功能消失
  5. vb红绿灯自动切换_VB红绿灯程序
  6. Java PipedInputStream connect()方法与示例
  7. ajax获取session值_java程序员你真的了解session与cookie吗?
  8. python读取文件夹下所有文件的名称_python2.7 学习之读取文件夹下所有文件名称及内容...
  9. 更换S60第三版程序图标
  10. shell基础之exit,break,continue
  11. Navicat安装问题及解决办法
  12. 怎么用python下载网易云_如何使用python批量下载网易云音乐的免费音乐
  13. Android 健康饮食软件详解
  14. python 网络调试助手
  15. 最容易理解的ConViT: Improving Vision Transformerswith Soft Convolutional Inductive Biases
  16. GitHub图片加载不出来解决方案(超详细图文教程)
  17. 一位软件实施工程师的自述(转)
  18. Android之经典Launcher主菜单模块学习
  19. 2022元宇宙十大商业魔咒
  20. DNS安全防护解决方案

热门文章

  1. 基于光学遥感图像的舰船目标检测技术研究——尹雅
  2. TNT : transformer in transformer
  3. Win10系统下怎么开HDR?
  4. SecureCRT强制卸载
  5. PMP项目管理项目质量管理
  6. 有道词典pc客户端存在dll劫持漏洞
  7. Gateway的限流重试机制
  8. miniui datagrid java_[Java教程]MiniUI DataGrid获取当前行某列值
  9. Shopee刊登工具ERP功能是什么?这六大功能一定要知道
  10. 【华人学者风采】唐金辉 南京理工大学