文档首页 > > TBE自定义算子开发指南> 算子信息定义

算子信息定义

分享
更新时间:2020/07/23 GMT+08:00

原理

算子信息库作为算子开发的交付件之一,主要体现算子在昇腾AI处理器上的具体实现规格,包括算子支持输入输出dtype、format以及输入shape等信息。网络运行时,FE会根据算子信息库中的算子信息做基本校验,选择dtype,format等信息,并根据算子信息库中信息找到对应的算子实现文件进行编译,用于生成算子二进制文件。。

配置说明

算子开发者需要通过配置算子信息库文件,将算子在昇腾AI处理器上相关实现信息注册到算子信息库文件中。

算子信息库文件路径:在自定义算子工程目录下的/tbe/op_info_cfg/ai_core/<soc_version>/xx.ini

配置规则请参见表1

表1 算子信息库配置说明

信息

可选

说明

[OpType]

必选

算子OpType,以英文半角范括号,标识一个算子信息开始,与算子原型定义中REG_OP(OpType)的OpType保持一致。

input0.name

必选

输入tensor的名称,需要跟算子原型定义保持一致。

对于input0.paramType为dynamic时,只需要配置一个input0.name = x 即可,x 的名称需要与算子原型定义中的名称保持一致。在图运行时,会根据输入的个数自动生成x0、x1、x2……,序号依次递增。

input0.paramType

必选

定义第一个输入tensor的类型。

  • dynamic:表示该输入是动态个数,可能是1个,也可能是多个。,配合input0.name使用。

    若取值为dynamic,需要配合input0.name使用。

  • optional:表示该输入为可选,可以有1个,也可以不存在。
  • required:表示该输入有且仅有1个。

默认值为required。

input0.dtype

可选

定义输入tensor支持的数据类型。若支持多种数据类型,请以“,”分隔。

有如下取值范围:

float16, float, int8, int16, int32, uint8, uint16, uint32, bool等

注意:

  • 若算子输入支持多种规格,算子输入的dtype与format需要一一对应、按对应顺序进行配置,列出算子支持的所有dtype与format的组合,中间以“,”分隔。
    如下所示,input0.dtype与input0.format分别配置了12项。
    input0.dtype=float16,float16,float16,float16,float,float,float,float,int32,int32,int32,int32
    input0.format=NCHW,NC1HWC0,NHWC,ND,NCHW,NC1HWC0,NHWC,ND,NCHW,NC1HWC0,NHWC,ND
  • dynamicFormat.flag配置为true,则此字段不需要配置,但算子实现文件中需要实现op_select_format函数

input0.format

可选

定义第一个输入tensor的数据排布格式。

  • 若支持原图中的所有数据排布格式,定义为ND。
  • 若支持多种格式,格式之间以“,”分隔,格式的取值范围有以下几种:NCHW,NHWC,NC1HWC0,FRACTAL,ND等。

注意:

  • 若算子输入支持多种规格,算子输入的dtype与format的需要一一对应、按对应顺序进行配置,列出算子支持的所有dtype与format的组合,中间以“,”分隔。
  • dynamicFormat.flag配置为true,则此字段不需要配置,但算子实现文件中需要实现op_select_format函数
  • 若配置了op.pattern,则此字段不需要配置,FE会自动推导出format进行适配。

input0.reshapeType

可选

定义第一个输入支持的补维方法。

当算子的输入数据format要求为NC1HWC0,但原始网络中此算子的输入不满足4维时,需要配置此参数,将原始网络中不满足4维的shape补齐为4维,配置规则如下:

  • 如果原始网络中此算子输入为1维,则可将reshapeType配置为N、C、H、W,表示原图中此层的输入是N、C、H、W中的一维,其余维度补一。

    例如,原始网络中shape为[20],原始format为NHWC,如果reshapeType配置为N,则进行补维后shape变为[20,1,1,1]。

  • 如果原始网络中此算子输入为2维,如果原始format为NCHW,则可将reshapeType配置为NC、CH、HW、CW、NH、NW,表示原图中维度N、C、H、W中的两维(需保持原format维度的先后顺序),其余维度补一。例如配置为NC,原始shape是[20,30],则进行补维后shape变为[20,30,1,1];如果原始format为NHWC,那么可将reshapeType配置为NH、HW、WC、NW、NC、HC,因为补维不能改变维度的排布顺序,所以对于原始format为NHWC且原始维度是两维的情况,配置为CH是不合理的。
  • 如果原始网络中的此算子输入为3维,规则同2维,但高维度的reshapeType对于低维度也生效。

    例如,原始format为NCHW,如果reshapeType配置为NCH,当原始维度是1维的时候,则补齐后shape为[N,1,1,1];当原始维度是2维的时候,则补齐后shape为[N,C,1,1];当原始维度是3维的时候,补齐后shape为[N,C,H,1]。

  • 若原始网络中此算子输入shape为4维,则reshapeType配置不会生效。

若不配置此参数且算子输入format要求为NC1HWC0:

  • 当原始format是NCHW时,若原始shape为1维,则使用[1,C,1,1]进行补维;若原始shape为2维,则使用[1,C,H,1]进行补维;若原始shape为3维,则使用[1,C,H,W]进行补维。
  • 当原始format是NHWC时,若原始shape为1维,则使用[1,H,1,1]进行补维;若原始shape为2维,则使用[1,H,W,1]进行补维;若原始shape为3维,则使用[1,H,W,C]进行补维。

input0.shape

可选

