推理优化
问题
如何降低 LLM 推理的延迟和成本?量化、KV Cache 优化、投机采样各自是什么原理?
答案
LLM 部署的核心挑战是推理成本——一个 70B 模型推理需要 2-4 张 A100 GPU,API 成本高昂。本文汇总主流推理优化技术。
一、推理优化全景
二、量化(Quantization)
将模型权重从高精度(FP16/BF16)压缩为低精度(INT8/INT4)——显存减半/四分之一,速度提升 2-4 倍。
量化精度对比
| 精度 | 每参数字节 | 70B 模型大小 | 速度 | 质量损失 |
|---|---|---|---|---|
| FP16 | 2 | 140GB | 1× | 无 |
| INT8 | 1 | 70GB | ~1.5× | 极小 |
| INT4 | 0.5 | 35GB | ~2× | 轻微 |
| INT3/2 | 0.375/0.25 | 26/18GB | ~3× | 明显 |
主流量化方法
| 方法 | 类型 | 特点 |
|---|---|---|
| GPTQ | 训练后量化(PTQ) | 逐层校准,INT4 质量好 |
| AWQ | 训练后量化 | 保护重要权重,质量更高 |
| GGUF | 训练后量化 | llama.cpp 格式,CPU 友好 |
| SmoothQuant | 训练后量化 | 权重-激活联合平滑,INT8 |
| QAT | 量化感知训练 | 训练时模拟量化,质量最高但成本高 |
| FP8 | 新精度格式 | H100 原生支持,接近 FP16 质量 |
实际选择指南
- 云部署(A100/H100):FP8 或 INT8(SmoothQuant)
- 消费级 GPU(4090/3090):INT4(AWQ / GPTQ)
- CPU / 边缘:INT4-INT2(GGUF + llama.cpp)
三、推理引擎
| 引擎 | 核心特性 | 适用场景 |
|---|---|---|
| vLLM | PagedAttention、Continuous Batching | 高吞吐在线服务 |
| TensorRT-LLM | NVIDIA 深度优化、FP8、INT4 | NVIDIA GPU 最优性能 |
| llama.cpp | 纯 CPU/Metal 推理、GGUF 格式 | 本地部署、边缘设备 |
| SGLang | RadixAttention、结构化生成 | 复杂 Prompt 工作流 |
| Ollama | 一键本地部署 | 个人开发者 |
四、投机采样(Speculative Decoding)
用小模型(Draft Model)快速生成候选 Token,大模型批量验证:
加速比 = 接受率 × 候选 Token 数。当小模型和大模型分布接近时,加速最明显。
自投机采样(Self-Speculative)
不使用单独的小模型,而是让大模型自身跳过部分层做"草稿"——省去了维护两个模型的复杂度。
五、KV Cache 优化
详见 LLM 中的注意力机制,这里汇总关键技术:
| 技术 | 原理 | 效果 |
|---|---|---|
| PagedAttention | 按需分配 KV Cache 内存 | 显存利用率 >95% |
| GQA | 减少 KV 头数 | KV Cache 减少 4-8× |
| KV Cache 量化 | 将 KV 压缩为 INT8/INT4 | 显存减少 2-4× |
| Sliding Window | 只保留最近 N 个 Token 的 KV | 固定 KV Cache 大小 |
| Token Eviction | 淘汰不重要的 Token 的 KV | 自适应压缩 |
六、其他优化技术
Continuous Batching
不等一个 batch 全部完成才释放——每步判断每个请求是否完成,完成就替换为新请求。相比 Static Batching,吞吐提升 2-8×。
Prefix Caching
多个请求的 System Prompt 相同时,缓存其 KV Cache——首次计算后复用,避免重复 Prefill。
Structured Output 优化
生成 JSON 等结构化输出时,用 constrained decoding(约束解码)在每步只允许合法 Token,避免生成格式错误白白浪费 Token。
七、关键指标
| 指标 | 含义 | 在线服务目标 |
|---|---|---|
| TTFT | Time to First Token,首 Token 延迟 | < 500ms |
| TPS | Tokens Per Second,每秒输出 Token 数 | > 30 |
| Throughput | 系统吞吐(requests/sec) | 尽可能高 |
| P99 Latency | 99 分位延迟 | < 5s |
常见面试问题
Q1: INT4 量化模型和 FP16 模型的质量差多少?
答案: 使用 AWQ/GPTQ 等方法,INT4 量化的质量损失通常在 1-2% 以内(在主流 benchmark 上)。对于大模型(70B+),INT4 量化几乎无感知质量损失。对于小模型(7B),损失会更明显——参数量本来就少,精度损失的影响更大。
Q2: vLLM 为什么比 Hugging Face transformers 快?
答案:
- PagedAttention:高效管理 KV Cache,显存利用率高
- Continuous Batching:动态调度请求,GPU 利用率高
- CUDA Kernel 优化:Flash Attention、融合算子
- Prefix Caching:共享 System Prompt 的 KV Cache
总效果:同等 GPU 下吞吐提升 5-24×。
Q3: 投机采样的局限性是什么?
答案:
- 需要找到和大模型分布接近的小模型(接受率才高)
- 如果接受率低,反而不如直接用大模型
- 增加了系统复杂度(需要维护两个模型)
- 对 batch 推理优化有限(主要帮单请求场景)
Q4: 如何评估一个推理优化方案?
答案: 需要综合考虑:
- 质量:量化后 benchmark 分数下降多少
- 延迟:TTFT 和 TPS 是否满足产品需求
- 吞吐:每 GPU 每秒能处理多少请求
- 成本:每百万 Token 的 GPU 成本
- 复杂度:部署和维护的工程成本