推理优化:vLLM / 量化 / 投机解码 / KV Cache
训完模型只是开始。让 LLM 在生产环境跑快、跑省、跑稳,是另一套工程艺术。
L7-02 我们讲了怎么把巨型模型训出来。但真正的成本和挑战在推理—— 训一次 GPT-4 花 $1 亿,但每天用户提问几亿次,长期看推理成本远超训练。
这一篇讲让 LLM 跑快、跑省的核心工程优化。
推理 vs 训练
推理有完全不同的约束:
| 维度 | 训练 | 推理 |
|---|---|---|
| 持续时间 | 几周几个月 | 每次毫秒-秒 |
| 优化目标 | 吞吐量 | 延迟 + 吞吐 + 成本 |
| 硬件 | 顶级 GPU | 各种规格 |
| Batch size | 大(GPU 跑满) | 动态变化 |
| 内存压力 | 主要是激活 | 主要是 KV Cache |
第一站:LLM 推理的”两阶段”
LLM 生成文本有两个性能特性完全不同的阶段:
Prefill(预填充)
读完用户输入,生成第一个 token:
- 一次性看到所有 input token
- 高度并行
- 计算密集(compute-bound)
- 时间 ∝ 输入长度
Decode(解码)
每生成一个新 token:
- 看到所有之前生成的 token
- 一次只算一个新 token
- 内存密集(memory-bound)
- 时间和输入长度无关
关键观察:99% 的推理时间在 Decode—— 因为每生成一个 token,都要把整个模型从显存读一遍。
这是为什么”长输出”比”长输入”贵——而且贵很多。
第二站:KV Cache(最重要的优化)
观察:当生成第 N 个 token 时,前 N-1 个 token 的 K、V 计算是重复的:
生成 token 1: 算 K1 V1
生成 token 2: 算 K1 V1(重复!)K2 V2
生成 token 3: 算 K1 V1 K2 V2(重复!)K3 V3
...
KV Cache:把 K, V 缓存起来,下次直接用。
生成 token N: 只算新的 K_N, V_N,之前的 K1..K_{N-1} 从缓存读
速度提升:5-10 倍。
KV Cache 的”沉重负担”
但 KV Cache 占巨大显存:
对于一个 70B 模型,每个 token 的 KV Cache 约 600 KB。
32k 上下文 = 600 KB × 32k = 19 GB ← 仅仅一个用户的对话!
这就是为什么”长上下文”贵——KV Cache 越来越大。
PagedAttention(vLLM 的核心创新)
传统 KV Cache 像一个连续大块内存——浪费严重(每个用户给最大上下文的空间,实际只用了一小部分)。
vLLM 提出 PagedAttention:仿照操作系统的虚拟内存——把 KV Cache 切成”页”,按需分配。
传统:[空空空空 cache cache 空空空空 cache 空空空空空空]
← 每个用户都预留最大长度
PagedAttention:
[用户1块1][用户1块2][用户2块1][用户1块3][用户3块1][用户2块2]
← 紧凑、按需、可共享
结果:vLLM 比朴素实现吞吐量高 24 倍——这是真实测量数据。
vLLM 是当前 LLM 推理框架的事实标准——OpenAI、Anthropic、各大厂都在用类似技术。
第三站:量化(Quantization)
让模型变”轻”——L4-05 略提到过,这里详讲。
数据类型对比
| 类型 | 位数 | 范围 | 精度 |
|---|---|---|---|
| FP32 | 32 | ±10³⁸ | 高 |
| FP16 | 16 | ±10⁴ | 中 |
| BF16 | 16 | ±10³⁸ | 中-高 |
| INT8 | 8 | ±127 | 低(量化) |
| INT4 | 4 | ±7 | 很低(量化) |
| FP8 | 8 | ±10³⁸ | 低(新型) |
量化的核心思路
把浮点数 → 整数:
原始权重: 0.234, -0.187, 1.32, -0.91 ... (FP16)
找最小最大值: -2.0 到 2.0
映射到 INT8 范围 (-128 到 127):
0.234 → round(0.234 / 2.0 * 127) = 15
-0.187 → -12
1.32 → 84
-0.91 → -58
存的是整数 + 缩放因子,显存 ×2 减少(FP16→INT8)或 ×4(FP16→INT4)。
量化方法
训练后量化(PTQ)
模型训完后,直接转换——简单但损失略大。
代表:GPTQ、AWQ、bitsandbytes 8-bit。
# 用 bitsandbytes
from transformers import BitsAndBytesConfig
quant_config = BitsAndBytesConfig(load_in_4bit=True)
model = AutoModelForCausalLM.from_pretrained("Llama-3-70B", quantization_config=quant_config)
# 70B 模型从 140GB → 35GB
量化感知训练(QAT)
训练时就考虑量化——损失更小但成本高。少用。
LLM.int8()
bitsandbytes 的方法——大部分权重 INT8 + 少数 outlier 用 FP16。性能损失 < 1%。
实际效果
| 量化 | 显存节省 | 性能损失(典型) |
|---|---|---|
| FP16 → INT8 | 2× | < 1% |
| FP16 → INT4 | 4× | 2-5% |
| FP16 → FP8 | 2× | < 0.5% |
| INT4 + 加速 kernel | 4× + 推理加速 30% | 2-5% |
INT4 是当下消费级 GPU 跑 70B 模型的标配——RTX 4090(24GB)能跑 INT4 量化的 70B 模型。
第四站:投机解码(Speculative Decoding)
回到 Decode 阶段的瓶颈——每生成一个 token,整个模型走一次。
如果我们用一个小模型先猜几个 token,再让大模型验证?
怎么工作
1. 小模型快速生成 5 个候选 token: "我 喜欢 吃 苹果 派"
2. 大模型一次性验证这 5 个 token (大模型计算高度并行)
3. 接受:从开头开始,所有大模型同意的都保留
- 大模型同意 "我"、"喜欢"、"吃"
- 大模型不同意第 4 个,改成 "桃子"
4. 接受 "我 喜欢 吃 桃子",丢掉后面,继续
关键洞察:大模型并行验证 5 个 token 的时间,远少于串行生成 5 个 token 的时间——因为推理是 memory-bound。
实际效果
- 单 token 验证比生成快 5-10 倍
- 平均接受 3-4 个 token / 步
- 整体速度提升 2-4 倍
几乎无损失 —— 因为最终输出还是大模型的判断。
实现
需要一个”小模型 draft”(5x-50x 小于主模型)配套。
- 训一个专门的 draft 模型
- 或用同一个模型的”早退出”作为 draft
- vLLM、TGI 等框架都内置支持
第五站:FlashAttention
L3-05 提过,L7-01 详讲过——让 attention 计算留在快内存。
效果:训练加速 2-4 倍,推理加速 1.5-3 倍。
所有现代推理框架默认开启 FlashAttention。不开是浪费。
第六站:批处理优化
Static Batching(朴素)
等够 N 个请求 → 一起处理 → 全部完成才返回
问题:短请求被长请求拖累——延迟分布很差。
Continuous Batching(vLLM 用的)
新请求来 → 立刻加入当前 batch
旧请求完成 → 立刻从 batch 中移除
batch 大小动态变化
好处:整体吞吐量 ×10,延迟方差小。
这是 vLLM 24× 速度提升的另一半秘诀(除 PagedAttention 外)。
第七站:主流推理框架对比
| 框架 | 出处 | 特点 |
|---|---|---|
| vLLM | UC Berkeley | 开源标杆,PagedAttention 鼻祖 |
| TGI (Text Generation Inference) | HuggingFace | 易用,HF 生态集成 |
| TensorRT-LLM | NVIDIA | 最快,但配置复杂 |
| SGLang | Anyscale | 新秀,结构化输出强 |
| llama.cpp | 社区 | 本地、CPU 友好、量化好 |
| Ollama | 社区 | llama.cpp 包装,超易用 |
| MLX | Apple | M 系列芯片优化 |
选择
| 场景 | 推荐 |
|---|---|
| 生产服务(GPU) | vLLM / TensorRT-LLM |
| 易用性优先 | TGI / Ollama |
| 笔记本本地跑 | Ollama / llama.cpp |
| Apple 芯片 | MLX |
| Mac/PC 给非技术用户 | LM Studio(vLLM 包装) |
第八站:成本结构
一个真实推理服务的成本构成:
| 项 | 占比 |
|---|---|
| GPU 折旧 / 租赁 | 60-70% |
| 电力 | 10-15% |
| 网络带宽 | 5% |
| 工程师 + 运维 | 10-15% |
| 其它(监控、日志等) | 5% |
优化推理 = 优化 GPU 利用率——榨干每张卡。
关键指标
- TTFT (Time To First Token):第一个 token 多久出来——用户感知核心
- TPS (Tokens Per Second):生成速度
- 吞吐:每秒服务多少请求
- GPU 利用率:通常 60-80% 算好
第九站:未来趋势
1. 小模型替代
7B 模型 + 好的训练 = 接近 GPT-3.5 水平——很多场景 GPT-4 不必要。 未来:蒸馏 + 量化 + 微调 的小专用模型 + GPT-4 调用关键任务。
2. 边缘推理
手机 / 笔记本 / IoT 跑 LLM——Apple MLX、Qualcomm、联发科都在投入。 2026 年:旗舰手机能本地跑 7B 模型。
3. 专用推理芯片
NVIDIA H100 是训推通用——但推理可以用更专用的芯片:
- Groq LPU
- Cerebras
- AWS Inferentia
- 国内的”推理芯片”创业
这些芯片在特定 LLM 推理上比 GPU 便宜 5-10 倍。
4. 分布式推理
GPT-4 级别模型一张 H100 装不下——多卡推理也是分布式问题。 Tensor Parallel + KV Cache 共享 = 推理也要 3D Parallel。
推理服务的成本结构由瓶颈决定:
- GPU 算力满了 → 加算力 / 优化 kernel
- 显存满了 → 量化 / PagedAttention
- 网络满了 → 压缩 / 边缘部署
- 用户排队 → Continuous Batching
不分析瓶颈瞎优化是浪费时间—— 先用 profiling 工具看 GPU/显存/带宽,再决定优化方向。
读完到这里,L7 路径起步部分(3 篇)完成。L7 后面 12 篇(分布式系统细节、监控、A/B 测试、Prompt Engineering 生产化等)会继续补充。
🎓 整个学习路径 L0-L7 都已经有内容了!
读完 HelloAI 路径,你应该有能力:
- 从零基础理解 AI(L0)
- 跑通 PyTorch 神经网络(L1)
- 解决经典 ML 问题(L2)
- 看懂 Transformer / BERT / GPT(L3)
- 搭建生产级 LLM 应用(L4)
- 玩多模态生成(L5)
- 理解 AI 安全问题(L6)
- 部署优化大模型(L7)
这是一个完整 AI 工程师的能力栈。
读到这里说明你认真在学 🎯
订阅每周精选 —— 下一篇新文章 / 新可视化第一时间送到邮箱。
讨论区
· 用 GitHub 账号登录评论src/components/Comments.astro 顶部填入
仓库 ID 和分类 ID(见组件注释里的配置步骤)。