第 1 章 · KV Cache、Batching 与延迟指标
考点梳理
2.1 两阶段:Prefill 与 Decode(“优化的地图”)
| 阶段 | 干什么 | 瓶颈 | 决定什么 |
|---|---|---|---|
| Prefill(预填充) | 一次处理全部输入(算 KV) | 计算密集(算力) | TTFT(首 token 时延) |
| Decode(解码) | 逐 token 生成 | 显存带宽密集 | TPOT(每 token 时延) |
记忆锚:“Prefill 吃算力(一次性),Decode 吃带宽(吐字慢)”——“瓶颈在哪,优化就在哪”。
2.2 KV Cache(“显存的动态大头”)
为什么需要:自回归生成时,每个新 token 都要"看到"之前所有 token 的 K/V——不缓存就要每步重算(O(n²)),缓存后每步 O(n)。
KV Cache 大小(估算式):
KV 显存 ≈ 2 × 层数 × 隐层维 × 上下文长度 × 并发数 × 字节数
("2" = Key + Value 两份)
关键结论:
| 变量 | 影响 |
|---|---|
| 并发数 | 线性增长(“并发翻倍,KV 翻倍”) |
| 上下文长度 | 线性增长(“4K → 32K,KV ×8”) |
| 精度 | INT8 KV 减半、FP8 再降(“KV 量化”) |
PagedAttention(vLLM 核心):
- 问题:传统 KV Cache 预分配连续显存 → 碎片浪费(实际占用 « 分配);
- 方案:KV 按"页"分配(像操作系统虚拟内存分页)→ 碎片趋近于 0;
- 效果:显存利用率大幅提升 → 同卡跑更多并发(吞吐 ↑↑)。
记忆锚:“KV 随并发 × 上下文线性涨;PagedAttention 分页去碎片,同卡多跑一倍并发”。
2.3 Continuous Batching(“吞吐杀手锏”)
静态 Batch 的问题:一批请求必须等最长的生成完才出结果(短请求干等)。
Continuous Batching:
每生成一步就检查:完成的请求移出,新请求补进
→ Batch 始终"满员"(动态进出)
→ 吞吐量接近硬件上限
记忆锚:“不等齐,动态进出,Batch 常满 = 吞吐拉满”。
2.4 延迟 3 指标(“必背”)
| 指标 | 含义 | 谁决定 | 优化方向 |
|---|---|---|---|
| TTFT | 首 token 时延 | Prefill | 短上下文/前缀缓存/强算力 |
| TPOT | 每输出 token 时延 | Decode | 大 Batch/显存带宽/量化 |
| E2E | 端到端总时延 | 两者 | TTFT + TPOT × 生成长度 |
体验阈值(示例,业务而定):
- TTFT < 1s:用户感觉"秒回";> 3s:明显卡顿感;
- TPOT:中文阅读速度约 20~30 字/秒,TPOT > 50ms/token 会明显"吐字慢"。
2.5 优化决策树(“瓶颈 → 药方”)
TTFT 高?
→ 上下文太长? → 截断/摘要/前缀缓存
→ 算力不够? → 更强 GPU / Prefill 分离(PD 分离)
TPOT 高(吐字慢)?
→ 并发低? → 开/调 Continuous Batching
→ 显存带宽瓶颈?→ 量化权重 / KV 量化
显存不够?
→ 权重太大? → INT8/INT4 量化
→ KV 太大? → 降并发/降上下文/KV 量化/PagedAttention
成本太高?
→ 模型太大? → 小模型兜底(多模型分级)
→ 调用太贵? → 缓存高频问题(语义缓存)
记忆锚:“TTFT 治 Prefill,TPOT 治 Decode,显存治量化,成本治分级”。
🧠 记忆工具箱
口诀速记
- 两阶段:“Prefill 吃算力,Decode 吃带宽”;
- KV:“并发翻倍 KV 翻倍,4K 到 32K KV 翻八”;
- Paged:“分页去碎片,同卡多一倍”;
- Batching:“不等齐,动态进出,Batch 常满”;
- 指标:“TTFT 首字看 Prefill,TPOT 吐字看 Decode”;
- 决策:“TTFT 治 Prefill,TPOT 治 Decode,显存治量化,成本治分级”。
场景锚点
- 推理优化想象"“高速公路收费站”":你不是司机(不需要赶路),你是"收费站管理者"(“提通行量”)——“Prefill = 入口查证件(一次性,费人工/算力);Decode = 一路匀速通行(费路宽/带宽);KV Cache = 每个车的档案(车越多档案越多);PagedAttention = 档案按格放不浪费;Continuous Batching = 出口的车走了立刻补新车,车道常满”——“提通行量 = 车道常满 + 档案不浪费”。
⚠️ 易错提醒
- “TTFT 高 ≠ Decode 慢”:“两阶段分开治”——“TTFT 高去查 Prefill(上下文/算力),别去调 Batch”;
- KV Cache"是动态大头":“权重 14GB 可能只占一半,并发 × 上下文的 KV 才是爆显存元凶”;
- Batch 不是越大越好:“Batch 过大 → TPOT 上升(每 token 变慢)”——“吞吐与延迟的权衡,不是单向拉满”;
- 优化"不测就吹" = 不及格:“每个优化要有前后对比数据”(“开 Batching 前 QPS 20 → 后 65”才是答案)。