[ PROMPT_NODE_22486 ]
Inference Serving VLLM 优化
[ SKILL_DOCUMENTATION ]
# 性能优化
## 目录
- PagedAttention 原理解析
- 连续批处理机制
- 前缀缓存策略
- 推测解码设置
- 基准测试结果与对比
- 性能调优指南
## PagedAttention 原理解析
**传统注意力机制问题**:
- KV 缓存存储在连续内存中
- 由于碎片化浪费约 50% 的 GPU 显存
- 无法针对不同序列长度动态重新分配
**PagedAttention 解决方案**:
- 将 KV 缓存划分为固定大小的块(类似于操作系统的虚拟内存)
- 从空闲块队列中动态分配
- 在序列间共享块(用于前缀缓存)
**显存节省示例**:
传统方式: 70B 模型需要 160GB KV 缓存 → 在 8x A100 上显存溢出 (OOM)
PagedAttention: 70B 模型需要 80GB KV 缓存 → 可在 4x A100 上运行
**配置**:
bash
# 块大小 (默认: 16 tokens)
vllm serve MODEL --block-size 16
# GPU 块数量 (自动计算)
# 由 --gpu-memory-utilization 控制
vllm serve MODEL --gpu-memory-utilization 0.9
## 连续批处理机制
**传统批处理**:
- 等待批次中所有序列完成
- 等待最长序列时 GPU 处于空闲状态
- GPU 利用率较低 (~40-60%)
**连续批处理**:
- 当有可用槽位时添加新请求
- 在同一批次中混合预填充(新请求)和解码(进行中请求)
- GPU 利用率高 (>90%)
**吞吐量提升**:
传统批处理: 50 req/sec @ 50% GPU 利用率
连续批处理: 200 req/sec @ 90% GPU 利用率
= 4倍吞吐量提升
**调优参数**:
bash
# 最大并发序列数 (越高 = 批处理程度越高)
vllm serve MODEL --max-num-seqs 256
# 预填充/解码调度 (默认自动平衡)
# 无需手动调优
## 前缀缓存策略
为常见提示词前缀重用计算出的 KV 缓存。
**使用场景**:
- 请求间重复的系统提示词
- 每个提示词中的少样本示例
- 具有重叠块的 RAG 上下文
**节省示例**:
提示词: [系统: 500 tokens] + [用户: 100 tokens]
不使用缓存: 每个请求计算 600 tokens
使用缓存: 计算 500 tokens 一次,后续每个请求计算 100 tokens
= TTFT 加速 83%
**启用前缀缓存**:
bash
vllm serve MODEL --enable-prefix-caching
**自动前缀检测**:
- vLLM 自动检测常见前缀
- 无需更改代码
- 适用于 OpenAI 兼容 API
**缓存命中率监控**:
bash
curl http://localhost:9090/metrics | grep cache_hit
# vllm_cache_hit_rate: 0.75 (75