TL;DR
结论层面的建议:把 attention 优化当成分层选型问题,而不是单点追峰值。第一层(数据流)已经由 tiling + online softmax 固化:FA1 [1] 避免 materialize L×L score,把瓶颈从显存容量转回带宽。第二层(调度)在 A100 这代仍是最大杠杆:FA2 [2] 仅靠 work partitioning 就能给出接近 2× 吞吐差异。第三层(硬件映射)在 Hopper 上把 attention 推近 compute-bound:FA3 [3] 通过 TMA 与 warp specialization 把 BF16 做到约 75% peak、FP8 到约 1.2 PFLOPs/s,但代价是更强的代际绑定与更复杂的误差路径。第四层(系统与语义)决定推理真实成本:decode 并行与 KV cache 往往比 kernel 更关键,FlashInfer [4][5] 更像默认后端;变体优先用 FlexAttention [7],只有当 mask/score 语义改变 tiling/访存或需要跨设备 blockwise 执行时,才考虑 FlashMask [8]、RingAttention [9] 这类专用实现。FP8 需要谨慎:先做 BF16 对照,再检查 rescale 顺序、累加精度与 outlier token 的误差放大 [10][11]。至于“替代 attention”,更稳的读法是 hybrid 或局部替换:softmax attention 在表达力与任务迁移上仍占优势 [14][15]。
核心断言
§0 演进谱系:把 attention kernel 演化拆成四层瓶颈迁移
online softmax -> FA1 (HBM) -> FA2 (parallel) -> Flash-Decoding -> FA3 (async + FP8) -> FlexAttention / FlashInfer / Triton
FlashAttention 一脉的演进可以拆成四层并按时间往后递推:第一层(数据流/数值)由 [12] 与 [13] 奠定 — 用 online softmax 把 attention 的 O(n²) memory 化解成 tile + recompute,这是后续所有 kernel 的算式起点。[1] 把这条数学路径与 GPU 的 HBM 层级对齐,把 fused kernel 的吞吐从 ~12% peak 推到 ~28%,瓶颈从 HBM I/O 转为 SM occupancy。[2] 改写第二层(调度) — 沿 sequence 维度并行,SM 占用提到 ~50% peak;[6] 在 decode 场景沿 KV 切分,把推理侧瓶颈从“kernel 写得更快”转向“沿哪个轴切”。
[3] 同时改写第一层(数值)与第三层(硬件映射) — 引入 Hopper 的 async pipeline、TMA 与 WGMMA,加上 FP8 e4m3/e5m2,论文报告 BF16 ~75% peak、FP8 ~82% peak。[10] 与 [11] 把 FP8 的误差路径界定清楚 — 风险来自 scaling 的边界条件而非格式本身。第四层(系统语义)则由 [4]、[5]、[7]、[8] 占据 — serving 侧和 mask 表达力被显式分离出来,“维护成本 vs 峰值吞吐”成为新的争论焦点;[7] 用 score_mod / mask_mod 把变体表达上移,与 [26] 的 Triton 路径互补。今天选 attention kernel 的真问题不是“再写一个更快的 kernel”,而是“在四层里改哪一层、改完会把瓶颈推到哪一层”。本节用 figure 0.2 把四层框架画出来,§1-§4 据此给出训练侧、推理侧、变体侧的工程取舍。
§1 四层拆解:数据流→调度→硬件映射→系统语义
attention 优化常被误读为“谁的 kernel 更快”,但更稳健的工程拆解是四层。第一层是 exact attention 的数据流:FA1 [1] 将核心瓶颈表述为 HBM I/O,并用 tiling + online softmax 避免 materialize L×L score;online softmax 的数值机制可追溯到 Milakov et al. [12],而“exact attention 不必 O() memory”在算法上也成立 [13]。第二层是并行与调度:FA2 [2] 证明数学形式不变时,work partitioning 与并行粒度足以造成接近 2× 的吞吐差异。第三层是硬件映射:FA3 [3] 将 TMA、warp specialization 与 FP8 tensor core matmul 接入 fused attention,把关键路径从 memory-bound 推向 compute-bound。第四层是系统与语义:推理瓶颈常落在 decode 并行与 KV cache,Flash-Decoding [6] 与 FlashInfer [4][5] 将“沿 KV 切 chunk 并行 + 归约”工程化;变体侧则优先把语义上移到 FlexAttention [7],只有当 mask/score 语义改变 tiling/访存或需要跨设备 blockwise 执行时,才进入 FlashMask [8] 或 RingAttention [9] 这类专用路径。这个分层的价值在于:先判断瓶颈位于哪一层,再决定换 kernel、换后端,还是换语义入口。
把 attention 优化当成四层选型:数据流决定 I/O 下限,调度决定占用率,硬件映射决定峰值,系统语义决定线上成本。
§2 训练侧:FA3 的峰值与 FlexAttention 的维护成本,怎么取舍
训练侧的 shared ground 是“exact softmax attention 仍是默认语义”,分歧只在实现路径。FA2 [2] 将主要收益归因于 work partitioning:沿 seq 维增加并行、降低非 matmul 开销、改善 block 内外负载均衡;这些收益通常可跨模型复用。FA3 [3] 将收益进一步绑定到 Hopper 硬件特性:TMA 使数据搬运更异步,warp specialization 解耦搬运与计算,FP8 tensor core 将 matmul 推向更高吞吐;这也解释了在同样的 exact attention 语义下,H100/H200 的默认更偏 FA3,而 A100/H20 更偏 FA2。相对地,FlexAttention [7] 把变体表达上移到 score_mod/mask_mod,再由 torch.compile 生成 fused kernel,目标是把“写变体”的成本从 CUDA 维护转为 Python 语义维护。真正的取舍是工程经济:当训练卡在临界 batch/seq,10% 吞吐就是成本时,FA3 的代际特化更可能划算;当 mask/score 变体需要频繁迭代且部署横跨硬件,FlexAttention 的统一入口更稳。可操作判据是 profile:若 attention 已接近 compute-bound(FA3 在 Hopper 上报告的情况 [3]),继续追峰值通常只剩 10–20% 边际,工程资源更常转向重计算、并行策略或数据管线。反过来,若 attention 仍是显著热点且硬件固定在 Hopper,FA3 的专用实现仍可能是最低成本路径。
| 层级/场景 | 默认答案 | 何时不够用 | 升级路径 |
|---|---|---|---|
| 训练 dense exact attention(A100/H20) | FA2 [2] | attention 仍是主要热点且调度/占用率低 | 先调 shape/packing,再评估专用 kernel;避免回退到 FA1 [1] |
| 训练 dense exact attention(H100/H200) | FA3(BF16/FP16)[3] | 需要跨架构一致性或维护窗口短 | |
| attention 语义变体(ALiBi/SWA/soft mask 等) | FlexAttention [7] | mask 改变 tile 复用/访存模式导致性能掉 | |
| Serving decode(长上下文、小 batch) | 瓶颈在 KV cache 带宽/容量或 prefill↔decode 切换 |
§3 推理侧:kernel 不是瓶颈时,FlashInfer 比“再写 CUDA”更像默认答案
推理侧的共识是:decode 的串行性与 KV cache 的读写模式决定实际吞吐上限,attention kernel 峰值通常不是第一瓶颈。Flash-Decoding [6] 给出清晰机制:单 token decode 时 Q 的 batch 维很小,训练态 kernel 的并行维度不足,导致 SM 空转;将 KV 沿 seq 切成 chunk 并行计算 partial attention,再归约,可把并行度拉回可用区间。FlashInfer [4] 将这类机制收敛为库接口,覆盖 paged KV、GQA/MQA、不同 KV layout 与 prefill/decode 切换;更新版进一步将其定位为 attention engine [5],强调“可配置”比“单点极限”更重要。这里的取舍不同于训练侧:serving 的工作负载更碎(batch/seq 动态、请求到达随机),维护一堆面向单一 shape 的手写 kernel 往往得不偿失。更稳定的收益通常来自系统策略:例如用 GQA 降低 KV 读带宽 [21],或用 speculative decoding 减少串行 decode 的 token 数 [22]。因此,除非 profile 显示 attention kernel 仍占主导,否则把工程资源投入 KV cache 表示、调度与解码策略,通常比追逐 10% kernel 峰值更稳。
§4 “替代 attention”更像局部替换:复杂度优势 vs 表达力与迁移
“O() attention 在长上下文时代不合适”是一种直觉,但现有证据不支持把它当作通用默认路线。首先,softmax attention 的优势不只是实现成熟,而是表达力:Deng et al. [14] 从理论与实验角度指出 linear attention 会损失表示能力,许多近似还需要额外结构补回。其次,结构改动迁移性差:Narang et al. [15] 系统评估发现大量 Transformer modification 在不同实现与任务间不稳定,因此“在某个基准追平”不等于“可以成为默认”。第三,长上下文也可以通过 attention 的系统化扩展解决:RingAttention [9] 用分布式 blockwise 执行把上下文扩到单机 KV 放不下的区间,说明复杂度压力不必然导向“抛弃 attention”。替代路线并非无效:Longformer [16]、Reformer [17]、以及 gated/linear 变体 [18] 在特定任务与约束下能给出更好的成本曲线。更稳的工程读法是把它们视为特定 regime 的结构选项,而不是所有 dense attention 的替代品。对 kernel 生态,这意味着即使未来出现更多 hybrid 结构,dense attention 仍会长期存在于部分层或部分路径;因此,FA2/FA3 与 FlexAttention 的投资不会仅因“替代 attention”叙事而失效。
时间线
研究立场对比
阵营 A:FA1/FA2/FA3 已经给出主要答案,剩下多是移植与系统工程
立场 — dense exact attention 的 kernel 主线已收敛:训练侧按硬件选 FA2/FA3 [2][3],推理侧用 FlashInfer 这类引擎 [4][5]。继续投入手写 kernel 的收益多为 10–20% 边际,且维护成本上升。
反方 — 反驳 c-c3d509c165:变体与 serving 不是“衍生问题”。FlexAttention [7] 与 FlashInfer [4][5] 把生态重心从“写 kernel”转到“写语义/写后端策略”,这会改变团队分工与长期成本;同时,长上下文的分布式 blockwise 执行(RingAttention [9])也不是简单移植。
判词 — 一个更务实的定位:kernel 主线在训练 dense attention 上接近收敛,但系统与语义层才是 2026 的主要增量区。把“继续写 kernel”当作少数场景(固定硬件、极限吞吐、语义稳定)的专项,而不是默认投资方向。
阵营 B:主线应从手写 CUDA 转向 Triton/FlexAttention 式语义编译
立场 — 长期成本来自变体爆炸与跨硬件部署,手写 CUDA 的维护窗口越来越短。FlexAttention [7] 把变体表达上移到 score_mod/mask_mod,并通过 torch.compile 生成 fused kernel;更一般的编译路线(TVM/Ansor/Mirage)表明高性能不必依赖手写内核 [23][24][25]。
反方 — 修正 c-fdcdf25f0c / c-f00a0f8184:门槛下降不等于峰值被取代。FA3 [3] 把 Hopper 的 TMA/warp specialization/FP8 深度揉进 kernel,FlexAttention 在这些代际特化上可能仍落后 5–15%(尤其在 FP8 路径)。当训练处在临界吞吐,编译路径需要明确的 head-to-head 证据才能替代手写 CUDA。
判词 — 结论层面的建议:变体与跨平台优先走 FlexAttention/Triton;训练主路径保留“手写 CUDA(FA2/FA3)+ 可替换后端”的双轨。把编译路径当作默认入口,把手写 CUDA 当作少数性能临界点的加速器。
阵营 C:attention 应被 SSM/linear/sparse 等结构替代以解决长上下文成本
立场 — dense attention 的 O() 复杂度与 KV cache 成本会随上下文增长持续恶化,因此应优先采用线性/稀疏/递归结构(如 Longformer [16]、Reformer [17]、gated linear attention [18]),从根源降低复杂度,而不是继续在 kernel 上挤边际。
反方 — 反驳 c-f4696a7b06 / c-ff80f3a405 / c-bf5e97f8c9:复杂度优势不自动转化为通用默认。softmax attention 在表达力上有明确优势 [14],而结构改动在不同实现与任务间迁移不稳 [15]。同时,长上下文也可通过分布式 blockwise attention 扩展 [9],并不必然要求抛弃 attention。
判词 — 一个更稳的读法:替代结构适合作为特定 regime 的结构选项(长文档、固定稀疏模式、或强延迟约束),但通用 LLM 的默认仍会保留部分 softmax attention。工程上更像“hybrid + 系统化 KV/调度优化”,而不是“全面替代”。
阵营 D:FA3 代表代际锁定,关键路径不应依赖 Hopper 专属特性
立场 — FA3 [3] 深度依赖 Hopper 的 TMA 与 warp specialization,导致跨架构迁移成本高、维护窗口短;在多云或混合 GPU 团队里,把关键路径押在这类内核会放大供应链与平台迁移风险。更可取的是以可移植后端(Triton/编译器)为主,保留可替换实现。
反方 — 修正 c-574ffb3b22 / c-0d086b357f:锁定主要集中在“FP8 + Hopper 异步搬运”的峰值路径,而不是整个 attention 生态。FA2 [2] 与 FlexAttention [7] 更容易作为跨架构默认;同时,在硬件固定且训练成本主导的场景,FA3 的 5–15% 吞吐差距可能足以覆盖迁移风险。
判词 — 结论层面的建议:把 FA3 当作 Hopper 集群的专项加速器,而不是唯一后端;对外提供“FA3/FA2/FlexAttention 可替换”的接口层,避免把模型语义与某代 GPU 的指令特性绑死。
实践要点
可执行清单(带边界与触发条件):
1) 训练默认按硬件分流:H100/H200 的 BF16/FP16 attention 直接用 FA3 [3];A100/H20 默认 FA2 [2]。不要在新项目里把 FA1 当默认,只保留为 reference/debug 基线 [1]。
2) 先 profile 再动手写 kernel:若 attention kernel 时间占比 <20% 或瓶颈在 decode/KV,优先接 FlashInfer [4][5];不要先写 CUDA 去追 5–10% 峰值。
3) 变体优先走语义入口:ALiBi/SWA/soft mask 这类 score/mask 改动先用 FlexAttention [7]。只有当 profile 显示 mask 语义导致 tile 复用/访存被破坏、吞吐明显掉,才考虑专用实现如 FlashMask [8]。
4) 长上下文先问“单机还是分布式”:单机长上下文的主要压力是 KV cache;跨设备扩展优先考虑 blockwise/通信调度路线,如 RingAttention [9],而不是默认改成线性/稀疏结构。
5) FP8 不要直接上生产训练:先跑 BF16 对照(同数据、同 seed、至少覆盖一个稳定区间),再逐项检查 scaling/rescale 顺序与累加精度假设是否匹配 FP8 格式约束 [10],并用公开的 FP8 vs BF16 经验对照稳定性风险 [11]。
6) 把“可移植性”当接口约束而不是口号:对外暴露可替换后端(FA3/FA2/FlexAttention),避免把模型代码写死在 Hopper 特性上;Hopper 微架构细节会实质影响 kernel 行为 [27]。
7) 不要把“替代 attention”当默认路线:在评估线性/稀疏/递归结构前,先用表达力与迁移性作为硬门槛:softmax attention 的表达力优势有明确论证 [14],而结构改动跨实现/任务不稳 [15]。更常见的落点是 hybrid 或特定场景专用。
悬而未决的问题
- Q1.需要更干净的 head-to-head:FlexAttention/Triton attention kernel 与手写 FlashAttention(FA2/FA3)在同一硬件、同一 shape 分布下的速度-可维护性-语义覆盖对比,最好包含真实 serving trace,而不是单点 microbench。[7][2][3]
- Q2.attention-specific 的 FP8 失败分析仍不够系统:哪些 rescale 顺序、累加精度与 outlier token 分布会在长上下文下触发不可逆的误差放大?需要公开可复现的最小失败用例与诊断工具链。[10][11]
- Q3.跨厂商/ROCm 的 attention kernel 证据不足:需要公开的、attention-operator 级别的可移植实现与基准,区分“能跑”与“接近 FA2/FA3 的占用率/带宽效率”。现有讨论更多停留在编译器或通用张量程序层面。[26][23]
- Q4.“替代 attention”的稳定落点需要更明确的任务分解:哪些任务/指标(retrieval、ICL、长程依赖、对齐)对 softmax attention 的表达力依赖最强,哪些可以被线性/稀疏/递归结构覆盖?需要跨实现的迁移评估协议。[14][15]
- [1]Tri Dao, Daniel Y. Fu, Stefano Ermon, Atri Rudra, Christopher Ré. FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness. arXiv, 2022论文
- [2]Tri Dao. FlashAttention-2: Faster Attention with Better Parallelism and Work Partitioning. arXiv, 2023论文
- [3]Jay Shah, Ganesh Bikshandi, Ying Zhang, Vijay Thakkar, Pradeep Ramani, Tri Dao. FlashAttention-3: Fast and Accurate Attention with Asynchrony and Low-precision. NeurIPS, 2024论文
- [4]Zihao Ye, Lequn Chen, Ruihang Lai, Yilong Zhao, Size Zheng, Junru Shao. FlashInfer: Kernel Library for LLM Serving. arXiv, 2024论文
- [5]Zihao Ye, Lequn Chen, Ruihang Lai, Wuwei Lin, Yineng Zhang. FlashInfer: Efficient and Customizable Attention Engine for LLM Inference Serving. arXiv, 2025论文
- [6]
- [7]Juechu Dong, Boyuan Feng, Driss Guessous, Yanbo Liang, Horace He. FlexAttention: The Flexibility of PyTorch with the Performance of FlashAttention. arXiv, 2024论文
- [8]Guoxia Wang, Jinle Zeng, Xiyuan Xiao, Siming Wu, Jiabin Yang. FlashMask: Efficient and Rich Mask Extension of FlashAttention. arXiv, 2024论文
- [9]Hao Liu, Matei Zaharia, Pieter Abbeel. Ring Attention with Blockwise Transformers for Near-Infinite Context. arXiv, 2023论文
- [10]Paulius Micikevicius, Dusan Stosic, Neil Burgess, Marius Cornea, Pradeep Dubey. FP8 Formats for Deep Learning. arXiv, 2022论文
- [11]Kazuki Fujii, Taishi Nakamura, Rio Yokota. Balancing Speed and Stability: The Trade-offs of FP8 vs. BF16 Training in LLMs. arXiv, 2024论文
- [12]
- [13]
- [14]Yichuan Deng, Zhao Song, Kaijun Yuan, Tianyi Zhou. Why Softmax Attention Outperforms Linear Attention. arXiv, 2023论文
- [15]Sharan Narang, Hyung Won Chung, Yi Tay, William Fedus, Thibault Fevry. Do Transformer Modifications Transfer Across Implementations and Applications?. arXiv, 2021论文
- [16]Iz Beltagy, Matthew E. Peters, Arman Cohan. Longformer: The Long-Document Transformer. arXiv, 2020论文
- [17]
- [18]Songlin Yang, Bailin Wang, Yikang Shen, Rameswar Panda, Yoon Kim. Gated Linear Attention Transformers with Hardware-Efficient Training. arXiv, 2023论文
- [19]Maximilian Beck, Korbinian Pöppel, Markus Spanring, Andreas Auer, Oleksandra Prudnikova. xLSTM: Extended Long Short-Term Memory. arXiv, 2024论文
- [20]Jason Ramapuram, Federico Danieli, Eeshan Dhekane, Floris Weers, Dan Busbridge. Theory, Analysis, and Best Practices for Sigmoid Self-Attention. arXiv, 2024论文
- [21]Joshua Ainslie, James Lee-Thorp, Michiel de Jong, Yury Zemlyanskiy, Federico Lebrón. GQA: Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints. arXiv, 2023论文
- [22]Yaniv Leviathan, Matan Kalman, Yossi Matias. Fast Inference from Transformers via Speculative Decoding. arXiv, 2022论文
- [23]Tianqi Chen, Thierry Moreau, Ziheng Jiang, Lianmin Zheng, Eddie Yan, et al.. TVM: An Automated End-to-End Optimizing Compiler for Deep Learning. OSDI, 2018论文
- [24]Lianmin Zheng, Chengfan Jia, Minmin Sun, Zhao Wu, Cody Hao Yu, et al.. Ansor: Generating High-Performance Tensor Programs for Deep Learning. OSDI, 2020论文
- [25]Mengdi Wu, Xinhao Cheng, Shengyu Liu, Chunan Shi, Jianan Ji. Mirage: A Multi-Level Superoptimizer for Tensor Programs. arXiv, 2024论文
- [26]Burkhard Ringlein, Jan van Lunteren, Radu Stoica, Thomas Parnell. The Anatomy of a Triton Attention Kernel. arXiv, 2025论文
- [27]Weile Luo, Ruibo Fan, Zeyu Li, Dayou Du, Hongyuan Liu. Dissecting the NVIDIA Hopper Architecture through Microbenchmarking and Multiple Level Analysis. arXiv, 2025论文
- [28]Shengkun Cui, Archit Patke, Hung Nguyen, Aditya Ranjan, Ziheng Chen. Story of Two GPUs: Characterizing the Resilience of Hopper H100 and Ampere A100 GPUs. arXiv, 2025论文