第 1 章 · KV Cache、Batching 与延迟指标

📖 推理优化·考点精讲约 2073 字🎯 配套练习:AI落地·推理优化

考点梳理

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”才是答案)。