创建算子工程
DDK开发套件包中提供了自定义算子工程生成工具msOpGen,可基于算子原型定义输出算子工程:包括算子host侧代码实现文件、算子kernel侧实现文件以及工程编译配置文件等。
简要说明:
使用msOpGen工具创建算子工程之前,需要参考环境准备章节安装驱动固件和DDK软件包,完成开发环境和运行环境的准备。
同时需要配置ascendc环境变量,示例如下。
source ddk/tools/tools_ascendc/set_ascendc_env.sh
使用msOpGen工具创建算子开发工程的步骤如下。
-
编写算子的原型定义json文件,用于生成算子开发工程。
例如,AddCustom算子的json文件命名为add_custom.json,文件内容如下。
[{"op": "AddCustom","input_desc": [{"name": "x","param_type": "required","format": ["ND","ND","ND"],"type": ["fp16","float","int32"]},{"name": "y","param_type": "required","format": ["ND","ND","ND"],"type": ["fp16","float","int32"]}],"output_desc": [{"name": "z","param_type": "required","format": ["ND","ND","ND"],"type": ["fp16","float","int32"]}]}]例如,ReduceMaxCustom算子(包含属性)的json文件命名为reduce_max_custom.json,文件内容如下。
[{"op": "ReduceMaxCustom","input_desc": [{"name": "x","param_type": "required","format": ["ND"],"type": ["float16"]}],"output_desc": [{"name": "y","param_type": "required","format": ["ND"],"type": ["float16"]},{"name": "idx","param_type": "required","format": ["ND"],"type": ["int32"]}],"attr": [{"name": "reduceDim","param_type": "required","type": "int"},{"name": "isKeepDim","param_type": "optional","type": "int","default_value": 1}]}] -
使用msOpGen工具生成算子的开发工程。以生成AddCustom的算子工程为例,下文仅针对关键参数进行解释,详细参数说明请参见算子工程创建工具参数说明。
msopgen gen -i ./add_custom.json -c ai_core-kirin9020 -f ONNX -out ./AddCustom- -i:指定算子原型定义文件add_custom.json所在路径,请根据实际情况修改。
- -c:ai_core-<soc_version>代表算子在AI Core上执行,<soc_version>为AI处理器的型号,当前支持ai_core-kirin9020。
AI处理器的型号<soc_version>请在运行环境上通过命令行获取:
hdc -t {target} shell param get ohos.boot.chiptype
target:设备的SN码,可以通过hdc list targets获取当前环境上所有设备的SN码。
- -f:第三方算子平台,目前支持TF、ONNX。
- -out:生成文件所在路径,可配置为绝对路径或者相对路径,并且工具执行开发者对路径具有可读写权限。若不配置,则默认生成在执行命令的当前路径。
-
命令执行完后,会在-out指定目录或者默认路径下生成算子工程目录,工程中包含算子实现的模板文件,编译脚本等,以AddCustom算子为例,目录结构如下所示:
AddCustom├── build_devices.sh // 编译kernel动态库入口脚本├── build.sh // 编译入口脚本├── cmake│ ├── config.cmake│ ├── func.cmake│ ├── intf.cmake│ ├── makeself.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 // 自定义算子工程打包相关脚本所在目录上述目录结构中的粗体文件为后续算子开发过程中需要修改的文件,其他文件无需修改。
工程目录中的op_kernel和op_host包含了算子的核心实现文件。op_kernel下存放Kernel侧算子实现。op_host下存放host侧代码实现,包括算子原型定义实现、Host侧Tiling实现。其中kernel侧算子实现和host侧tiling实现在算子实现章节已经介绍了其核心的实现方法,在该章节会侧重于介绍接入DDK框架后的编程模式和API的使用。工程目录中的CMakePresets.json,用于开发者完成工程编译相关配置,之后即可进行编译部署。