FlashAttention:除了 FLOPs,还要算数据搬运
理解不保存注意力矩阵为何重要,并逐块重建 softmax。
FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness · Dao et al. · arXiv:2205.14135
Token Lab 原创学习解读 · 来源核对 2026-10-25 · 区分论文主张与合成教学例子。
01 · 论文提出了什么
FlashAttention 通过分块与在线归一化计算精确稠密注意力,减少 HBM 流量。稠密版本并非线性时间的近似注意力。论文加速结果依赖硬件和工作负载,不能当作浏览器基准结果。
一手来源:论文摘要 ↗学习指南与本课目录
LEARNING CONTRACT理解 → 实现 → 研究
目标:解释本课机制、复现一个例子、测试一个失败案例。读完不自动代表掌握。
- 理解层:写明假设、形状/单位和一个反例。
- 实现层:复算数值例子并检查边界。
- 研究层:在匹配预算下比较一个替代方法。
02 · 核心机制
Text / 原始公式
New tile scores s, values V: m′=max(m,max(s)) l′=exp(m−m′)l + Σ exp(sⱼ−m′) u′=exp(m−m′)u + Σ exp(sⱼ−m′)Vⱼ Output=u′/l′
行最大值 m、分母 l、加权分子 u 足以合并下一块。出现更大最大值时,先重新缩放旧累加器,再加入新块。这是相同 softmax 代数为内存局部性重新组织。反向计算可以重算中间量,而不保留完整概率矩阵。
符号与直觉为教学解释,完整假设及实现细节请对照原论文方法。
机制图与逐步推导
| 符号 | 含义 |
|---|---|
| m | 分数行运行最大值 |
| l | 指数项运行分母 |
| u | value 加权运行分子 |
- 把 [2,1,0] 分为 [2,1] 与 [0],value 分别为 [1,3] 与 [5]。第一块后
, , 。 - 下一块最大值较小,因此 m 仍为 2。l 增加 e⁻²,u 增加 5e⁻²,最终 u/l 与稠密注意力相同,约 1.849579。
- 再反转块顺序,运行最大值从 0 增为 2。因此旧 l 与旧 u 都必须先乘 e⁻²,再加入第二块。这是合并的关键不变量。
测试反向块顺序、极端 logits 和不完整末块。代数精确仍可能有浮点容差差异。
改变一个变量,解释结果为什么变。
原创教学计算,并非论文 benchmark 复现。条形在面板内相对缩放,具体数值与单位以标注为准。
04 · 手算一个例子
原创内存算例:
05 · 设计实验
在小 CPU 数组上实现稠密与分块 softmax 注意力,按容差比较输出,覆盖大 logits 和因果边界。真实 GPU 基准应预热、同步计时、固定 dtype 与 head 维度,记录峰值分配内存,并分开正向和反向。报告运行时间分布,而非一次冷启动数值。
写出一个假设,保存配置与原始结果,提出替代解释,只报告证据支持的结论。关联实验是本地起点,不是完整论文复现。
打开关联课程/实验 →06 · 局限与审稿式追问
分析提醒:浮点归约顺序改变,因此数值等价需用容差判断。精确注意力在序列长度上仍有二次算术量。仅凭分块图无法预测加速,还要考虑 SRAM 容量、带宽、占用率与 kernel 启动开销。
运行最大值增大时,为什么旧分子也必须缩放?
旧项相对于旧最大值表达。乘以 exp(m−m′) 才能使新旧贡献处于同一指数尺度,否则合并后的平均值错误。
07 · 阅读原文
Algorithm 1 与 IO 分析;明确区分精确和块稀疏变体。
年份采用首次 arXiv 投稿年份。未锁定版本的链接随修订变化,复现报告请记录准确版本。此处 DeepSeek-R1 明确固定为 v1。
继续学习本主题
Transformer:把 token 匹配程度变成信息流
跟踪 Q、K、V,解释因果注意力的一行,并区分并行训练与自回归生成。
Vaswani et al. · arXiv:1706.03762