# FlashAttention 短片讲解稿

长度：191.05 秒；中文合成旁白；中文字幕；1280×720 / 20 fps。

**00:00:00,000 · 大仓库与小工作台**
FlashAttention，为什么少搬数据，反而算得更快？我们用一段动画看懂它。

**00:00:07,095 · 大仓库与小工作台**
先把显存想成大仓库，把芯片上的高速存储想成小工作台。计算需要把数据搬到工作台附近。

**00:00:15,896 · 原始 Attention 的数据流**
普通注意力先用查询 Q 和键 K 计算分数表 S，再用 Softmax 得到权重表 P。

**00:00:22,716 · 原始 Attention 的数据流**
最后，用这些权重汇总 V，得到输出 O。这里先省略缩放和掩码，关注数据怎么流动。

**00:00:30,907 · 原始 Attention 的数据流**
如果这三个步骤分别执行，完整的 S 和 P 就可能写进显存，再被下一步读回来。

**00:00:38,048 · 中间矩阵为什么昂贵**
序列有四千零九十六个位置时，一张分数表就有一千六百多万个元素。

**00:00:44,271 · 中间矩阵为什么昂贵**
每元素两字节，一个头的一张表约三十二兆字节。S 和 P 两张表，合计约六十四兆字节。

**00:00:52,447 · 中间矩阵为什么昂贵**
序列长度翻倍，表的容量变成四倍。大量时间可能花在搬运中间结果上。

**00:00:59,293 · 第一招 · 分块**
FlashAttention 的第一招是分块。它只取一小块 Q，以及当前需要的 K 和 V 小块。

**00:01:06,522 · 第一招 · 分块**
在片上计算这一小块分数，立刻用它更新输出的累积量，然后复用空间处理下一块。

**00:01:14,029 · 第一招 · 分块**
需要关注的位置仍然都算，但不再把完整的 S 和 P 两张大表保存到显存。

**00:01:20,550 · 第二招 · 在线 Softmax**
第二招是在线 Softmax。它的分母需要整行数据，不能把每块各自归一化后直接平均。

**00:01:28,309 · 第二招 · 在线 Softmax**
看一个例子。分数取指数后是，一、二、四、三。对应的 V 是，十、二十、三十、四十。

**00:01:38,222 · 第二招 · 在线 Softmax**
完整计算的加权和是二百九十，权重总和是十。相除得到二十九。分块后也要得到这个结果。

**00:01:47,285 · 第二招 · 在线 Softmax**
先处理前两个数。为保持数值稳定，除以当前最大值二，得到零点五和一。

**00:01:54,497 · 第二招 · 在线 Softmax**
此时分母累积是一点五，分子累积是二十五。先记住它们，不急着给出最终输出。

**00:02:02,149 · 第二招 · 在线 Softmax**
下一块出现更大的值四。我们把旧分子、旧分母都乘以二分之一，统一到新的尺度。

**00:02:09,794 · 第二招 · 在线 Softmax**
新块除以四后是一和零点七五。加入它，分子变成七十二点五，分母变成二点五。

**00:02:17,744 · 第二招 · 在线 Softmax**
最后相除，仍然是二十九。实际实现记录分数的最大值，用指数缩放来完成这次修正。

**00:02:25,851 · 第三招 · 反向重计算**
第三招发生在训练反向。前向没有保存完整的 P，反向需要它时，就重新计算当前的小块。

**00:02:34,456 · 第三招 · 反向重计算**
它仍要保留输入、输出和少量行统计。多算一些，换掉大表的写入和读取，整体就可能更快。

**00:02:43,150 · 适用范围与关键结论**
记住三个动作：按块计算，在线归一化，反向按需重算。核心是减少中间数据的显存读写。

**00:02:51,945 · 适用范围与关键结论**
它保持相同的注意力数学定义，但浮点结果不保证逐位一致。密集注意力的计算量仍然随序列长度平方增长。

**00:03:01,201 · 适用范围与关键结论**
这个故事主要适用于训练和长序列预填充。逐词解码的形状不同，实际收益需要结合负载测量。

技术依据：[FlashAttention 论文](https://arxiv.org/abs/2205.14135)。
在线 Softmax 的例子用于教学；指数值 [1,2,4,3] 对应分数 [ln1,ln2,ln4,ln3]。
容量示例为每个头、每元素 2 字节、完整保存 S/P 的教学基线；不代表所有后端的峰值内存。