FlashAttention 三代演进:从 2205 到 Hopper 到 Blackwell

16 分钟阅读

FlashAttention 三代演进:从 2205 到 Hopper 到 Blackwell

前情说明:这是技术深度 D2。上一篇 D1 挖了 DeepSeek V4 的模型侧稀疏 attention,这一篇挖 kernel 侧——FlashAttention 家族三代是如何一步步榨干 GPU 的。从最基本的 tiling + softmax rescaling,到 Hopper 的 warp specialization,再到 Blackwell 时代的重写。 素材来自 Tri Dao 团队的 FA3 官方博客 + FA1/FA2/FA3 三篇 arxiv 论文 + Colfax Research 深度解读。


起手:为什么 attention 是 kernel 层最难的战场

深度学习里,GEMM(矩阵乘法)已经被优化到极致——CUTLASS、cuBLAS、CUDNN 十几年的积累,随便一个矩阵乘都能跑到理论峰值的 90%+。

但 attention 不行。Standard attention 有两个 GEMM + 一个 softmax——

S = Q @ K^T           # GEMM 1
P = softmax(S)        # 非 GEMM,逐行 softmax
O = P @ V             # GEMM 2

问题在中间那个 softmax:

  1. 需要存中间矩阵 S 和 P(长度 N × N),一个 8K 序列这就是 256 MB——必须写 HBM 再读回来
  2. Softmax 是逐行归一化(需要看到整行才能算),跟 GEMM 的分块并行冲突
  3. Softmax 的 exp 用的是Multi-Function Unit——H100 上算力只有 3.9 TFLOPS,是 FP16 GEMM 的 1/256!

这三个问题让 attention 长期是内存带宽 bound + special function bound + 并行度受限。

FlashAttention 系列的历史,就是每一代想办法——把 attention 从这些约束里一层层解放出来。


第一代 · FlashAttention (2022) · IO-Aware

核心贡献:通过 tiling + softmax rescaling 避免写中间矩阵到 HBM。

天真做法的问题

Standard attention 每一层要做:

1. 写入 S = Q @ K^T 到 HBM  (N² 大小)
2. 从 HBM 读 S,写入 P = softmax(S) 到 HBM
3. 从 HBM 读 P,写入 O = P @ V 到 HBM

HBM 读写次数:O(N²)——序列越长越致命。

FlashAttention 的三个洞察

洞察 1:Tiling 分块

把 Q、K、V 分成 tile(比如 128×128),一次处理一个 tile pair。整个 attention 变成两层 nested loop:

for K_tile in K_tiles:
    for Q_tile in Q_tiles:
        # 一次只算 128×128 大小的 S_tile
        S_tile = Q_tile @ K_tile.T
        P_tile = softmax(S_tile)
        O_tile += P_tile @ V_tile

关键:中间的 S_tile、P_tile 只在 SRAM 里(几十 KB),不写 HBM。

洞察 2:Online Softmax(softmax rescaling)

问题:softmax 是全局归一化,每个 tile 只看到部分数据怎么算?

解法:在线更新分子分母。每处理一个 tile,用当前 max 值 rescale 之前的累加结果:

prev_max = -inf, prev_sum = 0, prev_O = 0

for each K_tile, V_tile:
    S = Q @ K_tile.T
    new_max = max(prev_max, S.max())
    exp_scale = exp(prev_max - new_max)          # rescale 因子
    P = exp(S - new_max)
    new_sum = prev_sum * exp_scale + P.sum()
    new_O = prev_O * exp_scale + P @ V_tile
    # 更新
    prev_max, prev_sum, prev_O = new_max, new_sum, new_O

O = prev_O / prev_sum

关键:每次遇到更大的 max,把之前的累加结果乘以 exp(旧max - 新max) 修正——数学上完全等价于全局 softmax,但只需要流式处理。

洞察 3:Recompute for Backward

Backward 需要中间矩阵。传统做法是训练时把 P 存下来(HBM 巨大开销)。

