FlashAttention

别名:闪存注意力 / Flash Attention

通过分块计算和在线 softmax,减少注意力对高带宽显存的反复读写。

更新于 2026/11/08
AttentionGPU长上下文

一句话定义

FlashAttention 是一种 IO 感知的注意力实现:它不把完整的注意力矩阵写回显存,而是把计算切成小块,在片上高速缓存里完成,并用在线 softmax 逐步累积结果。

问题出在哪

标准注意力要先算出完整的 N×N 分数矩阵,再 softmax、再乘 Value。序列越长,这个中间矩阵越大,GPU 需要在显存和计算单元之间反复搬运数据。很多长上下文场景的瓶颈不是算力,而是显存带宽。注意力算子的算术强度低,数据搬运往往比乘加更先成为瓶颈。

关键机制

  • 分块(tiling):把 Q、K、V 切成能放进片上缓存的小块,逐块计算。
  • 在线 softmax:不一次性拿到整行分数,而是边算边维护最大值和归一化因子,最后得到等价结果。
  • 重计算:反向传播时不保存完整中间矩阵,用重算换显存。
  • 数学结果与标准注意力一致,不是近似算法。

FlashAttention:分块计算,减少 HBM 读写

实际收益

  • 显著降低显存占用,让更长序列和更大 batch 成为可能。
  • 减少显存读写后,训练和推理速度通常都有提升。
  • 与 KV Cache 配合时,主要优化的是注意力计算本身,而不是缓存管理。
  • 短序列下收益可能不明显,长序列和高 batch 更能体现。

用在哪里

  • 长上下文训练/推理、需要降低显存占用或提高吞吐的注意力实现。
  • 短序列、算力受限或硬件不支持时,收益有限,未必值得替换基线实现。

常见误区

  • FlashAttention 不是稀疏注意力,也不改变注意力的语义。
  • 它不能单独解决 KV Cache 的显存增长问题。
  • 是否加速取决于硬件、序列长度和实现版本,短序列下收益可能有限。

相关概念