TBE算子信息库
配置说明
算子开发者需要通过配置算子信息库文件,将算子在昇腾AI处理器上相关实现信息注册到算子信息库中。
算子信息库文件路径:自定义算子工程目录下的tbe/op_info_cfg/ai_core/${soc_version}/xx.ini。
${soc_version}:请配置为用户当前实际使用的昇腾AI处理器的型号。
配置规则请参见表1。需要注意,算子输入参数的顺序与个数、输出参数的顺序与个数,属性的顺序与个数需要与算子原型定义保持一致。
信息 |
可选/必选 |
说明 |
---|---|---|
[OpType] |
必选 |
算子OpType,以英文半角方括号包裹,标识一个算子信息开始,与算子原型定义中REG_OP(OpType)的OpType保持一致。 OpType命名规则请参见算子定义命名规则。 |
input0.name |
必选 |
第一个输入tensor的名称,需要跟算子原型定义保持一致。 对于input0.paramType为dynamic时,只需要配置一个input0.name = x 即可,x 的名称需要与算子原型定义中的名称保持一致。在图运行时,会根据输入的个数自动生成x0、x1、x2……,序号依次递增。 |
input0.paramType |
必选 |
定义第一个输入tensor的类型。
默认值为required。 |
input0.dtype |
可选 |
定义输入tensor支持的数据类型。若支持多种数据类型,请以“,”分隔。 有如下取值范围: float16,float,float32,int8,int16,int32,uint8,uint16,uint32,bool等 注意:
须知:
input0.dtype的优先级高于dynamicFormat,若既配置了input0.dtype,又设置了dynamicFormat.flag为true,则以input0.dtype为准。 建议用户根据dtype的推导方式选择input0.dtype、 dynamicFormat中的一项配置即可。 |
input0.format |
可选 |
定义第一个输入tensor的数据排布格式。
注意:
须知:
三个format相关配置项的优先级为: input0.format > dynamicFormat > op.pattern 即若同时配置了input0.format、dynamicFormat.flag为true与op.pattern,以input0.format为准。 建议用户根据format的推导方式选择input0.format、 dynamicFormat、 op.pattern中的一项配置即可。 |
input0.reshapeType |
可选 |
定义第一个输入支持的补维方法。 当算子的输入数据format要求为NC1HWC0,但原始网络中此算子的输入不满足4维时,需要配置此参数,将原始网络中不满足4维的shape补齐为4维,配置规则如下:
若不配置此参数且算子输入format要求为NC1HWC0:
|
input1.name |
可选 |
若算子有多个输入tensor,此处请参照input0.xx的参数配置增加对应的input1.xx,input2.xx的配置,序号分别从input1,input2,input3递增。 输入tensor的名称需要跟算子原型定义保持一致。 |
…… |
可选 |
input1的其他输入参数配置,参考input0;若算子有其他输入例如input2、input3……,配置也同理参考input0。
须知:
若配置了算子输入的dtype与format,所有输入的dtype与format个数需要相同,并且需要一一对应、按对应顺序进行配置,中间以“,”分隔。 |
attr.list |
可选 |
定义算子实现时需要使用到的算子属性列表,多个属性之间用英文半角逗号分割,此处属性的顺序需要与算子声明中属性的顺序保持一致。 此列表用于FE从OpDesc中获取对应的属性。 例如:stride,padding 注:若算子实现中需要使用相关属性,则此参数需要配置,否则编译失败。 |
attr_key.type |
- |
若配置了attr.list,则此参数需要配置,否则编译失败。 此参数表示定义其中一个属性的类型,attr是固定前缀,key对应具体参数。此字段需要与attr.list中列出的属性相对应,attr.list中列出了多少属性,需要配置多少条attr_key.type。 type支持的如下取值:
|
attr_key.value |
- |
若配置了attr.list,则此参数需要配置,否则编译失败。 代表相应属性的取值范围。 |
attr_key.paramType |
可选 |
定义该参数是否在OpDesc中一定存在。 例如:量化和非量化两种不同的场景下,卷积算子的某些参数可能存在,也可能不存在。 有以下两种取值:
默认值为required。 |
attr_key.defaultValue |
可选 |
对于attr_key.paramType为optional时,此参数为必选参数,如果从OpDesc中获取参数值失败,从这里获取默认值。 注意:
|
output0.name |
必选 |
定义第一个输出tensor的名称。 对于output0.paramType为dynamic时,只需要配置一个output0.name=y 即可,y 的名称需要与算子原型定义中的名称保持一致。在图运行时,会根据输出的个数自动生成y0、y1、y2……,序号依次递增。 |
output0.paramType |
可选 |
定义第一个输出tensor的类型。
默认值:required。 |
output0.dtype |
可选 |
定义第一个输出tensor的数据类型。 注意:
须知:
output0.dtype的优先级高于dynamicFormat,若既配置了output0.dtype,又设置了dynamicFormat.flag为true,则以output0.dtype为准。 建议用户根据dtype的推导方式选择output0.dtype、 dynamicFormat中的一项配置即可。 |
output0.format |
可选 |
定义第一个输出tensor的数据排布格式。
注意:
须知:
三个format配置项的优先级为: output0.format > dynamicFormat > op.pattern 即若同时配置了output0.format、dynamicFormat.flag为true、op.pattern,以output0.format为准。 建议用户根据format的推导方式选择output0.format、 dynamicFormat、 op.pattern中的一项配置即可。 |
output1.name |
可选 |
若算子有多个输出tensor,此处请参照output0.xx的参数配置增加对应的output1.xx,output.xx的配置,序号分别从output1,output2递增。 |
opFile.value |
可选 |
定义算子实现文件名称,FE根据此文件名称查找到算子的实现文件。 若不配置此字段,则根据OpType字段,将名称中的大写字母转换为“_”去匹配算子实现文件名称,匹配规则请参见算子定义命名规则。 |
opInterface.value |
可选 |
定义算子实现接口名称,FE根据此接口名称进行算子的调用。 若不配置此字段,则根据OpType字段,将名称中的大写字母转换为“_”去匹配算子接口名称,匹配规则请参见算子定义命名规则。 |
op.pattern |
可选 |
op.pattern在配置为以下几种值的情况下,算子不需要配置输入输出支持的format。
须知:
op.pattern的优先级低于inputx.format/outputx.format与dynamicFormat,即若配置了输入/输出format配置列表,或者dynamicFormat.flag配置为“true”,则op.pattern配置项不生效,亦无需配置。 |
dynamicFormat.flag |
可选 |
默认值为“false”。 如果配置为“true”,表示通过调用算子实现文件中的op_select_format函数获取算子支持的输入输出的dtype和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。 |
needCheckSupport.flag |
可选 |
标记是否在算子融合阶段调用算子实现文件中的check_supported接口进行data type与shape的校验。
默认值为false。 |
配置示例如下:
[Upsample] input0.name=x input0.paramType=required input0.dtype=float16,float input0.format=NC1HWC0,NC1HWC0 attr.list=scale,stride_h,stride_w attr_scale.type=float attr_scale.value=all attr_scale.defaultValue=1 attr_scale.paramType=optional attr_stride_h.type=int attr_stride_h.value=all attr_stride_h.defaultValue=2 attr_stride_h.paramType=optional attr_stride_w.type=int attr_stride_w.value=all attr_stride_w.defaultValue=2 attr_stride_w.paramType=optional output0.name=y output0.paramType=required output0.dtype=float16,float output0.format=NC1HWC0,NC1HWC0
自定义算子信息库文件编译部署完成后,会将算子相关定义信息存入对应昇腾AI处理器版本的算子信息库中,存储路径为:<path>/<vendor_name>/op_impl/ai_core/tbe/config/${soc_version}/aic-${soc_version}-ops-info.json,其中<path>为算子包的安装目录,详细可参见算子包部署,<vendor_name>为提供自定义算子的厂商名字,关于此名字的定义,详细可参见算子工程编译。
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" } }
实现样例可参见(可选)Format推导及参数校验。
check_supported函数
若needCheckSupport.flag配置为true,则算子融合阶段会调用算子实现文件中的check_supported接口进行相关信息的校验。
check_supported函数的声明如下所示:
def check_supported(input_x1, input_x2, output_y, attribute1=None, attribute2=None,..., kernel_name="xx"):
check_supported函数的入参和算子接口函数保持一致(即算子的输入、输出、属性及kernel_name)。
若校验成功,则返回True;若校验失败,则返回False。
实现样例可参见check_supported函数实现。