Token Lab搜索

← 论文资料库
注意力与高效推理 / 2022

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 代数为内存局部性重新组织。反向计算可以重算中间量,而不保留完整概率矩阵。

符号与直觉为教学解释,完整假设及实现细节请对照原论文方法。

机制图与逐步推导

从 HBM 读取 Q/K/V 分块 → 在 SRAM 计算分数块 → 合并运行 m、l、u → 写入归一化输出
原创机制示意图,按从上到下顺序阅读。 SVG ↓
符号与假设
符号含义
m分数行运行最大值
l指数项运行分母
uvalue 加权运行分子
  1. 把 [2,1,0] 分为 [2,1] 与 [0],value 分别为 [1,3] 与 [5]。第一块后 ,,。
  2. 下一块最大值较小,因此 m 仍为 2。l 增加 e⁻²,u 增加 5e⁻²,最终 u/l 与稠密注意力相同,约 1.849579。
  3. 再反转块顺序,运行最大值从 0 增为 2。因此旧 l 与旧 u 都必须先乘 e⁻²,再加入第二块。这是合并的关键不变量。
实验检查点

测试反向块顺序、极端 logits 和不完整末块。代数精确仍可能有浮点容差差异。

LOCAL / SYNTHETIC / INTERACTIVE

改变一个变量,解释结果为什么变。

原创教学计算,并非论文 benchmark 复现。条形在面板内相对缩放,具体数值与单位以标注为准。

04 · 手算一个例子

原创内存算例: 时,每个 head 的一张 FP16 稠密分数矩阵占 N²×2 字节,即 32 MiB,尚未计入其他张量。128×128 分数块占 32 KiB;这只是分数临时空间,不是 FlashAttention 完整工作集或模型总内存。N 翻倍时稠密分数存储变为四倍,所选分块尺寸可以不变。

05 · 设计实验

在小 CPU 数组上实现稠密与分块 softmax 注意力,按容差比较输出,覆盖大 logits 和因果边界。真实 GPU 基准应预热、同步计时、固定 dtype 与 head 维度,记录峰值分配内存,并分开正向和反向。报告运行时间分布,而非一次冷启动数值。

研究交付物

写出一个假设,保存配置与原始结果,提出替代解释,只报告证据支持的结论。关联实验是本地起点,不是完整论文复现。

打开关联课程/实验 →

06 · 局限与审稿式追问

分析提醒:浮点归约顺序改变,因此数值等价需用容差判断。精确注意力在序列长度上仍有二次算术量。仅凭分块图无法预测加速,还要考虑 SRAM 容量、带宽、占用率与 kernel 启动开销。

运行最大值增大时,为什么旧分子也必须缩放?

旧项相对于旧最大值表达。乘以 exp(m−m′) 才能使新旧贡献处于同一指数尺度,否则合并后的平均值错误。

07 · 阅读原文

Algorithm 1 与 IO 分析;明确区分精确和块稀疏变体。

年份采用首次 arXiv 投稿年份。未锁定版本的链接随修订变化,复现报告请记录准确版本。此处 DeepSeek-R1 明确固定为 v1。

继续学习本主题

MATHEMATICAL REVIEW · 2026-10-26

假设、参考实现与验收

运行最大值初始化为 −∞,归一化量及累积量为零。跳过空块和完全遮罩块;全遮罩行无法定义概率分布。分块减少物化内存,不消除稠密计算的平方复杂度。

复核所示公式、中英解释及声明滑块范围。代码复现标量教学计算,不是论文训练系统。

运行前:预测一个边界情况

在小 CPU 数组上实现稠密与分块 softmax 注意力,按容差比较输出,覆盖大 logits 和因果边界。真实 GPU 基准应预热、同步计时、固定 dtype 与 head 维度,记录峰值分配内存,并分开正向和反向。报告运行时间分布,而非一次冷启动数值。

提示:隔离假设

固定基线输入,只改变一个参数或边界;同时比较数值与声明单位。单例通过仅验证该样例。

最小可运行算例

将算例及所链接模块保存在同一目录。使用 Node.js 22 或更高版本,然后运行 node flashattention.mjs. 无需第三方运行依赖。

import {paperCalc} from './paper-core.mjs';
const result=paperCalc("flash",4096);
console.log(result);
参考输出——先预测再展开
{
  "labels": [
    "Dense score matrix",
    "128×128 score tile only"
  ],
  "values": [
    32,
    0.03125
  ],
  "unit": "MiB"
}

测试与迁移

在小 CPU 数组上实现稠密与分块 softmax 注意力,按容差比较输出,覆盖大 logits 和因果边界。真实 GPU 基准应预热、同步计时、固定 dtype 与 head 维度,记录峰值分配内存,并分开正向和反向。报告运行时间分布,而非一次冷启动数值。

在下方笔记记录输入、代码版本、期望值和实测值;再构造违反上述假设的反例,解释原结论为何不再成立。

下载完整代码包(.tar.gz) · 完整参考代码与回归检查

预测、检验与证据记录

展开答案前先预测一个结果;练习后记录差异和迁移测试。记录仅存本地,在不同语言版本间共用。

打开记录/导出/清除 →

数学复核范围逐篇记录,不代表完成论文实证复现;可在笔记中记录疑似错误。 复核范围