Prefill 与 Decode
Prefill 与 Decode
LLM 推理分成两个完全不同的阶段,几乎所有推理优化都从理解这个不对称出发。
Prefill:把整个 prompt 一次性并行处理。因为所有 token 已知,可以排成矩阵做批量矩阵乘法,GPU 算力被充分利用。计算密集,产出第一个生成 token。
Decode:之后每生成一个 token 都必须等上一个出来,天生串行。每步只有一个新 token 做计算,GPU 算力大量闲置。内存密集(见 内存带宽瓶颈)。
反直觉的地方:Decode 慢不是因为算力不够,而是内存带宽跟不上。A100 有 312 TFLOPS 算力,但 Decode 时大量算力在等数据从显存里搬出来。
两个阶段的不对称是推理系统设计的根本矛盾:
- Batching 的目的是让 Decode 阶段多个请求共用一次权重搬运
- PD分离 是把两个阶段拆开,让它们各自针对自己的特性优化
- 投机解码 是唯一试图突破"每步只生成一个 token"限制的方法
相关来源
- llm-inference-tutorial:第1、2章有详细推导