已关闭
【FusedInferAttention算子】解除arch35上FIA与IFA/PFA的依赖 #4066
jiang-lirui创建于  8月1日关闭于  8月1日
jiang-lirui成员
8月1日 创建

结果:arch35 FIA 彻底与 IFA/PFA 脱钩

目标:在 arch35 上,FIA 的 kernel 和 tiling 代码不依赖 IFA 和 PFA 的任何头文件

0. 结论

7 个 Phase 全部完成。arch35 上 FIA/QFA 已彻底与 IFA/PFA 脱钩,PFA/IFA 的 arch35 目录已删除,3 个测试用例运行时验证通过:

维度 状态
kernel 依赖 PFA 否 — 使用 FIA 自有 fia_arch35_template_tiling_key_enum.h
kernel 依赖 IFA 否 — template_tiling_key.h 不再 include IFA regbase
tiling 依赖 PFA 否 — legacy 死代码已清除,无 PFA 类型残留
tiling 依赖 IFA 否 — 同上
构建依赖 PFA/IFA 否(ascend950)— CMakeLists 条件依赖
PFA op_kernel/arch35/ 目录 已删除(3 文件)
IFA op_kernel/arch35/ 目录 已删除(2 文件)
QFA 依赖 PFA/IFA 否 — IFA regbase include 已删除,CMakeLists 依赖已移除
arch22/arch38 依赖 不变 — 其他 arch 的依赖完全保留

运行时验证

用例 tilingKey 结果
noquant(test.py::test_flash_attention) 669253888 PASS
gqa fullquant(fia_fullquant_gqa_debug) 35658141957 PASS
mxfp8 fullquant(fia_fullquant_mxfp8_debug) 36190821378 PASS

编译命令:

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:

版本 文件 拦截函数 行 返回
V1 aclnn_prompt_flash_attention.cpp GetWorkspaceSize + launch 47-50, 81-84 ACLNN_ERR_RUNTIME_ERROR
V2 aclnn_prompt_flash_attention_v2.cpp GetWorkspaceSize + launch 53-56, 80-83 ACLNN_ERR_RUNTIME_ERROR
V3 aclnn_prompt_flash_attention_v3.cpp GetWorkspaceSize + launch 54-57, 72-75 ACLNN_ERR_RUNTIME_ERROR

统一消息: "Interface aclnnPromptFlashAttention versions V1 to V3 are no longer supported on Ascend950."

  • op def(prompt_flash_attention_def.cpp:114-116,195):无 AddConfig("ascend950")
  • Inner/Base 层无拦截,但 unreachable — 公共 aclnn 层拦截在 inner 调用之前
  • 结论:PFA 在 arch35 上无任何可用路径

1.2 IFA — op_api 层硬拦截

IFA V1-V4 共 8 个入口点全部在 op_api 层拦截 DAV_3510:

版本 文件 拦截函数 行 返回
V1 aclnn_incre_flash_attention.cpp GetWorkspaceSize + launch 27, 50 ACLNN_ERR_RUNTIME_ERROR
V2 aclnn_incre_flash_attention_v2.cpp GetWorkspaceSize + launch 27, 50 ACLNN_ERR_RUNTIME_ERROR
V3 aclnn_incre_flash_attention_v3.cpp GetWorkspaceSize + launch 30, 52 ACLNN_ERR_RUNTIME_ERROR
V4 aclnn_incre_flash_attention_v4.cpp GetWorkspaceSize + launch 30, 45 ACLNN_ERR_RUNTIME_ERROR

统一消息: "Interface aclnnIncreFlashAttention versions V1 to V4 are no longer supported on Ascend950."

  • op def(incre_flash_attention_def.cpp:303-305,397):无 AddConfig("ascend950")
  • graph-mode fallback 调用 aclnnIncreFlashAttentionV4 → 被 op_api 拦截
  • 结论:IFA 在 arch35 上无任何可用路径

1.3 FIA arch35 对 PFA/IFA 的使用方式

DoOpTilingFusedInferAttentionScore(tiling.cpp:2253)用 GetCurNpuArch() 三分:

  • DAV_3510 → V4 路径(arch35 专属)
  • DAV_5102 → arch38 路径
  • 其他 → arch22 legacy 路径
路径 对 PFA/IFA 的使用(解耦前) 解耦后
arch22 实例化 PFA/IFA tiling 类并委托 tiling 计算 不变
arch38 实例化 arch38 变体并委托 不变
arch35 新模板 无 PFA/IFA 依赖(自包含) Phase 1 删除冗余 include
arch35 legacy fallback 使用 PFA/IFA regbase 数据结构作为写后弃容器 Phase 4 删除全部死代码

2. 实施结果

Phase 1: 冗余 include 清理(arch35 专用文件)

已完成。 删除 arch35 专属文件中对 PFA/IFA 的冗余 include。

文件 修改
fused_infer_attention_score_template_tiling_key.h 删除 PFA regbase include、IFA regbase include、PFA enum include → FIA enum header
common/op_host/arch35/fia_tiling_nonquant_gqa.h 删除 PFA regbase include
common/op_host/arch35/fia_tiling_fullquant_gqa.h 删除 PFA regbase include
common/op_host/arch35/fia_tiling_fullquant_mx.h 删除 PFA regbase include

