什么是算子原型
本节介绍算子原型的概念以及获取方式。
什么是算子原型
算子原型规定了在昇腾AI处理器上可运行算子的约束,主要体现算子的数学含义,包含定义算子输入、输出、属性。
在算子开发阶段,会使用REG_OP宏,以“.”链接INPUT、OUTPUT、ATTR等接口注册算子的输入、输出和属性信息,最终以OP_END_FACTORY_REG接口结束,完成算子的注册。注册代码实现如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 |
namespace ge{ REG_OP(OpType) //算子类型名称 .INPUT(x1, TensorType({ DT_FLOAT, DT_INT32 })) .INPUT(x2, TensorType({ DT_FLOAT, DT_INT32 })) .DYNAMIC_INPUT(x, TensorType{DT_FLOAT, DT_INT32}) .OPTIONAL_INPUT(b, TensorType{DT_FLOAT}) .OUTPUT(y, TensorType({ DT_FLOAT, DT_INT32 })) .DYNAMIC_OUTPUT(y, TensorType{DT_FLOAT, DT_INT32}) .ATTR(x, Type, DefaultValue) .REQUIRED_ATTR(x, Type) .OP_END_FACTORY_REG(OpType) } |
- REG_OP(OpType)
OpType:注册到昇腾AI处理器的自定义算子库的算子类型。
- INPUT(x1, TensorType({ DT_FLOAT,DT_UINT8,... }))
注册算子的输入信息。
- x:宏参数,算子的输入名称。
- TensorType({ DT_FLOAT,DT_UINT8,... }):“{ }”中为此输入支持的数据类型的列表。
若算子有多个输入,每个输入需要使用一条INPUT(x, TensorType({ DT_FLOAT,DT_UINT8,... }))语句进行描述。
- DYNAMIC_INPUT(x, TensorType{DT_FLOAT, DT_INT32, ...})
算子为动态多输入场景下的输入信息注册。
- x:宏参数,算子的输入名称,图运行时,会根据输入的个数自动生成x0、x1、x2……,序号依次递增。
- TensorType({ DT_FLOAT,DT_UINT8,... }):“{ }”中为此输入支持的数据类型的列表。
- OPTIONAL_INPUT(x, TensorType{DT_FLOAT, ...})
若算子输入为可选输入,可使用此接口进行算子输入的注册。
- x:宏参数,算子输入的名称。
- TensorType{DT_FLOAT, ...}:“{ }”中为此输入支持的数据类型的列表。
- OUTPUT(y, TensorType({ DT_FLOAT,DT_UINT8,... }))
注册算子的输出信息。
- y:宏参数,算子的输出名称。
- TensorType({ DT_FLOAT,DT_UINT8,... }):“{ }”中为此输出支持的数据类型的列表。
若算子有多个输出,每个输出需要使用一条OUTPUT(x, TensorType({ DT_FLOAT,DT_UINT8,... }))语句进行注册。
- DYNAMIC_OUTPUT(y, TensorType{DT_FLOAT, DT_INT32})
- ATTR(x, Type,DefaultValue)
注册算子的属性,包括算子的属性名称,属性类型以及属性值的默认值,当开发者不设置算子对象的属性值时使用默认值。
例如:ATTR(mode, Int, 1),注册属性mode,属性类型为int64_t,默认值为1。
若算子有多个属性,每个属性需要使用一条ATTR(x, Type,DefaultValue)语句或者REQUIRED_ATTR(x, Type)语句进行注册。
- REQUIRED_ATTR(x, Type)
注册算子的属性,包括算子的属性名称与属性类型,无默认值,开发者必须设置算子对象的属性值。
若算子有多个属性,每个属性需要使用一条ATTR(x, Type,DefaultValue)语句或者REQUIRED_ATTR(x, Type)语句进行注册。
- OP_END_FACTORY_REG(OpType):结束算子注册。OpType与REG_OP(OpType)中的OpType保持一致。
如何获取算子原型
在模型构建时,用户需要了解算子原型,包括输入、输出和属性信息,从而创建算子实例,构建自己的Graph。
- 对于用户自定义算子,请自行获取自定义算子的算子原型定义头文件,了解算子的原型定义。
从“Ascend-cann-toolkit安装目录/ascend-toolkit/latest/opp/vendors/<vendor_name>/op_proto/inc”算子原型定义的头文件中获取,例如:
1 2 3 4 5 6
REG_OP(SubMConv3dCube) .INPUT(x, TensorType({DT_FLOAT16})) .INPUT(filter, TensorType({DT_FLOAT16})) .OUTPUT(y, TensorType({DT_FLOAT16})) .ATTR(is_first, Bool, false) .OP_END_FACTORY_REG(SubMConv3dCube)
- 对于内置算子,用户可以通过如下两种方式获取算子原型:
- 从《算子清单》获取,如图1所示。
- 从“Ascend-cann-toolkit安装目录/ascend-toolkit/latest/opp/built-in/op_proto/inc”算子原型定义的头文件中获取,例如:
REG_OP(SoftmaxV2) .INPUT(x, TensorType({ DT_DOUBLE, DT_FLOAT16, DT_BF16, DT_FLOAT })) .OUTPUT(y, TensorType({ DT_DOUBLE, DT_FLOAT16, DT_BF16, DT_FLOAT })) .ATTR(axes, ListInt, {-1}) .ATTR(half_to_float, Bool, false) .OP_END_FACTORY_REG(SoftmaxV2)
父主题: 通过算子原型构建Graph