已关闭
【FusedInferAttention算子】解除arch35上FIA与IFA/PFA的依赖 #4066
jiang-lirui创建于 8月1日关闭于 8月1日
8月1日 修改了issue 的描述
8月1日 修改了issue 的描述
8月1日 关联了pull request:解除arch35上FIA与IFA/PFA的依赖
weihao18
8月1日 评论:
8月1日 评论:
/assign @jiang-lirui


8月1日 将 jiang-lirui 设为负责人
8月1日 关闭了 issue
8月1日 添加了label:resolved
结果:arch35 FIA 彻底与 IFA/PFA 脱钩
0. 结论
7 个 Phase 全部完成。arch35 上 FIA/QFA 已彻底与 IFA/PFA 脱钩,PFA/IFA 的 arch35 目录已删除,3 个测试用例运行时验证通过:
fia_arch35_template_tiling_key_enum.hop_kernel/arch35/目录op_kernel/arch35/目录运行时验证
test.py::test_flash_attention)669253888fia_fullquant_gqa_debug)35658141957fia_fullquant_mxfp8_debug)36190821378编译命令:
bash build.sh --pkg --ops="fused_infer_attention_score" --soc=ascend950 -j16 \ --tiling_key="3840;4424990720;73664512;753146882;799277828;669253888;35658141957;36190821378"1. PFA/IFA 在 arch35 上的拦截现状
1.1 PFA — op_api 层硬拦截
PFA V1/V2/V3 共 6 个入口点全部在 op_api 层拦截 DAV_3510:
aclnn_prompt_flash_attention.cppGetWorkspaceSize+launchACLNN_ERR_RUNTIME_ERRORaclnn_prompt_flash_attention_v2.cppGetWorkspaceSize+launchACLNN_ERR_RUNTIME_ERRORaclnn_prompt_flash_attention_v3.cppGetWorkspaceSize+launchACLNN_ERR_RUNTIME_ERROR统一消息: "Interface aclnnPromptFlashAttention versions V1 to V3 are no longer supported on Ascend950."
prompt_flash_attention_def.cpp:114-116,195):无AddConfig("ascend950")1.2 IFA — op_api 层硬拦截
IFA V1-V4 共 8 个入口点全部在 op_api 层拦截 DAV_3510:
aclnn_incre_flash_attention.cppGetWorkspaceSize+launchACLNN_ERR_RUNTIME_ERRORaclnn_incre_flash_attention_v2.cppGetWorkspaceSize+launchACLNN_ERR_RUNTIME_ERRORaclnn_incre_flash_attention_v3.cppGetWorkspaceSize+launchACLNN_ERR_RUNTIME_ERRORaclnn_incre_flash_attention_v4.cppGetWorkspaceSize+launchACLNN_ERR_RUNTIME_ERROR统一消息: "Interface aclnnIncreFlashAttention versions V1 to V4 are no longer supported on Ascend950."
incre_flash_attention_def.cpp:303-305,397):无AddConfig("ascend950")aclnnIncreFlashAttentionV4→ 被 op_api 拦截1.3 FIA arch35 对 PFA/IFA 的使用方式
DoOpTilingFusedInferAttentionScore(tiling.cpp:2253)用GetCurNpuArch()三分:DAV_3510→ V4 路径(arch35 专属)DAV_5102→ arch38 路径2. 实施结果
Phase 1: 冗余 include 清理(arch35 专用文件)
已完成。 删除 arch35 专属文件中对 PFA/IFA 的冗余 include。
fused_infer_attention_score_template_tiling_key.hcommon/op_host/arch35/fia_tiling_nonquant_gqa.hcommon/op_host/arch35/fia_tiling_fullquant_gqa.hcommon/op_host/arch35/fia_tiling_fullquant_mx.h注:共享文件(
tiling.h、compile_info.h、index.h)的 PFA/IFA include 未删除 — 这些 include 传递提供 arch22 代码所需的类型,删除会导致编译失败。arch22/arch38 依赖不变。Phase 2: 删除 PFA/IFA tiling_v2 死代码
已完成。 PFA/IFA 在 arch35 上 op_api 已硬拦截,tiling_v2 是死代码。
prompt_flash_attention/op_host/prompt_flash_attention_tiling_v2.cppprompt_flash_attention/op_host/prompt_flash_attention_tiling_v2.hincre_flash_attention/op_host/incre_flash_attention_tiling_v2.cppincre_flash_attention/op_host/incre_flash_attention_tiling_v2.hcommon/src/tiling_sink/CMakeLists.txt依赖闭环: IFA v2.cpp 硬依赖 PFA v2.h(实例化
PromptFlashAttentionTilingV2),必须同时删除。Phase 3: Kernel enum header 独立
已完成。 新建 FIA 自有的 tiling key 枚举定义,替代 PFA 的
prompt_flash_attention_template_tiling_key_enum.h。fused_infer_attention_score/op_kernel/arch35/fia_arch35_template_tiling_key_enum.hfused_infer_attention_score_template_tiling_key.h— include 改为 FIA enum headerfia_arch35_antiquant.h— include 改为 FIA enum headerfia_arch35_noquant.h— include 改为 FIA enum headerfia_arch35_fullquant.h— include 改为 FIA enum headercommon/op_host/arch35/fia_tiling_nonquant_gqa.cpp— include 改为 FIA enum headercommon/op_host/arch35/fia_tiling_fullquant_gqa.cpp— include 改为 FIA enum headercommon/op_host/arch35/fia_tiling_fullquant_mx.cpp— include 改为 FIA enum header保留的符号:
ASCENDC_TPL_5_BW/10_BW、PARSE_PARAMS_AntiQuant/NoQuant/FullQuant(__CCE_AICORE__==310守护)、infer*Enum类型、InOutLayoutTypeValue/ConfigValue数组、全部InOutLayoutType_*(6 个)、全部Config_S1Aligned*(29 个)、全部PSE_MODE_PSE_*(6 个)、全部AntiquantMode_*(3 个)、全部FULLQUANT_MODE_*(5 个)、FullQuantMode/NoQuantMode、全部KvLayoutType_*(5 个)、#define false 0/true 1删除的符号:
ASCENDC_TPL_3_BW、inferPFALayoutTypeEnum/InOutLayoutPFATypeValue(PFA 专用)、inferImplModeEnum/ImplMode_AA_*、SplitCoreMode_*Phase 4: Legacy fallback 死代码清除
已完成。 审计发现
pfaTilingData_/ifaTilingData_是写后弃死容器:pfaTilingData_: setter 调用后从不 getter,不复制到输出,不写入 contextifaTilingData_:bmm.GetTiling()写入后从不读回,不复制到输出,不写入 contextfaRunTilingAdapter_(FlashAttentionScoreSimplifiedTilingData,来自 common regbase)删除内容:
fia_arch35_legacy_tiling_regbase.h整个文件(1192 行,Phase 4a 临时拷贝,Phase 4b 发现全是死容器后删除)tiling_impl.h:pfaTilingData_/ifaTilingData_成员、EnableMTE2BmmPipe声明、legacy regbase includetiling_impl.cpp:EnableMTE2BmmPipe函数体(27 行)、SetDequantMMTilingDatabmm 逻辑(52 行,保留空壳返回 SUCCESS)、pfaTilingData_相关 setter 调用(~15 行)Phase 5: CMakeLists arch 条件依赖
已完成,后回退。 原计划 ascend950 时不编译 PFA/IFA tiling 源文件,但共享文件
fused_infer_attention_score_tiling.cpp的 arch22 代码路径仍引用 PFA/IFA tiling 类(PromptFlashAttentionTiling、IFATiling、IFATilingArch38等),排除 PFA/IFA 源文件会导致undefined symbol。最终状态: FIA CMakeLists 的
depends保留 PFA/IFA(共享文件 arch22 路径需要)。tiling_sink CMakeLists 保留 PFA/IFA tiling.cpp。common/CMakeLists.txt的 ExternalProject 传递ASCEND_COMPUTE_UNIT保留(虽未使用,不删)。arch35 专属代码的解耦(Phase 1-4 + Phase 6-7)不受影响 — arch35 的 kernel 和 tiling 代码不 include 任何 PFA/IFA 头文件。
Phase 6: QFA 解耦
已完成。 QFA(quant_flash_attn)对 IFA/PFA 的依赖为零(源码零符号引用),删除 vestigial include 和构建依赖。
quant_flash_attn/op_kernel/arch35/quant_flash_attn_template_tiling_key.h:21quant_flash_attn/op_host/CMakeLists.txt:23Phase 7: 删除 PFA/IFA arch35 目录
已完成。 Phase 1-6 完成后,排除
experimental/(默认 OFF,不编译),PFA/IFA 的op_kernel/arch35/目录零外部引用。prompt_flash_attention/op_kernel/arch35/template_tiling_key_enum.h、template_tiling_key.h、tiling_regbase.h)incre_flash_attention/op_kernel/arch35/template_tiling_key.h、tiling_regbase.h)3. 变更文件清单
新建文件(1 个)
fused_infer_attention_score/op_kernel/arch35/fia_arch35_template_tiling_key_enum.h删除文件(11 个)
prompt_flash_attention/op_host/prompt_flash_attention_tiling_v2.cppprompt_flash_attention/op_host/prompt_flash_attention_tiling_v2.hincre_flash_attention/op_host/incre_flash_attention_tiling_v2.cppincre_flash_attention/op_host/incre_flash_attention_tiling_v2.hprompt_flash_attention/op_kernel/arch35/prompt_flash_attention_template_tiling_key_enum.hprompt_flash_attention/op_kernel/arch35/prompt_flash_attention_template_tiling_key.hprompt_flash_attention/op_kernel/arch35/prompt_flash_attention_tiling_regbase.hincre_flash_attention/op_kernel/arch35/incre_flash_attention_template_tiling_key.hincre_flash_attention/op_kernel/arch35/incre_flash_attention_tiling_regbase.hfused_infer_attention_score/op_kernel/arch35/fia_arch35_legacy_tiling_regbase.h修改文件(15 个)
fused_infer_attention_score_template_tiling_key.hfia_arch35_antiquant.hfia_arch35_noquant.hfia_arch35_fullquant.hcommon/op_host/arch35/fia_tiling_nonquant_gqa.hcommon/op_host/arch35/fia_tiling_fullquant_gqa.hcommon/op_host/arch35/fia_tiling_fullquant_mx.hcommon/op_host/arch35/fia_tiling_nonquant_gqa.cppcommon/op_host/arch35/fia_tiling_fullquant_gqa.cppcommon/op_host/arch35/fia_tiling_fullquant_mx.cpparch35/fused_infer_attention_score_tiling_impl.harch35/fused_infer_attention_score_tiling_impl.cppcommon/src/tiling_sink/CMakeLists.txtquant_flash_attn/op_kernel/arch35/quant_flash_attn_template_tiling_key.hquant_flash_attn/op_host/CMakeLists.txt4. 各 Phase 完成后的解耦状态
5. 关键发现支撑
5.1 新模板路径已完全自包含
common/op_host/arch35/fia_tiling_{nonquant_gqa,fullquant_gqa,fullquant_mx}.h/.cpp中的三个新模板类:Fia*tiling data 结构5.2 Legacy fallback 的 pfaTilingData_/ifaTilingData_ 是写后弃死容器
FusedInferAttentionScoreTilingImpl(arch35/tiling_impl.h/.cpp):pfaTilingData_(PFA 类型): setter 调用后从不 getter,不复制到faRunTilingAdapter_,不写入 contextifaTilingData_(IFA 类型):bmm.GetTiling()写入后从不读回,不复制到输出,不写入 contextSetTilingData(:2071-2073)只写入faRunTilingAdapter_(FlashAttentionScoreSimplifiedTilingData,来自 common regbase)5.3 template_tiling_key.h 的 PFA/IFA regbase include 完全冗余
ASCENDC_TPL_TILING_STRUCT_SEL(X)展开为 codegen 标记@@...@@,不需要 C++ 类型可见性5.4 PFA/IFA tiling_v2 可安全删除
#if 0(已禁用)5.5 QFA 对 IFA/PFA 零依赖
quant_flash_attn_template_tiling_key.h:21include IFA regbase,但零符号引用 — 仅传递拉入kernel_tiling.h(其他头文件已直接 include)quant_flash_attn_common_def.h)和 tiling data 结构(quant_flash_attn_tiling_data.h)5.6 PFA/IFA arch35 目录可安全删除
experimental/(默认 OFF),PFA/IFA 的op_kernel/arch35/目录零外部引用template_tiling_key.h→ PFA enum header)随目录删除一起消失5.7 Phase 5 CMakeLists 条件依赖回退
fused_infer_attention_score_tiling.cpp的 arch22 代码路径引用 PFA/IFA tiling 类(PromptFlashAttentionTiling、IFATiling、IFATilingArch38等)undefined symbol(vtable 未定义)