基于fallback形式下发算子
简介
GE提供了两种常规的模型调度模式(下沉调度和Host调度)用于实现Host和Device之间的高效协同。
下沉调度模式通常适用于静态shape模型,由于输入tensor shape固定不变,可以在编译阶段完成内存编排和Tiling计算,因此可以将模型中的算子以整图形式下发到Device上,执行时,只需在Host侧下发一个模型执行的Task即可触发模型在Device上调度执行,从而提升模型调度性能。
Host调度模式通常适用于动态shape模型,由于输入tensor的shape不确定,必须在上一个算子完成shape推导后,才能确定下一个算子的输入shape等信息,因此整个模型无法下沉执行,通常需要将每个算子Kernel逐一下发到Device执行。
基于fallback形式下发算子属于Host调度模式的一种,用户可以在Host侧通过fallback函数执行算子,例如可直接调用aclnnXX单算子API执行算子。用户仅需在算子开发过程中调用Ascend C的EnableFallBack接口,即可自动生成fallback函数供GE自动回调,fallback函数的主要任务就是将GE的输入输出及属性转换为aclnnXX单算子API所需的参数格式,然后调用aclnnXX接口执行算子。

适用场景
- 不支持离线推理场景,仅适用于训练或在线推理场景。
- 通常建议针对动态shape模型中的多Kernel算子启用fallback下发。主要原因是:
- 在静态shape场景下,aclnnXX接口包含Host操作,无法以整图形式下发,需要断图后以子图形式下发,这可能会对性能产生较大影响。
- 在极少数情况下,算子开发者为了实现算子的极致性能优化,开发了多Kernel算子(如昇腾内置的Matmul和MC²等算子)。这类算子对应多个Kernel实现,在执行时需要Launch多个Kernel。由于Kernel的数量不确定,GE无法按照上述常规方式统一处理,因此需要通过fallback方式下发算子。
- 对于单Kernel算子,启用fallback下发方式可能会导致性能下降。目前,基于Ascend C自定义算子工程自动生成的aclnnXX接口均为单Kernel算子API,因此不建议用户针对这些算子启用fallback下发。
产品支持情况
产品 |
是否支持 |
---|---|
|
√ |
|
√ |
|
× |
|
√ |
|
√ |
|
× |
实现原理
动态shape模型中多Kernel算子启用fallback下发的流程如图2所示。
fallback函数的主要任务是将GE的输入输出及属性转换为aclnn单算子API所需的参数格式,然后通过调用aclnnXX接口执行算子。以concat算子为例,fallback函数的格式为:
1
|
static graphStatus ConcatExecuteFunc(OpExecuteContext* host_api_ctx) |
OpExecuteContext指针入参中主要包含计算fallback所需的信息,例如输入输出的shape和datatype等,具体请参考OpExecuteContext类。
用户无需手动实现fallback函数,在算子原型注册过程中,只需调用EnableFallBack接口,系统将自动生成fallback函数并注册到GE。
使用指导
- 算子开发阶段,用户在算子原型注册过程中调用Ascend C的EnableFallBack接口,自动生成fallback函数:
1 2 3 4 5 6 7 8 9 10 11 12 13
class CustomOp : public OpDef { public: CustomOp(const char* name) : OpDef(name) { this->Input("x").ParamType(REQUIRED).DataType({ge::DT_FLOAT}).Format({ge::FORMAT_ND}); this->Input("y").ParamType(REQUIRED).DataType({ge::DT_FLOAT}).Format({ge::FORMAT_ND}); this->Output("z").ParamType(REQUIRED).DataType({ge::DT_FLOAT}).Format({ge::FORMAT_ND}) this->SetInferShape(ge::InferShapeFunc); this->SetInferDataType(ge::InferDataTypeFunc); this->AICore().AddConfig("ascendxxx"); this->EnableFallBack(); }; OP_ADD(CustomOp);
当前fallback函数支持support_aclnn和aclnn_only两种调用模式,可通过ExtendCfgInfo接口的aclnnSupport.value参数进行配置,详细可参见相关接口介绍。
- support_aclnn:此模式下,静态Shape场景中该算子通过模型下沉执行,动态Shape场景则在Host侧调用fallback函数下发算子。如果调用了EnableFallBack则默认采用该模式。
- aclnn_only:此模式下,动静态Shape场景中该算子均以fallback形式下发。不建议用户使用该模式,后续版本待废弃。
- 基于GE图模式进行训练或在线推理时,会自动回调fallback函数执行相关算子。
功能调试
support_aclnn模式下的关键日志:
[DEBUG] FE(723543,python3.x):2025-07-02-11:19:57.881.013 [op_setter.cc:425]724117 SetAclnnAttr:"[JudgeInsert][SetAclnnAttr] Node[ConcatV2, ConcatV2D] is support_aclnn op, set fallback attr." [DEBUG] GE(723543,python3.x):2025-07-02-11:19:58.769.010 [aclnn_node_converter.cc:180]723543 LoweringAclnnNode:Start lowering for aclnn node[ConcatV2, ConcatV2D].
aclnn_only模式下的关键日志:
[DEBUG] FE(1857670,python3.x):2025-07-02-11:18:40.860.955 [op_setter.cc:411]1858047 SetAclnnAttr:"[JudgeInsert][SetAclnnAttr] Node[MatMul_2/v2, MatMulV2] is aclnn_only op, set fallback attr." [DEBUG] GE(723543,python3.x):2025-07-02-11:19:58.767.078 [aclnn_node_converter.cc:180]723543 LoweringAclnnNode:Start lowering for aclnn node[MatMul_2/v2, MatMulV2].