MindSpore框架自定义算子工程生成工具目前只支持昇腾910 AI处理器。
原始框架类型为MindSpore的算子,自定义算子工程生成工具可根据原型定义文件输出算子开发相关交付件,包括算子实现和算子信息文件、算子原语文件。
工具所在目录:CANN软件安装后文件存储路径下的“python/site-packages/bin”。
CANN组合包提供进程级环境变量设置脚本,供用户在进程中引用,以自动完成环境变量设置。执行命令参考如下,以下示例均为root或非root用户默认安装路径,请以实际安装路径为准。
# 以root用户安装toolkit包 . /usr/local/Ascend/ascend-toolkit/set_env.sh # 以非root用户安装toolkit包 . ${HOME}/Ascend/ascend-toolkit/set_env.sh
pip3 install xlrd==1.2.0
工具输入为IR原型定义Excel文件时,需要安装xlrd依赖。
自定义算子工程生成工具支持输入三种类型文件创建算子工程,分别为:
MindSpore算子工程创建支持以TensorFlow框架原型定义文件做为输入。
请用户选择一种文件完成输入文件的准备工作。
MS_json.json进行修改,其参数配置说明请参见表1:
配置字段 |
类型 |
含义 |
是否必选 |
|
---|---|---|---|---|
op |
- |
字符串 |
算子的Operator Type。 |
是 |
input_desc |
- |
列表 |
输入参数描述。 |
否 |
name |
字符串 |
算子输入参数的名称。 |
||
param_type |
字符串 |
参数类型:
未配置默认为required |
||
type |
列表 |
算子参数的类型。 包含如下取值: I8_Default,I16_Default,I32_Default,I64_Default,U8_Default,U16_Default,U32_Default,U64_Default,BOOL_Default等。 |
||
output_desc |
- |
列表 |
输出参数描述。 |
是 |
name |
字符串 |
算子输出参数的名称。 |
||
param_type |
字符串 |
参数类型:
未配置默认为required |
||
type |
列表 |
算子参数的类型。 包含如下取值: I8_Default,I16_Default,I32_Default,I64_Default,U8_Default,U16_Default,U32_Default,U64_Default,BOOL_Default等。 |
||
attr |
- |
列表 |
属性描述。 |
否 |
name |
字符串 |
算子属性参数的名称。 |
||
param_type |
字符串 |
参数类型:
未配置默认为required |
||
type |
字符串 |
算子参数的类型。 包含如下取值: I8_Default,I16_Default,I32_Default,I64_Default,U8_Default,U16_Default,U32_Default,U64_Default,BOOL_Default等。 |
||
default_value |
- |
默认值。 |
json文件可以配置多个算子,json文件为列表,列表中每一个元素为一个算子。
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 |
Classify |
Name |
Type |
TypeRange |
Required |
Doc |
Attr_Default_value |
Format |
Reshape |
INPUT |
x |
tensor |
I8_Default,I16_Default,I32_Default,I64_Default,U8_Default,U16_Default,U32_Default,U64_Default,BOOL_Default |
TRUE |
- |
- |
ND |
INPUT |
shape |
tensor |
I32_Default,I64_Default |
FALSE |
- |
- |
- |
|
DYNAMIC_OUTPUT |
y |
tensor |
I8_Default,I16_Default,I32_Default,I64_Default,U8_Default,U16_Default,U32_Default,U64_Default,BOOL_Default |
FALSE |
- |
- |
ND |
|
ATTR |
axis |
int |
- |
FALSE |
- |
0 |
- |
|
ATTR |
num_axes |
int |
- |
FALSE |
- |
-1 |
- |
|
ReshapeD |
INPUT |
x |
tensor |
I8_Default,I16_Default,I32_Default,I64_Default,U8_Default,U16_Default,U32_Default,U64_Default,BOOL_Default |
TRUE |
- |
- |
ND |
OUTPUT |
y |
tensor |
I8_Default,I16_Default,I32_Default,I64_Default,U8_Default,U16_Default,U32_Default,U64_Default,BOOL_Default |
TRUE |
- |
- |
ND |
|
ATTR |
shape |
list_int |
- |
FALSE |
- |
{} |
- |
|
ATTR |
axis |
int |
- |
FALSE |
- |
0 |
- |
|
ATTR |
num_axes |
int |
- |
FALSE |
- |
-1 |
- |
若TypeRange中包含MindSpore不支持的类型时,则会出现告警。
进入msopgen工具所在目录执行如下命令,参数说明请参见表3。
./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定义文件中存在多个算子时,工具会提示用户选择算子。 |
否 |
示例:
使用MS_json.json模板作为输入创建MindSpore框架适配Ascend910处理器的算子工程。
AI CPU算子执行命令示例:
./msopgen gen -i json_path/MS_json.json -f ms -c aicpu -out ./output_data
-i 参数请输入MS_json.json实际绝对路径或相对路径。
例如:"${INSTALL_DIR}/toolkit/python/site-packages/op_gen/json_template/MS_json.json"
算子工程目录生成在 -out 所指定的目录下:./output_data。
TBE算子工程目录结构如下所示:
|——mindspore |——impl |--xx_impl.py //实现算子和注册算子信息 py文件 |——op_proto |--xx.py //算子原语py文件
AI CPU算子工程目录结构如下所示:
├── cpukernel │ ├── CMakeLists.txt │ ├── impl //算子代码实现文件目录 │ │ ├── xx_kernels.cc │ │ └── xx_kernels.h │ ├── op_info_cfg │ │ └── aicpu_kernel │ │ └── xx.ini //算子信息库定义文件 │ └── toolchain.cmake ├── framework //算子插件实现文件目录 │ ├──mindspore //原始框架类型为MindSpore时生成的算子适配插件代码所在目录 │ └── impl │ │ └── xx_impl.py //实现算子和注册算子信息py文件 │ └── op_proto │ │ └── xx.py //算子原语py文件 ├── op_proto //算子原型定义文件及CMakeList文件所在目录 │ ├── xx.h │ ├── xx.cc │ ├── CMakeLists.txt ├── scripts //自定义算子工程打包相关脚本所在目录
若需要在已存在的算子工程目录下追加其他自定义算子,请按照1准备输入文件**.json,并以**.json为输入。MindSpore AICPU算子工程不能够追加非MindSpore框架的算子,因为生成的交付件不同,也不能追加MindSpore TBE算子。再次执行此工具时添加“-m 1”参数,进入msopgen工具所在目录执行如下命令:
./msopgen gen -i json_path/**.json -f ms -c ai_core-ascend910 -out ./output_data -m 1
TensorFlow |
MindSpore |
---|---|
DT_FLOAT/float |
不支持 |
DT_HALF/half |
不支持 |
DT_BFLOAT16/bfloat16 |
不支持 |
DT_DOUBLE/double |
不支持 |
DT_INT8/int8 |
I8_Default |
DT_INT16/int16 |
I16_Default |
DT_INT32/int32 |
I32_Default |
DT_INT64/int64 |
I64_Default |
DT_UINT8/uint8 |
U8_Default |
DT_UINT16/uint16 |
U16_Default |
DT_UINT32/uint32 |
U32_Default |
DT_UINT64/uint64 |
U64_Default |
DT_QINT8/qint8 |
不支持 |
DT_QINT16/qint16 |
不支持 |
DT_QINT32/qint32 |
不支持 |
DT_QUINT8/quint8 |
不支持 |
DT_QUINT16/quint16 |
不支持 |
DT_COMPLEX64/complex64 |
不支持 |
DT_COMPLEX128/complex128 |
不支持 |
DT_STRING/string |
不支持 |
DT_RESOURCE/resource |
不支持 |
DT_VARIANT/variant |
不支持 |
DT_BOOL/bool |
BOOL_Default |
float16 |
F16_Default |
float32 |
F32_Default |
float64 |
F64_Default |