大模型生成文字的两个阶段:「理解」和「输出」
阅读时间 ~10 分钟
当你向大模型提问时,模型并不是"思考一下然后回答"——它其实经历了两个截然不同的阶段。就像考试一样:先读题,再写答案。
第一个阶段叫 Prefill,模型一次性"阅读"你的全部输入;第二个阶段叫 Decode,模型开始一个字一个字地"书写"回答。
在 Prefill 阶段,模型将你的所有输入 token 并行处理。这意味着无论你的 prompt 有 10 个 token 还是 1000 个 token,它们都是"同时被理解"的——就像 GPU 同时运算数千个矩阵乘法。
在这个过程中,模型为每个 token 计算出一对向量:K(Key)和 V(Value),存入 KV Cache。这个缓存会在后续的 Decode 阶段反复使用,避免重复计算。
输入 Token(点击播放后全部同时亮起):
Prefill 的计算量与输入长度的平方成正比(因为 Attention 机制),因此长 prompt 会显著增加 Prefill 时间。但好消息是:这些计算高度并行,GPU 可以充分利用其算力。
Prefill 完成后,模型进入 Decode 阶段。此时模型逐个生成 token:每生成一个 token,都会把它作为输入送回模型,生成下一个 token。这就是所谓的 auto-regressive(自回归)生成。
关键优势在于:每次生成新 token 时,模型不需要重新处理之前的所有 token——它直接读取 KV Cache 中已存储的信息。这意味着每次只需做一次前向传播。
Decode 阶段的瓶颈不在计算量——每次只处理 1 个 token 的计算其实很少——而在于内存带宽。每生成一个 token,都需要将整个模型的权重从显存读入计算单元。模型越大,读取越慢。
理解了两个阶段,我们就能理解两个关键性能指标:
TTFT (Time To First Token) —— 从你发送请求到看到第一个字的等待时间。这个时间主要由 Prefill 阶段决定。prompt 越长,TTFT 越大。
TPS (Tokens Per Second) —— 模型输出文字的速度。这个由 Decode 阶段的单 token 生成时间决定,与 prompt 长度几乎无关。
拖动滑块改变 Prompt 长度,观察 TTFT 如何变化:
Prefill 和 Decode 面临的硬件瓶颈完全不同。理解这一点,就理解了为什么不同的硬件架构在这两个阶段有不同的表现。
大量并行矩阵运算
GPU 满负荷工作
每次只处理 1 个 token
但要读取全部模型权重
并行处理所有输入 token,构建 KV Cache。计算密集型,GPU 满载运行。
自回归逐 token 生成,复用 KV Cache。内存带宽密集型,算力利用率低。
TTFT 取决于 Prefill 速度,TPS 取决于 Decode 速度。两者优化方向不同。
KV Cache 连接两个阶段,用空间换时间,避免 Decode 时重复计算。
"理解 Prefill 和 Decode,就理解了为什么大模型'先等后快'——以及如何优化它。"
下一篇我们讲 ANE 如何用混合推理将 Prefill 加速 11.3 倍