定义input0支持的shape。

  • 固定shape。例如[56,56,56,56] ,多个shape可以用分号分割,例如:[3,5,6];[4,5,8,9]
  • 若不配置,表使用默认值all,表示支持所有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。

  • int:表示int类型
  • float:表示float类型
  • bool:表示bool类型
  • str:表示string类型
  • listInt:表示list Int类型
  • listFloat:表示list Float类型
  • listBool:表示list Bool类型
  • listStr:表示list String类型

attr_key.value

可选

该属性的取值范围。

all表示支持所有属性值。

若支持多种取值,用“,”分隔。

例如:1,3,5

此字段不影响编译,为可选字段,作用为TBE预编译时进行校验。

attr_key.paramType

可选

定义该参数是否在OpDesc中一定存在。

例如:量化和非量化两种不同的场景下,卷积算子的某些参数可能存在,也可能不存在。

有以下两种取值:

  • optional:参数可选,从OpDesc中取不到不报错。
  • required:参数必选,从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的类型。

  • dynamic:表示该输出是动态个数,可能是1个,也可能是多个。多个输出时,需要配合output0.name使用。
  • optional:表示该输出可选,可以有1个,也可以不存在。
  • required:表示该输出有且仅有1个。

默认值:required。

output0.dtype

可选

定义第一个输出tensor的数据类型。

注意:

  • 若算子输出支持多种规格,算子输出的dtype与format需要一一对应、按对应顺序进行配置,列出算子支持的所有dtype与format的组合,中间以“,”分隔。
    如下所示,output0.dtype与out0.format分别配置了12项。
    output0.dtype=float16,float16,float16,float16,float,float,float,float,int32,int32,int32,int32
    output0.format=NCHW,NC1HWC0,NHWC,ND,NCHW,NC1HWC0,NHWC,ND,NCHW,NC1HWC0,NHWC,ND
  • dynamicFormat.flag配置为true,则此字段不需要配置,但算子实现文件中需要实现op_select_format函数

output0.format

可选

定义第一个输出tensor的数据排布格式。

  • 若支持原图中的所有格式,则format取值为ND
  • 若支持多种格式,格式之间以“,”分隔,格式的取值范围有以下几种:NCHW,NHWC,NC1HWC0,FRACTAL,ND。

注意:

  • 若算子输出支持多种规格,算子输出的dtype与format需要一一对应、按对应顺序进行配置,列出算子支持的所有dtype与format的组合,中间以“,”分隔。
  • dynamicFormat.flag配置为true,则此字段不需要配置,但算子实现文件中需要实现op_select_format函数
  • 若配置了op.pattern,则此字段不需要配置,FE会自动推导出format进行适配。

output0.shape

可选

定义第一个输出output0支持的shape。

  • 固定shape。例如[56,56,56,56] ,多个shape可以用分号分割,例如:[3,5,6];[4,5,8,9]
  • 若不配置,表使用默认值all,表示支持所有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配置为“true”,则此字段不需要配置,会优先调用算子实现文件中的op_select_format函数获取算子支持的输入输出的dtype和format。
  • dynamicFormat.flag“false”,op.pattern在配置为以下几种值的情况下,算子不需要配置输入输出支持的format。
    • broadcast:针对具有broadcast能力的算子,FE根据算子当前的shape选出一组支持的format,然后使用这组format来做匹配。
    • reduce:针对reduce类的算子,FE根据算子的shape、keep_dims、axis信息选出一组支持的format,然后使用这组format来做匹配。
    • formatAgnostic:针对格式无关算子,例如,当算子为单输入和单输出且支持任意格式时(例如Cast算子),算子开发人员配置op.pattern为formatAgnostic即可,不再需要穷举输入输出的format。

dynamicFormat.flag

可选

默认值为“false”

如果配置为“true”,则忽略算子本身配置的输入输出的dtype和format,通过调用算子实现文件中的op_select_format函数获取算子支持的输入输出的dtype和format。

precision_reduce.flag

可选

此字段用于进行ATC模型转换或者进行网络调测时,控制算子的精度模式。只有当精度模式("precision_mode")配置为混合精度("allow_mix_precision")前提下生效。

  • 若配置为"false",则认为是黑名单,那么算子必须保持算子本身的原始数据类型。
  • 若配置为"true",则认为是白名单,那么如果算子即支持float32又支持float16数据类型,同时算子的原图格式是float32或者float16的情况下,优先为算子选择float16数据类型。
  • 若未配置这个字段,则认为是灰名单,那么算子在有上一个算子的情况下, 选择和上一个算子相同的数据类型,否则选择当前算子的原始数据类型。

heavyOp

可选

主要针对Cube类算子,将此标记设置为true后,会对此算子进行重型格式扩散,用于减少格式转换算子的插入,提升网络运行效率。

扩散逻辑如下,如果算子的某个输入或者输出的格式选择了如下格式中的一种(称之为重型格式):

NC1HWC0, C1HWNCoC0, FRACTAL_Z, FRACTAL_NZ, NDC1HWC0, FRACTAL_Z_3D, FRACTAL_Z_3D_TRANSPOSE

则沿着该输入或者输出递归地查找相连的算子,把该算子的格式也推导为重型格式,遇到下面三种情况则停止推导:

  • 扩散算子不支持当前算子选择的重型格式
  • 扩散算子已经选择了当前算子选择的重型格式
  • 扩散算子本身的heavyOp字段也为true

默认值为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函数实现

分享:

    相关文档

    相关产品

文档是否有解决您的问题?

提交成功!非常感谢您的反馈,我们会继续努力做到更好!
反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

智能客服提问云社区提问