MLE / Research · ML Fundamentals

TikTok FlashAttention:分块在线 Softmax 与 IO 成本

保持精确attention目标,解释跨块max/分母/分子重标定,不把显存优化当线性计算。

题目重点:保持精确attention目标,解释跨块max/分母/分子重标定,不把显存优化当线性计算。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 讨论经典IO-aware精确attention思想,浮点舍入可有差异,不限定GPU kernel版本。
  • 完整矩阵算术仍为二次长度量级,优化主要避免大中间矩阵和慢内存往返。

解题路线

  1. 普通流程把QKᵀ写HBM,再softmax读写权重,最后乘V,n²中间张量增加显存与带宽。分块将部分Q/K/V载入快速存储,直接累计输出。
  2. 每query维护running max m、指数和l、加权分子o。新块最大值改变到m_new时,把旧l/o乘exp(m_old−m_new),再加该块exp(score−m_new)贡献。
  3. 重标定不可漏:不同块各自softmax再简单平均不是全局softmax,因为块分母/最大值不同。最后输出o/l实现跨全部合法keys的归一化。
  4. causal/padding mask在score贡献前应用,整行遮蔽仍需规定;分块边界不能让未来key参加分母。dropout/backward需保存或重建一致随机信息。
  5. 避免存全部attention概率,反向可重算局部scores而用额外算术换显存IO;并不是剪掉低权重key或近似核,所以与linear attention的目标不同。
  6. 实际加速取决于硬件、tile、dtype、序列长和head维;小shape或其他瓶颈不保证收益。应用应对照完整reference输出/梯度、峰值显存和端到端吞吐。

手动走一遍

第一块score较低、第二块较高,新的max增大后必须把第一块旧指数权重按exp(old−new)缩小;各块独立归一化并拼接会让两块各自总权重1,最终错误。

规模与取舍

经典dense算术仍O(n²d),避免O(n²)权重驻留,工作张量常线性于n加块存储;IO规模依片上存储和tile,不能宣称所有维度无条件O(n)。

易错点与追问

容易失分的边界

  • FlashAttention是稀疏/近似attention。
  • 分块softmax简单平均。
  • 显存线性就称FLOPs线性。

继续深挖

  • online max重标定怎样推?
  • 反向重算如何保证dropout一致?
  • 与KV cache/GQA分别优化什么?

技术参考

✓已复制微信号!