注:共享文件(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.cpp 5223 行
删除 prompt_flash_attention/op_host/prompt_flash_attention_tiling_v2.h 388 行
删除 incre_flash_attention/op_host/incre_flash_attention_tiling_v2.cpp 4479 行
删除 incre_flash_attention/op_host/incre_flash_attention_tiling_v2.h 439 行
修改 common/src/tiling_sink/CMakeLists.txt 移除 PFA/IFA v2.cpp 显式引用

依赖闭环: 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.h
修改 fused_infer_attention_score_template_tiling_key.h — include 改为 FIA enum header
修改 fia_arch35_antiquant.h — include 改为 FIA enum header
修改 fia_arch35_noquant.h — include 改为 FIA enum header
修改 fia_arch35_fullquant.h — include 改为 FIA enum header
修改 common/op_host/arch35/fia_tiling_nonquant_gqa.cpp — include 改为 FIA enum header
修改 common/op_host/arch35/fia_tiling_fullquant_gqa.cpp — include 改为 FIA enum header
修改 common/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,不复制到输出,不写入 context
  • ifaTilingData_: bmm.GetTiling() 写入后从不读回,不复制到输出,不写入 context
  • context 最终只收到 faRunTilingAdapter_(FlashAttentionScoreSimplifiedTilingData,来自 common regbase)

删除内容:

  • fia_arch35_legacy_tiling_regbase.h 整个文件(1192 行,Phase 4a 临时拷贝,Phase 4b 发现全是死容器后删除)
  • tiling_impl.h:pfaTilingData_/ifaTilingData_ 成员、EnableMTE2BmmPipe 声明、legacy regbase include
  • tiling_impl.cpp:EnableMTE2BmmPipe 函数体(27 行)、SetDequantMMTilingData bmm 逻辑(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:21 删除 IFA regbase include(零符号引用)
quant_flash_attn/op_host/CMakeLists.txt:23 depends 移除 IFA/PFA(零源码依赖)

Phase 7: 删除 PFA/IFA arch35 目录

已完成。 Phase 1-6 完成后,排除 experimental/(默认 OFF,不编译),PFA/IFA 的 op_kernel/arch35/ 目录零外部引用。

操作 目录 文件数
删除 prompt_flash_attention/op_kernel/arch35/ 3 个(template_tiling_key_enum.h、template_tiling_key.h、tiling_regbase.h)
删除 incre_flash_attention/op_kernel/arch35/ 2 个(template_tiling_key.h、tiling_regbase.h)

3. 变更文件清单

新建文件(1 个)

文件 用途
fused_infer_attention_score/op_kernel/arch35/fia_arch35_template_tiling_key_enum.h FIA 自有 tiling key 枚举(替代 PFA enum header)

删除文件(11 个)

文件 行数 死因
prompt_flash_attention/op_host/prompt_flash_attention_tiling_v2.cpp 5223 PFA op_api V1/V2/V3 全部拦截 DAV_3510
prompt_flash_attention/op_host/prompt_flash_attention_tiling_v2.h 388 仅被 v2.cpp 和 IFA v2.cpp include(同时删除)
incre_flash_attention/op_host/incre_flash_attention_tiling_v2.cpp 4479 IFA op_api V1-V4 全部拦截 DAV_3510
incre_flash_attention/op_host/incre_flash_attention_tiling_v2.h 439 零外部 includer
prompt_flash_attention/op_kernel/arch35/prompt_flash_attention_template_tiling_key_enum.h 255 枚举已拷贝到 FIA,零外部引用
prompt_flash_attention/op_kernel/arch35/prompt_flash_attention_template_tiling_key.h 1394 PFA TPL SEL 声明,死代码
prompt_flash_attention/op_kernel/arch35/prompt_flash_attention_tiling_regbase.h 824 tiling data POD,死容器已删除
incre_flash_attention/op_kernel/arch35/incre_flash_attention_template_tiling_key.h 2364 IFA TPL SEL 声明,死代码
incre_flash_attention/op_kernel/arch35/incre_flash_attention_tiling_regbase.h 384 tiling data POD,死容器已删除
fused_infer_attention_score/op_kernel/arch35/fia_arch35_legacy_tiling_regbase.h 1192 临时拷贝,后发现全是死容器,已删除

修改文件(15 个)

文件 修改内容
fused_infer_attention_score_template_tiling_key.h 删除 PFA/IFA regbase include + PFA enum include → FIA enum header
fia_arch35_antiquant.h PFA enum include → FIA enum header
fia_arch35_noquant.h 同上
fia_arch35_fullquant.h 同上
common/op_host/arch35/fia_tiling_nonquant_gqa.h 删除 PFA regbase include
common/op_host/arch35/fia_tiling_fullquant_gqa.h 同上
common/op_host/arch35/fia_tiling_fullquant_mx.h 同上
common/op_host/arch35/fia_tiling_nonquant_gqa.cpp PFA enum include → FIA enum header
common/op_host/arch35/fia_tiling_fullquant_gqa.cpp 同上
common/op_host/arch35/fia_tiling_fullquant_mx.cpp 同上
arch35/fused_infer_attention_score_tiling_impl.h 删除 pfaTilingData_/ifaTilingData_ 成员、EnableMTE2BmmPipe 声明、legacy regbase include
arch35/fused_infer_attention_score_tiling_impl.cpp 删除 EnableMTE2BmmPipe 函数体、SetDequantMMTilingData bmm 逻辑、pfaTilingData_ setter 调用
common/src/tiling_sink/CMakeLists.txt 移除 PFA/IFA v2.cpp 显式引用
quant_flash_attn/op_kernel/arch35/quant_flash_attn_template_tiling_key.h 删除 IFA regbase include
quant_flash_attn/op_host/CMakeLists.txt depends 移除 IFA/PFA

4. 各 Phase 完成后的解耦状态

Phase kernel 依赖 PFA kernel 依赖 IFA tiling 依赖 PFA tiling 依赖 IFA PFA/IFA v2 死代码 PFA/IFA arch35 目录
现状 是 是(传递) 是(legacy+冗余) 是(legacy+传递) 存在 存在
Phase 1 是 是(临时) 仅 legacy 仅 legacy 存在 存在
Phase 2 是 是(临时) 仅 legacy 仅 legacy 删除 存在
Phase 3 否 是(临时) 仅 legacy 仅 legacy 删除 存在
Phase 4 否 否 否 否 删除 存在
Phase 5 否 否 否 否 删除 存在(回退,共享文件需要)
Phase 6 否 否 否 否 删除 存在(QFA 已解耦)
Phase 7 否 否 否 否 删除 删除

5. 关键发现支撑

5.1 新模板路径已完全自包含

common/op_host/arch35/fia_tiling_{nonquant_gqa,fullquant_gqa,fullquant_mx}.h/.cpp 中的三个新模板类:

  • 使用 FIA 原生的 Fia* tiling data 结构
  • 不引用任何 PFA/IFA 类型
  • Phase 1 删除冗余 PFA regbase include 后完全自包含

5.2 Legacy fallback 的 pfaTilingData_/ifaTilingData_ 是写后弃死容器

FusedInferAttentionScoreTilingImpl(arch35/tiling_impl.h/.cpp):

  • pfaTilingData_(PFA 类型): setter 调用后从不 getter,不复制到 faRunTilingAdapter_,不写入 context
  • ifaTilingData_(IFA 类型): bmm.GetTiling() 写入后从不读回,不复制到输出,不写入 context
  • SetTilingData(:2071-2073)只写入 faRunTilingAdapter_(FlashAttentionScoreSimplifiedTilingData,来自 common regbase)
  • 结论: pfaTilingData_/ifaTilingData_ 是完全的死代码,已删除

5.3 template_tiling_key.h 的 PFA/IFA regbase include 完全冗余

  • ASCENDC_TPL_TILING_STRUCT_SEL(X) 展开为 codegen 标记 @@...@@,不需要 C++ 类型可见性
  • 三个使用的结构体分别定义在 common regbase 和 FIA 自己的 tiling data 头文件中

5.4 PFA/IFA tiling_v2 可安全删除

  • PFA V1/V2/V3 共 6 个入口点 + IFA V1-V4 共 8 个入口点全部 op_api 拦截 DAV_3510
  • PFA/IFA v2.h 零外部 includer(互相依赖,同时删除)
  • FIA arch35 不 include v2.h
  • arch35 UT 全部 #if 0(已禁用)

5.5 QFA 对 IFA/PFA 零依赖

  • QFA 的 quant_flash_attn_template_tiling_key.h:21 include IFA regbase,但零符号引用 — 仅传递拉入 kernel_tiling.h(其他头文件已直接 include)
  • QFA 自定义了全部 tiling key 枚举(quant_flash_attn_common_def.h)和 tiling data 结构(quant_flash_attn_tiling_data.h)
  • QFA 的 CMakeLists 声明 PFA/IFA 依赖,但零源码 include/usage

5.6 PFA/IFA arch35 目录可安全删除

  • Phase 1-6 完成后,排除 experimental/(默认 OFF),PFA/IFA 的 op_kernel/arch35/ 目录零外部引用
  • 唯一的内部引用(IFA 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 等)
  • 排除 PFA/IFA tiling.cpp 会导致 undefined symbol(vtable 未定义)
  • arch35 专属代码的解耦不受影响 — Phase 1-4 + Phase 6-7 已实现 arch35 kernel 和 tiling 不 include 任何 PFA/IFA 头文件
likedislike
Jjiang-lirui成员
8月1日 修改了issue 的描述
Jjiang-lirui成员
8月1日 修改了issue 的描述
Jjiang-lirui成员
8月1日 关联了pull request:解除arch35上FIA与IFA/PFA的依赖
weihao18成员
8月1日 评论:

/assign @jiang-lirui

likedislike
CANN-robotCANN-robot成员
8月1日 将 jiang-lirui 设为负责人
CANN-robotCANN-robot成员
8月1日 关闭了 issue
CANN-robotCANN-robot成员
8月1日 添加了label:resolved