FA 做法:不存,backward 时重新算一遍 forward(tile 级)。看起来算力翻倍,但backward 本来就 memory-bound——重算反而比读 HBM 快。

收益

  • HBM 读写 O(N²) → O(N)(跟着 tile 数量走,不是 tile 内元素数)
  • 内存占用 O(N²) → O(N)(不用存 P)
  • 实际 wallclock 加速 2-4x
  • 原生支持 causal mask、sliding window、dropout 等变体

FA1 发布在 A100 时代(2022),当时的 attention 从"性能瓶颈"变成"可以忽略的开销"——直接催生了长上下文 LLM 的爆发(GPT-4 128K、Llama 3 1M)。

FA1 是 IO-aware 算法设计的教科书案例——算法的胜利不来自更少的算力,来自更聪明地使用内存层级。


第二代 · FlashAttention-2 (2023) · Work Partitioning

核心贡献:重新设计 work partitioning,让 GPU 各级并行度都吃满。

FA1 的三个遗留问题

FA1 在 A100 上能到理论峰值的 50-70%——但 30% 还没吃到。三个原因:

问题 1:Warp 之间不平衡

FA1 沿 K/V 维度做外层循环,每个 warp 处理不同的 K/V tile。但 softmax 需要全局归一化,每个 warp 算完还要跟其他 warp 通信合并——大量 warp 间同步开销。

问题 2:非 GEMM 计算太多

Softmax 里的 exp、max、sum 都是 non-GEMM 操作,Tensor Core 空转。FA1 里 non-GEMM 占了 30-40% 时间。

问题 3:Backward 效率低

FA1 的 backward 用了跟 forward 相同的分块策略,但 backward 的 work pattern 不同,导致利用率低。

FA2 的三个改进

改进 1:Loop order 反转

FA1: outer loop 沿 K/V,inner loop 沿 Q → warp 之间要合并 O 的中间累加

FA2: outer loop 沿 Q,inner loop 沿 K/V → 每个 warp 独立算完自己的 Q tile,不用跟其他 warp 通信

这个改动看似小,实际是根本性的——一个 warp 完整拥有一个 Q tile 的所有计算,warp 间零同步。

改进 2:减少 non-GEMM 操作

FA1 每处理一个 tile 都做一次 rescale。FA2 观察到——rescale 的 exp(diff) 不需要每次都算,可以延迟到最后才算。这样中间循环只做累加,只在最后一次 rescale 一下。

结果:non-GEMM 时间从 30% 压到 15%。

改进 3:更好的 backward 分块

Backward 沿 K/V outer + Q inner,跟 forward 反过来。避开 backward 的 work pattern 瓶颈。

收益

  • FA2 vs FA1:加速 2x(A100 上从 30% 峰值到 70% 峰值)
  • 训练速度显著提升——Llama 2 训练里 attention 部分不再是瓶颈
  • 成为 PyTorch 官方 scaled_dot_product_attention 的默认后端

FA2 是**"细节里的胜利"**——没有新算法,就是把 FA1 的 work partition 重新想了一遍,2x 就出来了。

但 FA2 在 H100 上只有 35% 利用率——因为它是为 Ampere 设计的,没用上 Hopper 的新硬件特性。这个坑逼出了 FA3。


第三代 · FlashAttention-3 (2024) · Hopper Async

核心贡献:利用 Hopper 的三大新特性——WGMMA、TMA、FP8——把 H100 峰值利用率从 35% 拉到 75%。

Hopper 新特性

特性 1:WGMMA (Warpgroup Matrix Multiply-Accumulate)

Hopper 引入了新的 tensor core 指令 wgmma,比 Ampere 的 mma.sync 快 50%。关键区别:wgmma 是异步的——发起指令后 CPU(其实是 SM 的其他 warp)可以继续做别的事,等结果时再显式 wait。

特性 2:TMA (Tensor Memory Accelerator)

