自定义算子工程是一个包含用户编写的host侧和kerne|侧算子实现文件的,用于编译和安装自定义算子run包的工程框架。
CANN软件包中提供了工程创建工具msopgen,开发者可以输入算子原型定义文件生成Ascend C算子开发工程。
需要编写AddCustom算子的原型定义json文件以及运行以下代码
${INSTALL_DIR}/python/site-packages/bin/msopgen gen -i $HOME/sample/add_custom.json -c ai_core-
其中对这些命令进行解释:
${INSTALL_DIR}为CANN软件安装后文件存储路径,根据实际环境进行替换。
-i:指定算子原型定义文件add_custom.json所在路径,请根据实际情况修改。
-c:ai_core-
-lan: 参数cpp代表算子基于Ascend C编程框架,使用C++编程语言开发。
-out:生成文件所在路径,可配置为绝对路径或者相对路径,并且工具执行用户对路径具有可读写权限。若不配置,则默认生成在执行命令的当前路径。
使用msopgen工具生成AddCustom算子的开发命令之后,会在$HOME/sample目录下生成算子工程目录AddCustom,工程中包含算子实现的模板文件,编译脚本等,如下所示:
AddCustom
├── build.sh // 编译入口脚本
├── cmake
│ ├── config.cmake
│ ├── util // 算子工程编译所需脚本及公共编译文件存放目录
├── CMakeLists.txt // 算子工程的CMakeLists.txt
├── CMakePresets.json // 编译配置项
├── framework // 算子插件实现文件目录,单算子模型文件的生成不依赖算子适配插件,无需关注
├── op_host // host侧实现文件
│ ├── add_custom_tiling.h // 算子tiling定义文件
│ ├── add_custom.cpp // 算子原型注册、shape推导、信息库、tiling实现等内容文件
│ ├── CMakeLists.txt
├── op_kernel // kernel侧实现文件
│ ├── CMakeLists.txt
│ ├── add_custom.cpp // 算子核函数实现文件
├── scripts // 自定义算子工程打包相关脚本所在目录
我是在ModelArts环境下创建了一个notebook,镜像为:
创建好之后,进入终端,下载samples代码仓库:
进入到op_dev目录,这个目录就是一个自定义算子交付目录
cd samples/cplusplus/level1_single_api/4_op_dev/6_ascendc_custom_op/acl_invocation/op_dev
然后通过msopgen这个工具生成,生成之前可以运行以下命令,看看自己的AI处理器型号:
npu-smi info
我的结果如下,Ascend910B:
然后接着,你要找到${INSTALL_DIR}这个位置,也就是CANN软件安装后文件存储路径,我的为:/usr/local/Ascend/ascend-toolkit/7.0.RC1,默认是路径可能都是这个,
接着就可以运行msopgen命令:
/usr/local/Ascend/ascend-toolkit/7.0.RC1/python/site-packages/bin/msopgen gen -i add_custom.json -c ai_core-Ascend910B2 -lan cpp -out ./custom_opp
显示生成完成:
可以看到新生成的custom_opp文件夹里生成了以下文件:
我们主要关注CMakePresets.json里面“ASCEND_CANN_PACKAGE_PATH”是否和你安装的CANN路径对应,一般默认都是对应的。
下面进行自定义算子工程编译:
./build.sh
显示没有这个头文件:register/tilingdata_base.h
设置环境变量 ASCEND_TENSOR_COMPILER_INCLUDE:
export ASCEND_TENSOR_COMPILER_INCLUDE=/usr/local/Ascend/ascend-toolkit/7.0.RC1/aarch64-linux/include
然后执行./build.sh
接下来部署自定义算子包:
./custom_opp_euleros_aarch64.run
看到SUCCESS说明部署成功!
以上就是Ascend C自定义算子工程的演示。