AI基础设施与推理优化 · 第 1 期

生成第100个token,要重算前99个?

KV缓存 · 连续批处理 · 推理加速

自回归生成的致命伤:每出一个token,attention要把所有历史token重算一遍。KV缓存把每层的K、V存下来复用,把每步从O(n²)降到O(n);连续批处理再让多请求拼车填满GPU。这是vLLM比HF快24倍的底层逻辑。
⏱ 约 10 分钟 🎯 想搞懂推理为什么慢的人 📦 源:airllm + 推理优化

01慢在哪:每步都在重算历史

大模型生成是「自回归」:一个token一个token往外蹦。每蹦一个,要把整段序列再过一遍attention。

attention的公式是 Q × Kᵀ / √d → softmax → × V。生成第t个token时,Q只有1个(当前位),但K、V要包含前面所有token。如果不缓存,每生成一个新token,前面t-1个token的K、V都得重算——这就是朴素推理的O(n²)灾难:序列越长越慢,第100个token比第1个慢约100倍。

朴素:每步算 t 个K、V → 总开销 ≈ O(n²·L)
缓存:每步只算 1 个K、V,旧的复用 → 总开销 ≈ O(n·L)

KV缓存的本质:把每层每头算过的K、V存进显存,下一步直接拼上新的那一个。计算从重算历史变成只算增量。代价是显存——KV缓存随序列长度线性增长,长上下文模型一大半显存都被它吃了。

推理慢,
不是模型大,是每步都在重算历史。
灏天文库 · AI基础设施与推理优化 P.1

02KV缓存演示:有/无缓存对比

点「生成下一步」,看朴素推理(每步重算所有K、V)和KV缓存(只算新增那一个)的计算量差距。序列越长,差距越大。

⚡ KV缓存对比演示
每生成一个token,朴素法重算全部历史K·V,缓存法只算新增一个。
0
朴素法(无缓存)
0
本步重算K·V次数
KV缓存法
1
本步新增K·V次数
点「生成下一步」开始
朴素:每步重算全部历史缓存:每步只算新增1个

03连续批处理:让请求拼车

光有KV缓存还不够——单请求喂不饱GPU,算力浪费在等待上。

静态批处理(一次凑齐N个请求一起跑)的痛点:请求长短不一,短的跑完得等长的,GPU空转。连续批处理(continuous batching)的解法:请求随时进、随时出,一个请求生成完立刻让位给排队的新请求,每一步都把batch填满。ORCA论文里叫 iteration-level scheduling。

静态批

凑齐再跑

等满N个才开工,短请求等长请求,GPU空转多。

连续批

边跑边换

请求动态进出,每步batch都满,吞吐最大化。

单请求

算力浪费

一次只服务一个用户,GPU利用率常低于30%。

拼车

共享算力

多请求共享一次前向,单token成本摊薄。

组合拳:KV缓存(省计算)+ 连续批处理(填满GPU)+ PagedAttention(省显存碎片,下期讲)= vLLM 比 HF Transformers 快 14~24倍。这是为什么线上大模型服务几乎都跑在 vLLM/TGI/TensorRT-LLM 上,没人裸跑 HF。

单请求喂不饱GPU,
拼车才是推理服务的常态。
灏天文库 · AI基础设施与推理优化 P.2

04带走这套清单

✅ KV缓存与批处理 6 条可执行规则

  1. 线上推理别裸跑HF:用 vLLM/TGI,KV缓存+连续批自带,吞吐直接一个数量级。
  2. 盯显存里KV占比:长上下文模型KV缓存能吃掉一半以上显存,是优化第一目标。
  3. batch别太小:单请求GPU利用率低,连续批把batch填满才有性价比。
  4. 请求长短混部要小心:超长请求会拖慢整批,按长度分桶或设max_tokens。
  5. 预热缓存:固定prompt部分(系统提示)的KV可预计算复用,省首token延迟。
  6. 显存不够先量化KV:KV缓存量化到8bit/4bit,显存砍半,精度损失很小。
推理优化的本质:
少算、多复用、填满GPU。
灏天文库 · AI基础设施与推理优化 P.3