← 返回 AI 基础 首页 / 算法与AI / 推理工程 · 推理优化
AI 基础进阶 · 推理工程

推理优化:vLLM、连续批处理、投机采样,怎么把大模型跑快跑省

模型再聪明,线上服务慢得像挤牙膏、一张卡只能伺候两个人,也没法商用。推理优化干的就是这件事:让同一张显卡能同时服务更多人、每个请求等得更短、显存花得更值。这一课讲五个最常用的大招——PagedAttention、连续批处理、投机采样、FlashAttention、KV Cache 量化。

① 本章怎么学(4 步走,约 55 分钟)

1先懂瓶颈在哪(12 分钟)
读②:推理慢在 KV Cache 和显存碎片。
2vLLM 两板斧(15 分钟)
读③④:PagedAttention + 连续批处理。
3剩下三招(18 分钟)
读⑤⑥⑦:投机采样、FlashAttn、量化。
4自测口述(10 分钟)
做⑩,背⑫。
本章小目标学完你要能:① 说清 vLLM 的 PagedAttention 像操作系统的什么;② 解释连续批处理为什么比静态批快;③ 讲出投机采样"小模型起草稿、大模型改"的思路;④ 知道 GQA/MQA 和 KV 量化各省了什么。

② 推理为什么慢、为什么贵

大模型生成是一个词一个词往外蹦的:每生成一个新词,都要回头看一遍之前所有词。为了不重复算,系统会把每个词算过的 Key/Value 存下来,这就是 KV Cache。它带来三个麻烦:

A显存吃紧
对话越长、人越多,KV Cache 占的显存越大,甚至比模型权重还大。
B碎片化
每个请求长度不一,显存一块块申请释放,像没整理的硬盘,碎片多、浪费大。
CGPU 挨饿
请求长短不齐,一批里有人早算完了,GPU 还得等最慢的那个,大量算力闲着。
一句话推理优化 = 把 KV Cache 这块"记忆"管理好,让 GPU 别闲着、显存别浪费。

③ vLLM 第一板斧:PagedAttention 分页注意力

vLLM 是目前最火的开源推理引擎。它的核心创新 PagedAttention,思路直接抄操作系统:把 KV Cache 切成固定大小的"页",像虚拟内存那样按需分配、用完回收。

以前是给每个请求预留一大块连续显存(你说不准它会生多长),结果两头浪费:预留多了空着,长了又不够。现在是把 KV Cache 拆成小块页,用到哪页就挂哪页,物理上不连续、逻辑上连续,碎片大幅减少。同样一张卡,能同时塞下的并发请求数量经常翻好几倍。

传统:给每人预留一整块 预留多了空着,长了不够 PagedAttention:切页按需用 用到哪页挂哪页,碎片大减 结果:同一张卡并发请求数常翻数倍 KV Cache 利用率从 ~20% 提到 60%+
读法:把 KV Cache 当"虚拟内存页"管,碎片少了,同样显存能装更多人。

④ vLLM 第二板斧:Continuous Batching 连续批处理

传统静态批处理是:攒够一批请求,一起算;必须等这批里最慢的那个也生成完,才放新请求进来。快的请求早就完事了,GPU 却在干等。

连续批处理(Continuous Batching,也叫 in-flight batching)的做法是:一个请求一生成完,立刻从批次里踢出去,新请求马上补空位,按 token 粒度滚动。GPU 几乎从不空转,吞吐率(每秒处理多少 token)能提升好几倍。

对比静态批处理连续批处理
换批时机整批全部生成完哪个完了哪个走,随时补人
GPU 利用率常被慢请求拖住几乎满载
吞吐低高数倍

⑤ 投机采样(Speculative Decoding):小模型起草稿,大模型批改

大模型一个个生成慢,是因为每出一个词都要完整过一遍网络。投机采样的思路是:

1小模型起草
用一个便宜的小模型(或草稿头)一口气先猜后面 3~5 个词。
2大模型一次性验
大模型把这几个候选词并行检查一遍,接受对的、纠正错的。
3效果不变
因为大模型做了校验,最终输出和纯大模型逐字生成完全一样,但快很多。
为什么不损失质量投机采样不是"让小模型替大模型说话",而是大模型仍然逐词把关,只是把多次串行的"想一个词"变成一次并行"验一段话"。质量等价、速度提升。

⑥ FlashAttention 与 GQA / MQA:从算和存两头省

FlashAttention(含 FlashAttention-2)

注意力计算要读写巨大的矩阵,以前常常算力没饱和、显存带宽先堵死。FlashAttention 用"分块计算、减少显存往返"的办法,把注意力矩阵切成小块在 SRAM 里算,不改变数学结果,只让 IO 更少,速度常提 2~4 倍,是现在所有推理框架的标配。

GQA / MQA:让 KV Cache 更小

方式K/V 头数KV Cache质量
MHA(标准多头)Q 几头,K/V 也几头最大最好
GQA(分组查询)多个 Q 头共享一组 K/V省约 1/4~1/8几乎不掉点(主流)
MQA(多查询)所有 Q 头共享 1 组 K/V最省略有损失

现代开源模型(Llama、Qwen、DeepSeek)基本都用 GQA,在"省 KV Cache"和"保质量"之间取了平衡。

⑦ KV Cache 量化:INT8 / FP8 再压一刀

模型权重可以用 FP16,KV Cache 也能从 16 位压到 INT8(8 位)甚至 FP8:原来存一个数要 2 字节,压成 1 字节甚至更少。同样显存,能多塞一倍并发请求,代价是一点点精度损失(实践中几乎无感)。DeepSeek、vLLM 新特性里都默认支持 FP8 量化。

