标准 Attention 的真正瓶颈
标准实现需要把中间矩阵 S = QKᵀ(N×N)和 softmax(S) 完整写回 HBM。问题在于:
Attention 是 memory-bound(带宽受限),而非 compute-bound。
HBM 带宽远低于片上 SRAM,频繁读写 N×N 矩阵成为瓶颈。
FlashAttention 的两个关键技术
1. Tiling(分块)
将 Q/K/V 切成小块,逐块载入 SRAM,在片上完成局部计算,避免实例化完整的 N×N 矩阵。
2. Online Softmax(在线 softmax)
softmax 需要全局归一化,但分块计算时看不到全局。FlashAttention 用增量更新的方式维护运行中的最大值和分母:
m_new = max(m_old, m_block)
l_new = exp(m_old - m_new) * l_old + exp(m_block - m_new) * l_block
这样无需保存完整的 S 矩阵也能得到数值正确的结果。
复杂度对比
- 标准:HBM 访问 O(N²)
- FlashAttention:HBM 访问 O(N²/M),M 为 SRAM 能容纳的 block 大小
实测 A100 上比 PyTorch 原生实现快 2~4 倍,且数值等价(非近似)。
小结
FlashAttention 的精髓不是减少计算量,而是减少慢速显存访问——这是 IO-aware 算法设计的典范。
1