9.1 推理优化:KV Cache、PagedAttention 与 vLLM
1.训完模型只是开始
前面八卷我们讲的都是"怎么把模型训出来"。但模型训完,距离"用户能低延迟、低成本地用上它"还有一大段工程路要走。这一卷(第九卷)就讲工程落地,第一篇从最核心的推理优化开始。
推理和训练最大的不同在于:训练是为了拟合数据,吞吐是王道;推理是为了服务用户,延迟(latency)和吞吐(throughput)要同时兼顾,而且要省显存——因为推理服务要 7×24 跑,显存就是钱。LLM 推理的显存和速度瓶颈,绝大多数都卡在同一个东西上:KV cache。
2.KV Cache:自回归推理的必备品
LLM 是自回归的——生成第 个 token 时,要用到前面 个 token 的信息。在注意力机制里,前面每个 token 都会算出一对 key 和 value。如果每生成一个新 token 都把前面所有的 K、V 重新算一遍,那是巨大的浪费。
KV cache 的做法是:把已经算过的每个 token 的 K、V 存起来,生成新 token 时直接复用,只算新 token 自己的 K、V。这样每生成一个 token 就是 而不是 。
KV cache 是推理的必备品,但它本身是个大麻烦——它随序列长度线性增长,而且每个请求都有一份。服务 100 个并发用户、每人 8K 上下文,KV cache 就能吃掉几十上百 GB 显存。所以推理优化的核心,几乎都是在"怎么管好、怎么压小 KV cache"上做文章。
3.PagedAttention:像操作系统管内存一样管 KV
vLLM(2023 年,UC Berkeley)带来的最大创新是 PagedAttention,它解决的是 KV cache 的内存碎片问题。
传统做法给每个请求预分配一块连续的 KV cache 空间,按最长可能长度预留。这有两个浪费:一是内部碎片(请求实际只用了一小部分,剩下全空着),二是外部碎片(请求之间留出无法利用的缝隙)。实测传统方案 KV cache 的实际利用率经常不到 30%。
PagedAttention 借鉴了操作系统的虚拟内存分页:把 KV cache 切成固定大小的块(block),每个请求按需领取块、用多少领多少,块之间不要求连续。这把利用率从 30% 提到 90%+,同等显存能服务的并发请求数翻几倍。
4.连续批处理:动态拼 batch
另一个 vLLM 的关键优化是连续批处理(continuous batching / in-flight batching)。传统推理服务按 batch 处理——一个 batch 里所有请求要等最长的那个生成完才能一起返回,短请求被迫空等,GPU 大量空闲。
连续批处理是动态的:每个生成步都重新组 batch,已完成的请求立刻返回、新请求随时插入。这样 GPU 始终满载,吞吐大幅提升。配合 PagedAttention,vLLM 的吞吐比传统 HuggingFace 推理高一个数量级,是 2024–2026 年 LLM 推理服务的事实标准。
5.其他常见推理优化
除了 vLLM 这套,还有几个常用的推理加速手段:
- 推测解码(speculative decoding):用一个小模型(draft model)快速猜几个 token,大模型一次性验证,猜对的直接用。DeepSeek 的 MTP 头(8.1 节)就是天生的草稿模型。
- 量化:把权重从 FP16 压到 INT8/INT4,显存和速度双赢。详见 9.2 节。
- 前缀缓存(prefix caching):很多请求共享相同的前缀(系统提示词),把这部分 KV cache 缓存复用,避免重复计算。
- 张量并行 / 流水线并行:把一个大模型切到多张卡上并行推理,应对单卡装不下的超大模型。
6.练习
Q1. 为什么 LLM 推理要用 KV cache?不用的话复杂度会怎样?
自回归生成第 个 token 要用前 个 token 的信息。不用 cache 则每步重算所有历史 K、V,单步 ;用 cache 只算新 token 的 K、V,单步降到 。
Q2. PagedAttention 解决了什么问题?思路借鉴了什么?
解决 KV cache 的内存碎片(传统预分配连续空间,利用率不到 30%)。借鉴操作系统虚拟内存分页:KV 切成固定块,按需领取、不要求连续,利用率提到 90%+。
Q3. 连续批处理相比传统 batch 处理,为什么能提升吞吐?
传统 batch 要等最长请求完成才返回,短请求空等、GPU 空闲。连续批处理每步动态重组 batch,完成的立即返回、新的随时插入,GPU 始终满载。
Q4.(面试题) 一个 LLM 推理服务延迟高、并发上不去,你会按什么顺序排查优化?
顺序:(1) 上 vLLM/PagedAttention + 连续批处理解决内存碎片和空等;(2) 量化(INT8/INT4)减显存提速;(3) 前缀缓存复用系统提示 KV;(4) 推测解码减少大模型前向次数;(5) 多卡并行应对单卡装不下。先从系统层(vLLM)入手收益最大。
7.小结
推理优化的核心是管好 KV cache——PagedAttention 解决碎片、连续批处理解决空转、量化压缩体积、推测解码减少前向。vLLM 把前三者打包成了事实标准。下一篇我们专门讲量化,看怎么把模型压到 4 比特还能不掉太多精度。
下一章见。