五招合起来看PagedAttention 管显存碎片、连续批处理防 GPU 空转、投机采样加快出字、FlashAttention 加速矩阵算、GQA+量化压缩 KV——它们从"显存、算力、延迟"三个角度一起使劲。

⑧ 三个例子

例 1 · 线上并发上不去
一张 H100 跑 70B,原来只能同时接 8 个用户。
换 vLLM + PagedAttention + Continuous Batching 后,KV 显存碎片减少、GPU 不空转,并发常能提到二三十路,响应还更稳。
例 2 · 单用户嫌慢
一个用户等长回复,逐字生成卡顿明显。
打开 投机采样:小模型先猜几个词,大模型一次并行验对。输出质量不变,但首 token 后那段"蹦字"速度明显变快。
例 3 · 显存还是不够
长对话一多,KV Cache 把显存吃满。
开 GQA + KV Cache FP8 量化:K/V 头数本来就少,再把每个数从 16 位压到 8 位,KV 占用直接减半以上,长上下文服务更多人。

⑨ 易错提醒

易错 1:把 PagedAttention 当成一种新的注意力算法它不改变注意力的数学,只是把 KV Cache 的显存管理改成"分页式",类似操作系统虚拟内存。省的是显存碎片和利用率。
易错 2:以为投机采样会偷工减料降质量不会。大模型始终逐词校验,接受的才输出,最终分布和纯大模型一致。它只是把串行变并行,提速不降质。
易错 3:混淆 FlashAttention 和 GQAFlashAttention 优化的是注意力矩阵怎么算得快(减少显存 IO);GQA 优化的是K/V 存多少(少存几个头)。一个算得快,一个存得少,常一起用但不是一回事。

⑩ 折叠自测(点开即答)

基础1vLLM 的 PagedAttention 是模仿操作系统的什么机制?
模仿虚拟内存分页:把 KV Cache 切成固定大小的页,按需分配、用完回收,解决显存碎片和预留浪费。
中档2连续批处理相比静态批处理,为什么吞吐高?
静态批要等整批最慢的请求结束才换批,快请求走完后 GPU 空等;连续批处理按 token 滚动,谁生成完谁立刻退出、新请求立刻补位,GPU 几乎满载。
拔高3投机采样、GQA、KV 量化分别省的是什么?
投机采样省单请求延迟(小模型起草、大模型并行验);GQA 省KV Cache 头数(多 Q 头共享 K/V);KV 量化省每个 KV 数的位宽(FP16→INT8/FP8)。三者常叠加使用。

⑪ 费曼三问(合上讲,自己讲给自己听)

用大白话回答,讲不顺就是没懂
问 1:为什么一张显卡以前只能服务几个人,用了 vLLM 能服务几十人?
问 2:投机采样用小模型先写草稿,为什么结果不会变差?
问 3:FlashAttention 和 GQA 都"快/省",它们优化的对象有什么不同?
PagedAttention:KV Cache 分页存,像虚拟内存 治显存碎片
连续批处理:谁完谁走、随时补位 GPU 不空转
投机采样:小模型起草、大模型并行验 提速不降质
FlashAttention:分块算、少读写显存 矩阵算得快
GQA + FP8:K/V 少存头、压位宽 KV Cache 变小

⚡ 高频 FAQ

问:开了 vLLM 是不是就不用管模型本身了?不是。vLLM 是推理引擎,模型权重还是你的;它只是把部署和调度优化了。
问:FP8 量化会不会让输出变差?实践中几乎无感,长文本和推理任务可能略降,但换来显存减半、并发翻倍。
问:投机采样一定要配一个小模型吗?常见做法是配一个同系小模型,也能用草稿头(draft head),本质都是"先猜后验"。

📖 名词速查

名词大白话
KV Cache把之前词的 K/V 存下来,免得重算
PagedAttentionvLLM 把 KV Cache 当虚拟内存分页管
Continuous Batching谁生成完谁退出、随时补人,GPU 不空转
Speculative Decoding小模型起草稿、大模型并行校验
FlashAttention分块算注意力,少读写显存
GQA / MQA多个 Q 头共享 K/V 头,省 KV Cache
INT8 / FP8把权重/KV 从 16 位压到 8 位

🧪 动手实验建议

1装 vLLM
起一个 OpenAI 兼容接口,发一个长 prompt 看吞吐。
2看并发
并发打 10 路请求,观察显存和延迟曲线。
3开量化
对比开 FP8 前后的显存占用和输出质量。
观察重点不开优化时 GPU 经常空转、显存碎片多;开了 vLLM + 连续批处理后吞吐明显上去。

🔁 5 天复习计划

天任务自检
第 1 天读②③,理解推理瓶颈与 PagedAttention说出它模仿 OS 的什么机制
第 2 天读④⑤,搞清连续批处理与投机采样对比静态/连续批,讲清提速不降质
第 3 天读⑥⑦,区分 FlashAttn 与 GQA/量化说出一个算得快、一个存得少
第 4 天读⑧⑨例子与易错,做⑩折叠自测五招各治什么病都答出
第 5 天合上讲⑪费曼三问,不看资料讲一遍三问都能举例说明
三句口诀① PagedAttention 治碎片、连续批治空转;② 投机采样小模型起草大模型验;③ FlashAttention 算得快,GQA+FP8 存得小。

📌 知识链路

前置知识(先学)先搞懂 KV Cache 是什么、为什么长对话贵,再看这些优化才知道在治什么病。
本节位置承接模型选型:选好模型后,怎么用 vLLM 等引擎把它在线上跑快、跑便宜。
下一步(学完去)模型跑起来之后,怎么让它会调工具、会拆任务?接下去学 Agent 架构。
← 上一章 · 国产模型家族 返回 AI 基础总览