模型量化、KV Cache 与推理广量
⚡ 推理优化的目标:在限定成本内最大化吸吐量和降低延迟。量化、KV Cache 和批处理是三大核心工具。
模型量化
量化类型
| 类型 | 精度 | 内存压缩 | 速度 | 精度损失 |
|---|---|---|---|---|
| FP32 | 全精度 | 1x | 基准 | 无 |
| FP16/BF16 | 半精度 | 2x | 明显提升 | 低 |
| INT8 | 8-bit | 4x | 提升 | 低 |
| INT4 | 4-bit | 8x | 显著提升 | 中 |
| GGUF | 混合量化 | 可配置 | 可配置 | 中 |
主流量化方案
- GPTQ:训练后量化, GPU 推理优化
- AWQ:激活感知量化,保留重要权重,精度优于 GPTQ
- GGUF/llama.cpp: CPU 推理友好,支持 CPU+GPU 混合推理
- bitsandbytes:训练时量化(QLoRA 微调)
KV Cache
什么是 KV Cache?
Transformer 计算每个新 token 时需要所有历史 token 的 K/V。缓存 K/V 避免重复计算:
不使用 KV Cache:每次都重新计算全部历史 → O(n²) 复杂度
使用 KV Cache:只计算新 token ,复用历史 → O(n) 复杂度
KV Cache 内存占用估算
KV Cache 内存 = 2 × 层数 × n_heads × head_dim × 序列长度 × 字节数
例:Llama-3-8B(FP16),序列长度 4096:
= 2 × 32 × 32 × 128 × 4096 × 2 ≈ 2GB
GQA(Grouped Query Attention)
多个 Query Head 共享一组 KV,大幅减少 KV Cache:
- Llama-3-70B:8 个 KV Head vs 64 个 Q Head,内存减少 8x
推理性能指标
| 指标 | 定义 | 目标 |
|---|---|---|
| TTFT | 首个 token 延迟 | < 500ms |
| TPOT | 每个 token 生成时间 | 有4ms |
| TPS | 每秒 token 数 | 越高越好 |
| QPS | 每秒请求数 | 取决于负载 |
内存带宽瓶颈
现代 GPU 计算能力远超内存带宽,推理通常是内存带宽瓶颈。减小模型内存占用是提升 TPS 的关键。
批处理与连续批
动态批(Continuous Batching)
传统批处理等待最长请求完成才进行下一批。连续批实时加入新请求, GPU 利用率敁升 40%+。
Prefill vs Decode 分离
Prefill:并行处理整个 Prompt(计算密集型)
Decode:逐个生成 token(内存密集型)
分到不同 GPU 处理可以最大化利用率
Speculative Decoding
用小模型先起草多个 token,大模型并行验证,接受或拒绝:
- 显著提升 TPS,精度不变
- 要求小模型输出分布接近大模型
主流推理引擎对比
| 引擎 | 特点 |
|---|---|
| vLLM | 高吸吐量,内存管理优秀 |
| SGLang | 结构化生成优化,序列并行 |
| llama.cpp | CPU 推理,Mac 开发首选 |
| TGI | Hugging Face 全家桶,容易部署 |
| TensorRT-LLM | NVIDIA GPU 最高性能 |
常见误区
- 量化不是免费午餐, INT4 在数学推理上精度损失可能很大
- KV Cache 内存随序列长度线性增长,长上下文预先评估内存需求
- 常说的“速度提升”必须区分是 TTFT 还是 TPS