昇腾社区首页
中文
注册

基于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接口执行算子。

图1 常规Host调度模式和fallback下发的对比

适用场景

  • 不支持离线推理场景,仅适用于训练或在线推理场景。
  • 通常建议针对动态shape模型中的多Kernel算子启用fallback下发。主要原因是:
    • 在静态shape场景下,aclnnXX接口包含Host操作,无法以整图形式下发,需要断图后以子图形式下发,这可能会对性能产生较大影响。
    • 在极少数情况下,算子开发者为了实现算子的极致性能优化,开发了多Kernel算子(如昇腾内置的Matmul和MC²等算子)。这类算子对应多个Kernel实现,在执行时需要Launch多个Kernel。由于Kernel的数量不确定,GE无法按照上述常规方式统一处理,因此需要通过fallback方式下发算子。
    • 对于单Kernel算子,启用fallback下发方式可能会导致性能下降。目前,基于Ascend C自定义算子工程自动生成的aclnnXX接口均为单Kernel算子API,因此不建议用户针对这些算子启用fallback下发。

产品支持情况

产品

是否支持

Atlas A3 训练系列产品 / Atlas A3 推理系列产品

Atlas A2 训练系列产品 / Atlas 800I A2 推理产品 /A200I A2 Box 异构组件

Atlas 200I/500 A2 推理产品

×

Atlas 推理系列产品

Atlas 训练系列产品

Atlas 200/300/500 推理产品

×

实现原理

动态shape模型中多Kernel算子启用fallback下发的流程如图2所示。

图2 动态shape模型中的多Kernel算子下发执行流程

fallback函数的主要任务是将GE的输入输出及属性转换为aclnn单算子API所需的参数格式,然后通过调用aclnnXX接口执行算子。以concat算子为例,fallback函数的格式为:

1
static graphStatus ConcatExecuteFunc(OpExecuteContext* host_api_ctx)

OpExecuteContext指针入参中主要包含计算fallback所需的信息,例如输入输出的shape和datatype等,具体请参考OpExecuteContext类

用户无需手动实现fallback函数,在算子原型注册过程中,只需调用EnableFallBack接口,系统将自动生成fallback函数并注册到GE。

使用指导

  1. 算子开发阶段,用户在算子原型注册过程中调用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形式下发。不建议用户使用该模式,后续版本待废弃。
  2. 基于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].