CANN开发套件包中提供了自定义算子工程生成工具msopgen,可基于算子原型定义输出算子开发相关交付件,包括算子代码实现文件、算子适配插件、算子原型定义、算子信息库定义以及工程编译配置文件。
若开发者需要自定义多个AI CPU算子,需要在同一算子工程中进行实现,并将所有自定义算子在同一工程中同时进行编译,将所有AI CPU自定义算子的实现文件编译成一个动态库文件。
通过可执行文件“msopgen”生成自定义算子工程,其功能和安装路径如下。
文件名 |
功能 |
路径 |
---|---|---|
msopgen |
生成自定义算子工程。 |
CANN软件安装后文件存储路径下的“python/site-packages/bin”。 |
TensorFlow的原型定义文件可用于生成TensorFlow、Caffe、PyTorch框架的算子工程。
配置字段 |
类型 |
含义 |
是否必选 |
|
---|---|---|---|---|
op |
- |
字符串 |
算子的Operator Type。 |
是 |
input_desc |
- |
列表 |
输入参数描述。 |
否 |
name |
字符串 |
算子输入参数的名称。 |
||
param_type |
字符串 |
参数类型:
未配置默认为required。 |
||
format |
列表 |
针对类型为tensor的参数,配置为tensor支持的数据排布格式,具体请参考数据排布格式。 包含如下取值: ND,NHWC,NCHW,HWCN,NC1HWC0,FRACTAL_Z等。 format与type的数量需保持一致。 |
||
type |
列表 |
算子参数的类型。 取值范围:float16, float32, int8, int16, int32, uint8, uint16, bool等。
说明:
不同计算操作支持的数据类型不同,详细请参见接口参考。 format与type的数量需保持一致。 |
||
output_desc |
- |
列表 |
输出参数描述。 |
是 |
name |
字符串 |
算子输出参数的名称。 |
||
param_type |
字符串 |
参数类型:
未配置默认为required。 |
||
format |
列表 |
针对类型为tensor的参数,配置为tensor支持的数据排布格式,具体请参考数据排布格式。 包含如下取值: ND,NHWC,NCHW,HWCN,NC1HWC0,FRACTAL_Z等。 format与type的数量需保持一致。 |
||
type |
列表 |
算子参数的类型。 取值范围:float16, float32, int8, int16, int32, uint8, uint16, bool等。
说明:
不同计算操作支持的数据类型不同,详细请参见接口参考。 format与type的数量需保持一致。 |
||
attr |
- |
列表 |
属性描述。 |
否 |
name |
字符串 |
算子属性参数的名称。 |
||
param_type |
字符串 |
参数类型:
未配置默认为required。 |
||
type |
字符串 |
算子参数的类型。 包含如下取值: int、bool、float、string、list_int、list_float等。 |
||
default_value |
- |
默认值 |
TensorFlow的原型定义文件(.txt)中内容可从TensorFlow开源社区获取,例如,Add算子的原型定义在TensorFlow开源社区中/tensorflow/core/ops/math_ops.cc文件中,在文件中搜索“Add”找到Add对应的原型定义,内容如下所示:
REGISTER_OP("Add") .Input("x: T") .Input("y: T") .Output("z: T") .Attr( "T: {bfloat16, half, float, double, uint8, int8, int16, int32, int64, " "complex64, complex128, string}") .SetShapeFn(shape_inference::BroadcastBinaryOpShapeFn);
将以上内容另存为**.txt文件。
每个**.txt文件仅能包含一个算子的原型定义。
自定义算子工程生成工具只解析算子类型、Input、Output、Attr中内容,其他内容可以不保存在**.txt中。
用户可从CANN软件安装后文件存储路径下的“toolkit/tools/msopgen/template”目录下获取模板文件Ascend_IR_Template.xlsx进行修改。请基于“Op”页签进行修改,“Op”页签可以定义多个算子,每个算子都包含如下参数:
列名称 |
含义 |
是否必选 |
---|---|---|
Op |
算子的Operator Type。 |
是 |
Classify |
算子相关参数的类别,包含:
|
是 |
Name |
算子参数的名称。 |
是 |
Type |
算子参数的类型。 包含如下取值: tensor、int、bool、float、ListInt、ListFloat等。 |
是 |
TypeRange |
针对类型为tensor的参数,需要配置tensor支持的类型。 包含如下取值: fp16,fp32,double,int8,int16,int32,int64,uint8,uint16,uint32,uint64,bool等。 框架为MindSpore时,需要将tensor的类型值转换为MindSpore所支持的值: I8_Default,I16_Default,I32_Default,I64_Default,U8_Default,U16_Default,U32_Default,U64_Default,BOOL_Default等。 |
否 |
Required |
是否必须输入,有如下取值:
|
是 |
Doc |
对应参数的描述。 |
否 |
Attr_Default_value |
属性的默认值。 |
否 |
Format |
针对类型为tensor的参数,配置为tensor支持的数据排布格式。 包含如下取值: ND,NHWC,NCHW,HWCN,NC1HWC0,FRACTAL_Z等。 |
否 |
Group |
算子分类。 |
否 |
配置示例如下所示:
预留行 |
||||||||
Op |
Classify |
Name |
Type |
TypeRange |
Required |
Doc |
Attr_Default_value |
Format |
Reshape |
INPUT |
x |
tensor |
fp16,fp32,double,int8,int16,int32,int64,uint8,uint16,uint32,uint64,bool |
TRUE |
- |
- |
ND |
INPUT |
shape |
tensor |
int32,int64 |
FALSE |
- |
- |
- |
|
DYNAMIC_OUTPUT |
y |
tensor |
fp16,fp32,double,int8,int16,int32,int64,uint8,uint16,uint32,uint64,bool |
FALSE |
- |
- |
ND |
|
ATTR |
axis |
int |
- |
FALSE |
- |
0 |
- |
|
ATTR |
num_axes |
int |
- |
FALSE |
- |
-1 |
- |
|
ReshapeD |
INPUT |
x |
tensor |
fp16,fp32,double,int8,int16,int32,int64,uint8,uint16,uint32,uint64,bool |
TRUE |
- |
- |
ND |
OUTPUT |
y |
tensor |
fp16,fp32,double,int8,int16,int32,int64,uint8,uint16,uint32,uint64,bool |
TRUE |
- |
- |
ND |
|
ATTR |
shape |
list_int |
- |
FALSE |
- |
{} |
- |
|
ATTR |
axis |
int |
- |
FALSE |
- |
0 |
- |
|
ATTR |
num_axes |
int |
- |
FALSE |
- |
-1 |
- |
进入msopgen工具所在目录执行如下命令,参数说明请参见表5。
./msopgen gen -i {operator define file} -f {framework type} -c {Compute Resource} -out {Output Path}
参数名称 |
参数描述 |
是否必选 |
---|---|---|
gen |
用于生成算子开发交付件。 |
是 |
-i, --input |
算子定义文件路径,可配置为绝对路径或者相对路径。工具执行用户需要有此路径的可读权限。 算子定义文件支持如下三种类型:
|
是 |
-f, --framework |
框架类型。
说明:
所有参数值大小写不敏感。 |
否 |
-c, --compute_unit |
算子使用的计算资源。
|
是 |
-out, --output |
生成文件所在路径,可配置为绝对路径或者相对路径,并且工具执行用户具有可读写权限。 若不配置,则默认生成在执行命令的当前路径。 |
否 |
-m, --mode |
生成交付件模式。
默认值:0。 |
否 |
-op, --operator |
此参数针对-i为算子IR定义文件的场景。 配置算子的类型,如:Conv2DTik。 若不配置此参数,当IR定义文件中存在多个算子时,工具会提示用户选择算子。 |
否 |
-lan, --language |
算子编码语言。
默认值:py。 |
否 |
示例:
使用IR_json.json模板作为输入创建原始框架为TensorFlow的算子工程。
./msopgen gen -i json_path/IR_json.json -f tf -c ai_core-{Soc Version} -out ./output_data
./msopgen gen -i json_path/IR_json.json -f tf -c aicpu -out ./output_data
├── build.sh //编译配置入口脚本 ├── cmake │ ├── config.cmake │ ├── util //算子工程编译所需脚本及公共编译文件存放目录 ├── CMakeLists.txt //算子工程的CMakeLists.txt ├── framework //算子插件实现文件目录,框架为“PYTORCH”的算子无需关注 │ ├── CMakeLists.txt │ ├── tf_plugin //原始框架类型为TensorFlow时生成的算子适配插件代码所在目录 │ └── tensorflow_conv2_d_plugin.cc //算子适配插件实现文件 │ └── CMakeLists.txt │ └── onnx_plugin //原始框架类型为ONNX时生成的算子适配插件代码所在目录 │ ├── CMakeLists.txt │ └── conv2_d_plugin.cc //算子适配插件实现文件 ├── op_proto //算子原型定义文件及CMakeLists文件所在目录 │ ├── conv2_d.h │ ├── conv2_d.cc │ ├── CMakeLists.txt ├── tbe │ ├── CMakeLists.txt │ ├── impl //算子代码实现文件目录 │ └── conv2_d.py //算子代码实现文件 │ ├── op_info_cfg //算子信息库文件目录 │ └── ai_core │ ├── {Soc Version} //昇腾AI处理器类型 │ ├── conv2_d.ini //算子信息库定义文件、 ├── op_tiling //算子tiling实现文件目录,不涉及tiling实现的算子无需关注 │ ├── CMakeLists.txt ├── scripts //自定义算子工程打包相关脚本所在目录
├── build.sh //编译配置入口脚本
├── cmake
│ ├── config.cmake
│ ├── util //算子工程编译所需脚本及公共编译文件存放目录
├── CMakeLists.txt //算子工程的CMakeList.txt
├── cpukernel
│ ├── CMakeLists.txt
│ ├── impl //算子代码实现文件目录
│ │ ├── conv2_d_kernels.cc
│ │ └── conv2_d_kernels.h
│ ├── op_info_cfg
│ │ └── aicpu_kernel
│ │ └── conv2_d.ini //算子信息库定义文件
│ └── toolchain.cmake
├── framework //算子插件实现文件目录,框架为“PYTORCH”的算子无需关注
│ ├── CMakeLists.txt
│ ├── tf_plugin //原始框架类型为TensorFlow时生成的算子适配插件代码所在目录
│ └── tensorflow_conv2_d_plugin.cc //算子适配插件实现文件
│ └── CMakeLists.txt
│ └── onnx_plugin //原始框架类型为ONNX时生成的算子适配插件代码所在目录
│ ├── CMakeLists.txt
│ └── conv2_d_plugin.cc //算子适配插件实现文件
├── op_proto //算子原型定义文件及CMakeList文件所在目录
│ ├── conv2_d.h
│ ├── conv2_d.cc
│ ├── CMakeLists.txt
├── op_tiling //算子tiling实现文件目录,不涉及tiling实现的算子无需关注
│ ├── CMakeLists.txt
├── scripts //自定义算子工程打包相关脚本所在目录
若需要在已存在的算子工程目录下追加其他自定义算子,命令行需配置“-m 1”参数。
进入msopgen工具所在目录执行如下命令。
TBE算子命令示例:
./msopgen gen -i json_path/**.json -f tf -c ai_core-{Soc Version} -out ./output_data -m 1
AI CPU算子命令示例:
./msopgen gen -i json_path/**.json -f tf -c aicpu -out ./output_data -m 1
在算子工程目录下追加**.json中的算子。MindSpore AICPU算子工程不能够添加非MindSpore框架的算子,也不能添加MindSpore TBE的算子。
msopgen工具其他参数说明可参考表6。