算子信息定义
原理
算子信息库作为算子开发的交付件之一,主要体现算子在昇腾AI处理器上的具体实现规格,包括算子支持输入输出dtype、format以及输入shape等信息。网络运行时,FE会根据算子信息库中的算子信息做基本校验,选择dtype,format等信息,并根据算子信息库中信息找到对应的算子实现文件进行编译,用于生成算子二进制文件。。
配置说明
算子开发者需要通过配置算子信息库文件,将算子在昇腾AI处理器上相关实现信息注册到算子信息库文件中。
算子信息库文件路径:在自定义算子工程目录下的/tbe/op_info_cfg/ai_core/<soc_version>/xx.ini。
配置规则请参见表1。
信息 |
可选 |
说明 |
[OpType] |
必选 |
算子OpType,以英文半角范括号,标识一个算子信息开始,与算子原型定义中REG_OP(OpType)的OpType保持一致。 |
input0.name |
必选 |
输入tensor的名称,需要跟算子原型定义保持一致。 对于input0.paramType为dynamic时,只需要配置一个input0.name = x 即可,x 的名称需要与算子原型定义中的名称保持一致。在图运行时,会根据输入的个数自动生成x0、x1、x2……,序号依次递增。 |
input0.paramType |
必选 |
定义第一个输入tensor的类型。
默认值为required。 |
input0.dtype |
可选 |
定义输入tensor支持的数据类型。若支持多种数据类型,请以“,”分隔。 有如下取值范围: float16, float, int8, int16, int32, uint8, uint16, uint32, bool等 注意:
|
input0.format |
可选 |
定义第一个输入tensor的数据排布格式。
注意:
|
input0.reshapeType |
可选 |
定义第一个输入支持的补维方法。 当算子的输入数据format要求为NC1HWC0,但原始网络中此算子的输入不满足4维时,需要配置此参数,将原始网络中不满足4维的shape补齐为4维,配置规则如下:
若不配置此参数且算子输入format要求为NC1HWC0:
|
input0.shape |
可选 |
定义input0支持的shape。
|
input1.name |
可选 |
若算子有多个输入tensor,此处请参照input0.xx的参数配置增加对应的input1.xx,input2.xx的配置,序号分别从input1,input2,input3递增。 输入tensor的名称需要跟算子原型定义保持一致。 |
…… |
可选 |
input1的其他输入参数配置,参考input0;若算子有其他输入例如input2、input3……,配置也同理参考input0。 |
attr.list |
可选 |
定义算子实现时需要使用到的算子属性列表,多个属性之间用英文半角逗号分割,此处属性的顺序需要与算子声明中属性的顺序保持一致。 此列表用于FE从OpDesc中获取对应的属性。 例如:stride,padding 注:若算子实现中需要使用相关属性,则此参数需要配置,否则编译失败。 |
attr_key.type |
可选 |
定义其中一个属性的类型,attr是固定前缀,key对应具体参数,如: attr_stride.type=int表示stride参数的type属性为int类型,用于标识从OpDesc取算子属性的方式为GetInt。 此字段需要与attr.list中列出的属性相对应,attr.list中列出了多少属性,需要配置多少条attr_key.type。
|
attr_key.value |
可选 |
该属性的取值范围。 all表示支持所有属性值。 若支持多种取值,用“,”分隔。 例如:1,3,5 此字段不影响编译,为可选字段,作用为TBE预编译时进行校验。 |
attr_key.paramType |
可选 |
定义该参数是否在OpDesc中一定存在。 例如:量化和非量化两种不同的场景下,卷积算子的某些参数可能存在,也可能不存在。 有以下两种取值:
默认值为required。 |
attr_key.defaultValue |
可选 |
对于attr_key.paramType为optional时,如果从OpDesc中获取参数值失败,从这里获取默认值。 注意: 当attr_key.paramType为required时,该参数无效;当attr_key.paramType为optional时,如果OpDesc中获取失败,defaultValue也未定义,则返回失败。 |
output0.name |
必选 |
定义第一个输出tensor的名称。 对于output0.paramType为dynamic时,只需要配置一个output0.name=y 即可,y 的名称需要与算子原型定义中的名称保持一致。在图运行时,会根据输出的个数自动生成y0、y1、y2……,序号依次递增。 |
output0.paramType |
可选 |
定义第一个输出tensor的类型。
默认值:required。 |
output0.dtype |
可选 |
定义第一个输出tensor的数据类型。 注意:
|
output0.format |
可选 |
定义第一个输出tensor的数据排布格式。
注意:
|
output0.shape |
可选 |
定义第一个输出output0支持的shape。
|
output1.name |
可选 |
若算子有多个输出tensor,此处请参照output0.xx的参数配置增加对应的output1.xx,output.xx的配置,序号分别从output1,output2递增。 |
opFile.value |
可选 |
定义算子实现文件名称,FE根据此文件名称查找到算子的实现文件。 若不配置此字段,则根据OpType字段,将名称中的大写字母转换为“_”去匹配算子实现文件名称,匹配规则请参见1。 |
opInterface.value |
可选 |
定义算子实现接口名称,FE根据此接口名称进行算子的调用。 若不配置此字段,则根据OpType字段,将名称中的大写字母转换为“_”去匹配算子接口名称,匹配规则请参见1。 |
op.pattern |
可选 |
定义算子是否属于broadcast类算子/reduce算子/formatAgnostic算子这三种算子类型
|
dynamicFormat.flag |
可选 |
默认值为“false”。 如果配置为“true”,则忽略算子本身配置的输入输出的dtype和format,通过调用算子实现文件中的op_select_format函数获取算子支持的输入输出的dtype和format。 |
precision_reduce.flag |
可选 |
此字段用于进行ATC模型转换或者进行网络调测时,控制算子的精度模式。只有当精度模式("precision_mode")配置为混合精度("allow_mix_precision")前提下生效。
|
heavyOp |
可选 |
主要针对Cube类算子,将此标记设置为true后,会对此算子进行重型格式扩散,用于减少格式转换算子的插入,提升网络运行效率。 扩散逻辑如下,如果算子的某个输入或者输出的格式选择了如下格式中的一种(称之为重型格式): NC1HWC0, C1HWNCoC0, FRACTAL_Z, FRACTAL_NZ, NDC1HWC0, FRACTAL_Z_3D, FRACTAL_Z_3D_TRANSPOSE 则沿着该输入或者输出递归地查找相连的算子,把该算子的格式也推导为重型格式,遇到下面三种情况则停止推导:
默认值为false。 |
自定义算子信息库文件编译部署完成后,会将算子相关定义信息存入对应昇腾AI处理器版本的算子信息库中,默认存储路径为opp安装目录下的:opp/op_impl/custom/ai_core/tbe/config/<soc_version>/aic-<soc_version>-ops-info.json。
op_select_format函数
若dynamicFormat.flag配置为true,算子信息库文件中无需配置算子输入输出支持的dtype与format,但需要在算子实现文件(*.py)中实现op_select_format函数,推导算子的输入输出支持的dtype和format。
op_select_format的定义如下所示:
def op_select_format(input, output, attr, kernel_name="xx"):
op_select_format函数的入参和算子接口保持一致(即算子的输入、输出、属性及kernel_name),出参为包含了当前算子输入输出支持的format和dtype列表的字符串,字符串的格式如下:
{ "input0": { "name": "x", "dtype": "float16,float16,int8,int8", "format": "NC1HWC0_C04,NC1HWC0,NC1HWC0_C04,NC1HWC0" }, "input1": { "name": "y", "dtype": "float16,float16,int8,int8", "format": "FRACTAL_Z_C04,FRACTAL_Z,FRACTAL_Z_C04,FRACTAL_Z" }, "output0": { "name": "z", "dtype": "float16,float16,int32,int32", "format": "NC1HWC0,NC1HWC0,NC1HWC0,NC1HWC0" } }
实现样例可参见(可选)op_select_format函数实现。
