融合规则设计
明确融合方案
我们以多对一融合规则DecodeBboxV2ScopeFusionPass为例介绍如何设计和开发Scope融合规则。
该融合规则的目标是把Decode scope下的所有小算子融合为一个大算子DecodeBboxV2,Scope内包括2个Exp算子/4个Mul算子/4个Sub算子/2的倍数个RealDiv算子/2个Unpack算子/1个Pack算子/3个Transpose算子/不能包括Softmax算子,如图1所示。
明确融合算子原型
DecodeBboxV2融合算子原型为:
算子原型API可以参考《Ascend Graph开发指南》的"参考-> Ascend Graph接口参考 -> 原型定义接口"。
REG_OP(DecodeBboxV2) .INPUT(boxes, TensorType({DT_FLOAT16,DT_FLOAT})) .INPUT(anchors, TensorType({DT_FLOAT16,DT_FLOAT})) .OUTPUT(y, TensorType({DT_FLOAT16,DT_FLOAT})) .ATTR(scales, ListFloat, {1.0, 1.0, 1.0, 1.0}) .ATTR(decode_clip, Float, 0.0) .ATTR(reversed_box, Bool, false) .OP_END_FACTORY_REG(DecodeBboxV2)
明确融合对应关系
如图1所示,
- transpose的第0个输入作为DecodeBboxV2的第0个输入boxes;
- get_center_coordinates_and_sizes/transpose的第0个输入作为DecodeBboxV2的第1个输入anchors;
- transpose_1的输出作为DecodeBboxV2的输出y。
父主题: 融合规则开发