Hopper 专门加了一个硬件单元来做 HBM ↔ shared memory 的数据搬运:

  • 自动算 index、越界检查
  • 异步——发起 TMA 后 warp 可以继续做别的
  • 释放寄存器压力——不用 warp 手动搬数据

特性 3:FP8

Tensor core 的 FP8 吞吐是 FP16 的 2x(989 TFLOPS → 1978 TFLOPS)。

FA3 的三个核心技术

技术 1:Warp Specialization

传统 kernel 里,一个 warp 什么都干——搬数据、算 GEMM、算 softmax。FA3 把不同职责分给不同 warp group:

Warp Group 1 (Producer):  只做 TMA 数据搬运(HBM → SRAM)
Warp Group 2 (Consumer):  只做 WGMMA + softmax 计算

Producer 用 TMA 异步搬数据,Consumer 消费。两组人马各干各的,通过 barrier 同步——就像 pipeline 里的生产者-消费者。

收益:数据搬运和计算完全 overlap,理论峰值从 570 TFLOPS 提到 620 TFLOPS。

技术 2:Pingpong Scheduling — Warp Group 之间 overlap GEMM 和 Softmax

问题:H100 上 GEMM 是 989 TFLOPS,exp 只有 3.9 TFLOPS(差 256 倍)。head dim 128 时,exp 的时间跟 GEMM 的时间差不多——这时候不 overlap 就浪费一半。

Pingpong Scheduling:

时间轴:
Warpgroup 1: [GEMM1][GEMM0'][Softmax0'][GEMM1'']...
Warpgroup 2:     [Softmax1][GEMM1'][Softmax1']...

同色 = 同一次迭代

两个 warpgroup 轮流做 GEMM 和 Softmax——一个在 tensor core 上跑 GEMM,另一个同时在 multi-function unit 上跑 softmax。tensor core 和 MFU 完全并行。

收益:570 → 620 TFLOPS(+9%)。

技术 3:Intra-Warpgroup Overlap — 一个 warp group 内部再 overlap

哪怕在同一个 warp group 里,也能挤时间:

一个 warp group 内部:
  GEMM 输出的一部分先出来 → 立刻开始 softmax
  Softmax 处理时 GEMM 的另一部分还在算

代价:需要更多 register 存中间态。但 register pressure 换来 620 → 660 TFLOPS。

技术 4:Incoherent Processing for FP8

FP8 attention 有个致命问题——LLM activation 有 outlier(少数值极大),量化到 FP8 时误差爆炸。

FA3 借鉴 QuIP 论文的技巧——用 Hadamard transform 打散 outlier:

Q' = Hadamard(Q)     # 打散 Q 的 outlier
K' = Hadamard(K)     # 打散 K 的 outlier
S = Q' @ K'.T        # 数学等价(Hadamard 是正交矩阵)

关键性质:Hadamard 是正交矩阵 → 不改变 attention 的数学结果。

性能技巧:Hadamard transform 是元素级 memory-bound,可以跟 RoPE 融合——for free!

收益:FP8 attention 的量化误差降低 2.6x。

FA3 综合收益

  • FP16: 740 TFLOPS(H100 峰值 75%)—— 比 FA2 快 1.6-2x
  • FP8: 接近 1.2 PFLOPS(1200 TFLOPS)—— 误差比 baseline FP8 attention 小 2.6x

FA3 是"硬件深度感知的算法设计"——每一个技术都是为 Hopper 的具体特性量身定做。移植到 Ampere 或 AMD 就跑不出这个数字。


第四代 · FA4 for Blackwell (2025-2026 进行中)

Blackwell (B200/B300) 又带来了新东西:

  1. TMEM (Tensor Memory):新的片上存储层次,比 SRAM 更大更快
  2. FP4 Tensor Cores:FP8 之外再翻倍
  3. CTA Clusters:多个 CTA 可以直接共享 shared memory,减少 HBM 同步

