
🧠 记忆锚点:Prefill 并行吃完整提示,决定首 token;Decode 串行追加 token,决定流式速度。
💡 答案要点
自回归生成 = 逐个生成 token,每个 token 依赖前面所有 token
两个阶段:
┌─────────────────────────────────────────────────────────┐
│ LLM 推理两阶段 │
└─────────────────────────────────────────────────────────┘
Prefill(预填充)阶段:
输入:用户提示词(如 1000 tokens)
输出:第一个生成 token
特点:并行计算,计算密集
Decode(解码)阶段:
输入:已生成的 tokens
输出:下一个 token
特点:串行生成,访存密集详细对比:
| 维度 | Prefill | Decode |
|---|---|---|
| 计算模式 | 并行(整个 prompt) | 串行(一个 token) |
| 计算量 | 大(O(n²)) | 小(O(n)) |
| 瓶颈 | 计算(Compute-bound) | 内存(Memory-bound) |
| GPU 利用率 | 高(80-90%) | 低(5-15%) |
| 延迟 | 一次性(200-500ms) | 累积(每个 20-50ms) |
| KV Cache | 生成 | 复用 |
示例(生成 "今天天气真好"):
输入:"请用5个字描述今天的天气"(15 tokens)
Prefill 阶段:
输入:整个 prompt(15 tokens)
计算:一次性算出所有 token 的 KV
输出:"今"
时间:200ms
Decode 阶段:
循环5次:
输入:"今" → 输出:"天"(50ms)
输入:"今天" → 输出:"天"(50ms)
输入:"今天天" → 输出:"气"(50ms)
输入:"今天天气" → 输出:"真"(50ms)
输入:"今天天气真" → 输出:"好"(50ms)
总时间:250ms
总延迟:200ms + 250ms = 450ms优化策略:
| 阶段 | 优化方向 | 技术 |
|---|---|---|
| Prefill | 提升计算效率 | FlashAttention、Tensor并行 |
| Decode | 减少内存访问 | KV Cache量化、PagedAttention |
面试话术:
"Prefill 是一次性算完 prompt,Decode 是逐个生成。Prefill 吃算力,Decode 吃带宽。优化重点完全不同。"