FlashAttention 是一种针对 Transformer 注意力计算的高效 CUDA 实现算法,由 Tri Dao 等人在 2022 年提出。
它要解决的核心问题是:标准 Attention 需要显式存储 N×N 的注意力矩阵,显存占用 O(N^2),而且大量时间花在 HBM 读写上,导致长序列训练和推理又慢又吃显存。
FlashAttention 的核心做法是:
效果是:
一句话总结:FlashAttention 用分块计算和在线 softmax,把 Attention 从“显存带宽受限”变成“计算受限”,实现了省显存和提速的双赢,而且是精确计算,不是近似。
它后续还有 FlashAttention-2、FlashAttention-3,分别针对并行划分和 Hopper 架构做了进一步优化。现在 PyTorch 的 scaled_dot_product_attention、vLLM、TensorRT-LLM 等主流框架都已集成。
FlashAttention 和 PagedAttention有区别,而且区别还挺大。它们虽然名字里都有 “Attention”,但解决的是完全不同层面的问题,经常被放在一起用,但不是同一类东西。
简单说:
可以从几个维度对比:
| 维度 | FlashAttention | PagedAttention |
|---|---|---|
| 解决的问题 | 注意力计算慢、HBM 读写多 | KV Cache 显存碎片、利用率低 |
| 优化对象 | 计算过程 | 存储管理 |
| 核心思想 | Tiling + online softmax + 重计算 | 分页 + block table + 按需分配 |
| 主要收益 | 省显存、提速,长序列更明显 | 省显存、提吞吐,高并发更明显 |
| 适用阶段 | 训练和推理都可用 | 主要用于推理 |
| 代表框架 | PyTorch SDPA、FlashAttention 库 | vLLM |
| 是否改变计算结果 | 不改变,精确计算 | 不改变注意力数学,只改变 KV 存储方式 |
具体来说:
FlashAttention 关心的是“算”。标准 Attention 要显式生成 $N \times N$ 的注意力矩阵,显存 $O(N^2)$,而且大量时间花在 HBM 读写上。FlashAttention 通过分块、online softmax、重计算,把中间矩阵留在 SRAM 里,不写回 HBM,从而把显存降到 $O(N)$,速度提升 2–4 倍。它不关心 KV Cache 在显存里怎么组织,只关心一次注意力计算怎么高效完成。
PagedAttention 关心的是“存”。推理时 KV Cache 会随着生成不断增长,传统方式按最大长度预分配连续显存,导致严重碎片和浪费。PagedAttention 把 KV Cache 切成固定大小的 block,用 block table 做逻辑到物理的映射,允许离散存储,显存利用率从 20%–40% 提升到 90% 以上,还支持前缀共享和 Copy-on-Write。它不改变注意力计算的数学,只改变 KV Cache 的存储和访问方式。
两者是互补关系。在 vLLM 这类现代推理框架里,常见做法是:
也就是说,PagedAttention 决定“KV 放在哪、怎么找”,FlashAttention 决定“拿到 KV 后怎么算得快”。一个管存储,一个管计算,合在一起才能同时拿到高显存利用率和低延迟。
一句话总结:FlashAttention 是计算层面的优化,PagedAttention 是存储层面的优化;前者让 Attention 算得更快,后者让 KV Cache 存得更省,两者结合才是推理优化的完整拼图。
评论专区
评论加载中...登录后即可发表评论