跳到主要内容

创建算子工程

DDK开发套件包中提供了自定义算子工程生成工具msOpGen,可基于算子原型定义输出算子工程:包括算子host侧代码实现文件算子kernel侧实现文件以及工程编译配置文件等

简要说明:

使用msOpGen工具创建算子工程之前,需要参考环境准备章节安装驱动固件和DDK软件包,完成开发环境和运行环境的准备。

同时需要配置ascendc环境变量,示例如下。

source ddk/tools/tools_ascendc/set_ascendc_env.sh

使用msOpGen工具创建算子开发工程的步骤如下。

  1. 编写算子的原型定义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
    }
    ]
    }
    ]
  2. 使用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:生成文件所在路径,可配置为绝对路径或者相对路径,并且工具执行开发者对路径具有可读写权限。若不配置,则默认生成在执行命令的当前路径。
  3. 命令执行完后,会在-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,用于开发者完成工程编译相关配置,之后即可进行编译部署。