本章节介绍的简易自定义算子工程,是上文中介绍的自定义算子工程的简化版,对算子的编译、打包、部署过程进行简化,便于开发者将该工程集成到自己的算子工程。
[object Object]
基于简易自定义算子工程的算子开发流程图如下:
和类似,简易自定义算子工程通过msOpGen生成,基于算子原型定义输出算子工程,包括算子host侧代码实现文件、算子kernel侧实现文件以及工程编译配置文件等。主要差异点在于:创建简易算子工程需要通过-f参数配置framework框架为aclnn。
使用msOpGen工具创建简易算子开发工程的步骤如下:
编写算子的原型定义json文件,用于生成算子开发工程。
例如,AddCustom算子的json文件命名为add_custom.json,文件内容如下:
[object Object]使用msOpGen工具生成算子的开发工程。以生成AddCustom的算子工程为例,下文仅针对关键参数进行解释,详细参数说明请参见。
[object Object]${INSTALL_DIR}为CANN软件安装后文件存储路径,请根据实际环境进行替换。
-i:指定算子原型定义文件_add_custom_.json所在路径,请根据实际情况修改。
-c:
[object Object]代表算子在AI Core上执行,[object Object]为昇腾AI处理器的型号。-lan:参数cpp代表算子基于Ascend C编程框架,使用C/C++编程语言开发。
-out:生成文件所在路径,可配置为绝对路径或者相对路径,并且工具执行用户对路径具有可读写权限。若不配置,则默认生成在执行命令的当前路径。
-f:表示框架类型,aclnn表示生成简易工程。
命令执行完后,会在-out指定目录或者默认路径下生成算子工程目录,工程中包含算子实现的模板文件,编译脚本等,以AddCustom算子为例,目录结构如下所示:
[object Object][object Object]
算子kernel侧和host侧实现开发完成后,需要对算子进行编译,生成算子静态库;自动生成aclnn调用实现代码和头文件,链接算子静态库生成aclnn动态库,以支持后续的单算子API执行方式(aclnn)的算子调用。编译过程如下:
- 根据host侧算子实现文件自动生成aclnn接口aclnn_*.h和aclnn实现文件aclnn_.cpp。
- 编译Tiling实现和算子原型定义生成Tiling动态库liboptiling.so(libcust_opmaster_rt2.0)。
- 编译kernel侧算子实现文件,并加载Tiling动态库,生成kernel静态库libkernels.a。
- 编译aclnn实现文件,并链接kernel静态库libkernels.a生成单算子API调用的动态库libcust_opapi.so。
上述编译过程示意图如下:
图 1 编译过程示意图[object Object][object Object]
上文描述的过程都封装在编译脚本中,开发者进行编译时参考如下的步骤进行操作:
完成工程编译相关配置。
修改cmake目录下config.cmake中的配置项,config.cmake文件内容如下:
[object Object]表 1 需要开发者配置的常用参数列表
[object Object][object Object]
[object Object]配置编译相关环境变量(可选)
表 2 环境变量说明
[object Object][object Object]
[object Object]
(可选)如果需要编译多个算子,在op_kernel目录下的CMakeLists.txt中增加要编译的算子。
[object Object]在算子工程目录下执行如下命令,进行算子工程编译。
[object Object]编译成功后,会在CMAKE_INSTALL_PREFIX/op_api目录存放生成的aclnn头文件和lib库,每一个算子都会对应一个单独的头文件。具体目录结构如下:
[object Object]