FA3 的 pingpong 在 Blackwell 上已经不是最优——因为:

  • CTA cluster 让"数据共享"从 HBM 层下沉到 shared memory 层
  • TMEM 让中间结果不用回 register 或 shared memory
  • FP4 让 non-GEMM 的相对开销再次变大(因为 GEMM 又翻倍了)

FA4 目前处于开发中(截止 2026-07-30 尚无正式发布 blog)。已知路线图:

  • 用 CTA cluster 做跨 CTA 的数据共享(替代 warp group 之间的 shared memory)
  • 用 TMEM 存 accumulator,避免 register 溢出
  • 更激进的 FP4 支持(连 KV cache 都 FP4)
  • 针对decode 场景(batch=1,超短 query)的专门优化——因为 decode 时 tiling 策略跟 prefill 完全不同

vLLM 内部已经开始集成 CUTLASS 4.x 提供的 Blackwell attention kernel(FlashInfer for B300 项目在跟进)。


一张表看清三代差异

维度 FA1 (Ampere) FA2 (Ampere) FA3 (Hopper)
主要贡献 Tiling + Online Softmax Work partition 反转 Async + Pingpong
HBM 访问 O(N²) → O(N) 同 FA1 同 FA1,但 TMA 硬件加速
Warp 分工 每 warp 一 K/V tile 每 warp 一 Q tile Producer / Consumer warp
GEMM/Softmax overlap 无 部分(延迟 rescale) 完全(Pingpong + intra-WG)
Tensor Core mma.sync (sync) mma.sync (sync) wgmma (async)
量化 FP16 FP16 FP16 + FP8 + Incoherent
A100 峰值利用率 ~50% ~70% N/A
H100 峰值利用率 N/A ~35% ~75%
代码复杂度 中 中 高(多 warp group + async)
发布年 2022 2023 2024

FA 系列的三个通用启示

启示 1:算法的胜利来自 IO 建模

FA1 最深的洞察不是"分块"——分块从 CUDA 诞生就有——而是把内存层次显式建模到算法里:

不要问"这个算法需要多少 FLOPS",问"这个算法在多少字节 HBM 带宽下能跑多快"。

现代 GPU 已经算力过剩,瓶颈永远是内存(HBM 带宽、SRAM 容量、寄存器数量)。IO-aware 算法设计是 AI Infra 领域最关键的思维方式。

这也是 DeepSeek V4 稀疏 attention 的哲学——它降低的不是 FLOPS,是KV cache 内存。

启示 2:硬件-算法 co-design 有代际红利

FA1 在 A100 上是 SOTA。FA2 依然是 A100 SOTA——但 FA1/FA2 到了 H100 只能到 35%。FA3 用 Hopper 特有的 async + WGMMA + TMA 特性,直接翻倍。

每代新硬件都会重新洗牌——旧代 SOTA 到新代可能连 40% 都吃不到。这是硬件厂商的护城河,也是 kernel 工程师永远有活干的原因。

启示 3:Non-GEMM 是攻不下的天花板

不管怎么优化,H100 的 exp 只有 3.9 TFLOPS——比 GEMM 慢 256 倍。这个数字从设计层面就决定了:MFU 单元是共享的,不可能给它加更多硅面积。

Softmax 是 attention 的天然瓶颈,这就是为什么:

  • Linear attention(省掉 softmax)一直是研究热点
  • Mamba/SSM 用状态空间模型完全绕过 softmax
  • DeepSeek V4 用稀疏 attention 减少 softmax 的输入规模

每一个绕开 softmax 的尝试,本质上都是在攻这个 256x 的差距。


附:素材来源

主线

论文

代码

姊妹篇


整理于 2026-07-31 深夜。原文技术细节归属 Tri Dao 团队与相关论文作者。中文表达可能有解读偏差,请以原文为准。

Zoe

Written by

Zoe

AI Infra Engineer · LLM Serving · GPU/RDMA · 造工具的偏执狂

评论