基于msopgen工具创建算子工程
CANN开发套件包中提供了自定义算子工程生成工具msopgen,可基于算子原型定义输出算子工程:包括算子host侧代码实现文件、算子kernel侧实现文件、算子适配插件以及工程编译配置文件等。
使用msopgen工具创建算子开发工程的步骤如下:
- 编写算子的原型定义json文件,用于生成算子开发工程。json文件的配置参数详细说明请参考表1。例如,AddCustom算子的json文件命名为add_custom.json,文件内容如下:
[ { "op": "AddCustom", "language": "cpp", "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", "language": "cpp", "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 } ] } ]
表1 json文件配置参数说明 配置字段
类型
含义
是否必选
op
-
字符串
算子的Operator Type。
是
language
-
字符串
算子编码语言。
否
input_desc
-
列表
输入参数描述。
否
name
字符串
算子输入参数的名称。
param_type
字符串
参数类型:
- required
- optional
- dynamic
未配置默认为required。
format
列表
包含如下取值:
ND,NHWC,NCHW,HWCN,NC1HWC0,FRACTAL_Z等。
format与type的数量需保持一致。
type
列表
算子参数的类型。
取值范围:float16(fp16), float32(fp32), int8, int16, int32, uint8, uint16, bool, bfloat16(bf16)等。
说明:不同计算操作支持的数据类型不同,详细请参见API参考。
format与type的数量需保持一致。
output_desc
-
列表
输出参数描述。
是
name
字符串
算子输出参数的名称。
param_type
字符串
参数类型:
- required
- optional
- dynamic
未配置默认为required。
format
列表
包含如下取值:
ND,NHWC,NCHW,HWCN,NC1HWC0,FRACTAL_Z等。
format与type的数量需保持一致。
type
列表
算子参数的类型。
取值范围:float16(fp16), float32(fp32), int8, int16, int32, uint8, uint16, bool, bfloat16(bf16)等。
说明:不同计算操作支持的数据类型不同,详细请参见API参考。
format与type的数量需保持一致。
attr
-
列表
属性描述。
否
name
字符串
算子属性参数的名称。
param_type
字符串
参数类型:
- required
- optional
未配置默认为required。
type
字符串
算子参数的类型。
包含如下取值:
int、bool、float、string、list_int、list_float等。
default_value
-
默认值
- 使用msopgen工具生成算子的开发工程。以生成AddCustom的算子工程为例,下文仅针对关键参数进行解释,详细参数说明请参见表2。
${INSTALL_DIR}/python/site-packages/bin/msopgen gen -i $HOME/sample/add_custom.json -c ai_core-<soc_version> -lan cpp -out $HOME/sample/AddCustom
- ${INSTALL_DIR}为CANN软件安装后文件存储路径,请根据实际环境进行替换。
- -i:指定算子原型定义文件add_custom.json所在路径,请根据实际情况修改。
- -c:ai_core-<soc_version>代表算子在AI Core上执行,<soc_version>为昇腾AI处理器的型号。
- 如果无法确定具体的<soc_version>,则在安装昇腾AI处理器的服务器执行npu-smi info命令进行查询,在查询到的“Name”前增加Ascend信息,例如“Name”对应取值为xxxyy,实际配置的<soc_version>值为Ascendxxxyy。
- -lan: 参数cpp代表算子基于Ascend C编程框架,使用C++编程语言开发。
- -out:生成文件所在路径,可配置为绝对路径或者相对路径,并且工具执行用户对路径具有可读写权限。若不配置,则默认生成在执行命令的当前路径。
- 命令执行完后,会在-out指定目录或者默认路径下生成算子工程目录,工程中包含算子实现的模板文件,编译脚本等,以AddCustom算子为例,目录结构如下所示:
AddCustom ├── 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 // 自定义算子工程打包相关脚本所在目录
上述目录结构中的粗体文件为后续算子开发过程中需要修改的文件,其他文件无需修改。