01
60 秒回答模板
FlashAttention 更适合 Prefill,是因为 Prefill 阶段一次处理整段 prompt,query length 和 key length 都比较长,注意力计算接近大块矩阵运算,GPU 有足够的 batch、head 和 sequence 维度并行。标准 attention 会显式生成或读写很大的 attention matrix,HBM 读写压力高;FlashAttention 用 tiling、online softmax 和重计算,把 QK、softmax、PV 融合在片上存储附近完成,减少 HBM 访问,所以在长序列 Prefill 中收益明显。
Decode 阶段的形态完全不同。每一步只生成一个新 token,query length 通常是 1,但它必须 attend 到历史所有 token 的 KV cache。此时计算量不大,却要从显存读取大量 K/V,算术强度低,主要受 memory bandwidth 限制;如果 batch 小、head 数有限,每个 head 只有一个 query,传统 FlashAttention 能用的并行维度不足,SM occupancy 低,长上下文下每 token latency 会被 KV cache scan 拖住。Decode 还具有强串行性,下一个 token 依赖上一个 token,不能像 Prefill 一样把整个输出序列并行展开。
Flash Decoding 的优化思路是针对 decode attention 重新组织并行:把 KV cache 沿 sequence length 切成多个 block,让多个 thread block 并行读取不同 KV 分片,分别计算局部 attention、局部 softmax 统计量和局部输出,然后用稳定的 log-sum-exp 方式重标定并合并 partial results。这样可以把长上下文 KV 读取尽可能并行化,提高 SM 利用率,尤其适合长 context、小 batch 或 attention 在 decode 中占比很高的场景。评估时要分开看 TTFT、prefill tokens/s、decode tokens/s、per-token latency、P50/P95 延迟、显存带宽利用率和端到端吞吐,不能只拿单个 kernel speedup 代表整体收益。
考点 Prefill 并行度高
难度 真实面经题
回答目标 让面试官看到你能从计算图、访存、并行度和服务指标四个角度解释 Prefill/Decode 差异,并能说明 Flash Decoding 的真实优化点。
02
深入解析
01 Prefill 是大块并行计算
Prefill 处理 prompt 中所有 token,Q/K/V 的序列长度都较大,attention 更像密集矩阵计算。GPU 可以沿 batch、head、query block 和 key block 并行,算术强度较高,因此减少中间矩阵读写会直接转化为吞吐收益。
02 FlashAttention 的优势是 IO-aware
FlashAttention 不改变 exact attention 结果,而是通过分块、online softmax 和融合 kernel 减少 attention score 与 softmax 中间结果在 HBM 中的读写。它解决的是标准 attention 对显存访问不友好的问题,尤其适合长序列 Prefill 和训练场景。
03 Decode 是单 token 串行生成
Decode 每次只有一个新 query,要读取所有历史 K/V。输出 token 之间有自回归依赖,不能并行生成完整答案。此时 attention 的 FLOPs 相对少,但 KV cache 读取量随上下文长度增长,瓶颈从计算转向显存带宽和访存延迟。
04 传统并行维度在 Decode 不够
在 Prefill 中 query length 提供大量并行任务;Decode 中 query length 为 1,如果 batch 较小、head 数有限,kernel 只能启动有限 block,很多 SM 吃不满。长上下文反而让单个任务读取更多 K/V,却没有足够并行度隐藏延迟。
05 Flash Decoding 切分 KV 序列
Flash Decoding 把 KV cache 沿时间维或 block 维拆开,让多个 thread block 并行处理同一个 head 的不同上下文片段。每个片段产生局部 softmax 统计和局部输出,最后做数值稳定的 rescale 与 reduce,得到和完整 attention 一致的结果。
06 指标要区分延迟和吞吐
Prefill 主要影响首 token 时间和 prompt 处理吞吐;Decode 主要影响每 token latency、持续生成 tokens/s 和并发吞吐。长上下文服务要同时看 TTFT、TPOT、P95、batch size、context length、KV cache 显存占用和带宽利用率。
03
易错点
- 把 FlashAttention 和 Flash Decoding 混为一谈,忽略 Prefill 与 Decode 的 query length 差异。
- 只说 Decode 慢是因为计算量大,没指出 KV cache 读取和显存带宽才常是长上下文瓶颈。
- 只看 tokens/s,不区分 TTFT、TPOT、P95 latency 和并发吞吐。
- 认为 KV cache 解决了 Decode 的全部问题,忘记每步仍要读取历史 K/V。
- 没有考虑 batch size、head 数、context length 对 SM occupancy 的影响。
04
面试官追问
为什么 FlashAttention 在 Decode 阶段不能直接获得同样收益?
因为 Decode 的 query length 通常只有 1,缺少 Prefill 中的大量 query block 并行。即使减少了中间结果读写,主要成本仍是从 KV cache 读历史 token,且小 batch 时 SM occupancy 不足,所以需要针对 decode 形态重新切分 KV 并行。
长上下文下 Decode 的复杂度怎么理解?
每生成一个 token,都要和历史 L 个 token 的 K/V 做 attention,因此单步 attention 的访存量近似随 L 增长。KV cache 避免了重复计算历史 K/V,但没有避免读取历史 K/V,所以长上下文生成仍会变慢。
Flash Decoding 对哪些场景收益最大?
通常是长 context、小 batch、每步 attention 占比较高、GPU SM 利用率不足的场景。如果 batch 已经很大或瓶颈在 MLP、采样、网络调度、CPU 调度,Flash Decoding 的端到端收益会变小。
如何做线上性能验证?
要固定模型、精度、context length、输出长度和 batch 策略,对比 TTFT、TPOT、tokens/s、P95 延迟、GPU 利用率、HBM 带宽、KV cache 显存和失败率。还要分短 prompt、长 prompt、低并发和高并发切片,否则容易把 prefill 收益和 decode 收益混在一起。