本页学习说明
固定一个 Q 块,逐次处理所有允许的 K/V 块。每块计算后释放局部分数,保留可合并分子 u、分母 l 与稳定尺度 m;全部块完成后才输出 u/l。这样的执行减少完整 S/P 表写回与再读,不删除合法位置,也不消除稠密配对的二次算术。
进一步阅读
条件与来源
以下从计算对象、条件与原始证据继续展开。
原 N23:算得快之外,还要装得下、搬得动
直接 attention 实现会生成分数矩阵,写入显存,再读出做 softmax,随后使用归一化权重汇总 V。HBM 容量、片上工作区容量、计算吞吐和数据搬运带宽是不同约束。这里先定位问题;N49–N51 回到同样的内存层级,用分块与在线归一化解释如何减少保存和搬运,不提前把名称当答案。
来源:FlashAttention v2,§3.1 IO 分析。
相关的完整阅读材料保留原有公式、引用和原始图解。
原 N49:同一张注意力大表,为什么要搬来搬去?
直接分步 attention 实现可能物化完整分数矩阵 S=QKᵀ,再写入 HBM;读出 S 做 softmax 得到概率 P,再写回;之后读取 P 与 V 相乘。蓝色箭头为读入片上、红色为写回。课堂路径代表会物化大中间表的一类直接实现,不表示所有现有库都如此。
T为序列长度。稠密关系按 query 与允许的 key 比较,分块不能随意漏掉本应参与的位置。片上工作区放不下整表时,可分块计算并保留可合并累计;难点是 softmax 仍需跨所有有效位置共同归一。
FlashAttention 的IO模型与范围;论文 §2、§3.1。
原 N50:分块以后,分子和分母都要一起接着算
原 N50 保留的校准算例:正权重w=(2,1,4),value=(10,20,30),前两项为块1、第三项为块2。
$$u_1=2\times10+1\times20=40,\quad l_1=2+1=3;\qquad u_2=4\times30=120,\quad l_2=4.$$
$$o=\frac{u_1+u_2}{l_1+l_2}=\frac{160}{7}\approx22.86.$$
直接平均两个局部均值是$(40/3+30)/2=65/3\approx21.67$,与正确输出不同,因为两块分母不等。
稳定递推。 logits=(ln2,0,ln4)。首块用m=ln2缩放,得到u=20、l=1.5;第二块的最大值ln4更大,旧分子和分母一起乘1/2,第二块贡献u_b=30、l_b=1。因此新u=40、l=1.75,输出40/1.75=160/7。一般公式为$m'=\max(m,m_b)$,$u'=e^{m-m'}u+e^{m_b-m'}u_b$、$l'=e^{m-m'}l+e^{m_b-m'}l_b$。
完整向量实现与因果mask见在线softmax正文。旧权重(2,1,3)与130/6只作为历史算例,不是原 N50 材料当前数据。
原 N51:全部块走完,写回的是同一个注意力输出
原 N51 材料把N50两块数值验证推广为三块过程示意,不把三块流程配成160/7这一数值结果。固定一个Q块,依次将所有允许的K/V块装入片上工作区,更新最大值m、归一化分母l与分子u。局部中间表释放后,累计量仍保留。第3块完成、所有允许位置都参与后,才计算u/l并写回该Q块输出。
训练反向可以按块重算所需中间量,以额外部分算术换取少保存、少搬运。FlashAttention 保持同类精确attention数学目标,浮点求值顺序变化不保证逐bit一致;稠密算术仍含$T^2$,T为序列长度。固定Q扫描KV是课堂执行视角,不声称逐行复现Algorithm1循环次序。
FlashAttention §3.1 / Algorithm1 / Theorem1;完整在线稳定递推、反向重算、MoE与KTransformers边界。
阅读完整讲义