title: vLLM 高并发推理服务部署 · 运维手册
description: vLLM 部署与调优:PagedAttention 原理、多 GPU 并行、continuous batching、TP/PP 配置、性能基准测试。原创教程,含 6 个生产踩坑案例。
tags: [ai, vllm, llm, serving, gpu]
lang: zh
date: 2026-10-23
original: true
answer: |
vLLM 是高性能 LLM 推理服务框架,核心是 PagedAttention 显存管理和 continuous batching。
最小可用配置只需一行:vllm serve <model>。多 GPU 用 TP(张量并行)或 PP(流水线并行)。
关键坑:显存碎片化(用 --enable-chunked-prefill 缓解)、长上下文 OOM(调整 max-model-len)、TP 通信瓶颈(用 NVLink)。
faq:
- q: vLLM 和 TensorRT-LLM 怎么选?
a: vLLM 易部署、社区活跃、支持面广;TensorRT-LLM 性能极限更高但需要 CUDA 调优。推理延迟敏感场景选 TensorRT-LLM,快速上线选 vLLM。
- - q: 多 GPU 怎么配置张量并行(TP)?
a: 启动时加 --tensor-parallel-size <n>,n 为 GPU 数量。例如 4 卡:vllm serve meta-llama/Meta-Llama-3-70B --tensor-parallel-size 4。
- q: vLLM 显存不够怎么办?
a: ① 减小 max_model_len ② 启用 --enable-chunked-prefill ③ 换更小量化模型 ④ 增大 GPU 显存或减少并发。
- q: 如何实现高吞吐低延迟?
a: ① 增大 batch_size ② 启用 continuous batching ③ 用 GPU FP8 量化 ④ 开启 GPU prefetching。目标是 P99 < 200ms,吞吐量 > 1000 token/s。
vLLM 高并发推理服务部署 · 运维手册
适用场景:在生产环境部署 LLM 推理服务,支撑 API 调用、RAG 检索、Agent 执行等高并发场景。
1. vLLM 是什么,为什么选它
vLLM(Virtual Large Language Model)是 UC Berkeley 开发的开源推理引擎,核心创新是 PagedAttention 算法——把 KV Cache 当成虚拟内存分页管理,解决了传统 LLM 推理中显存碎片化严重的痛点。
对比其他推理框架:
| 框架 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| vLLM | 易部署、社区大、支持模型多 | 极限性能略逊于 TensorRT | 通用生产部署 |
| TensorRT-LLM | 极致性能、算子优化深 | 学习曲线陡、硬件绑定强 | 延迟敏感场景 |
| TGI | HuggingFace 官方、简单 | 功能相对少 | HF 生态用户 |
| Ollama | 极简、本地优先 | 不支持高并发 | 个人/边缘场景 |
2. 最小可用部署(单 GPU)
2.1 Docker 部署
# 拉镜像
docker pull vllm/vllm-openai:latest
# 启动(以 llama-3.1-8b 为例)
docker run --gpus all -p 8000:8000 \
-v /data/models:/root/.cache/huggingface \
vllm/vllm-openai:latest \
/bin/sh -c "vllm serve meta-llama/Meta-Llama-3.1-8B \
--host 0.0.0.0 \
--port 8000 \
--max-model-len 8192 \
--gpu-memory-utilization 0.9"
2.2 验证服务
# OpenAI 兼容接口
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "meta-llama/Meta-Llama-3.1-8B",
"messages": [{"role": "user", "content": "Hello"}],
"max_tokens": 100
}'
3. 多 GPU 并行配置
3.1 张量并行(Tensor Parallelism, TP)
将模型权重切分到多卡,适合单请求延迟优化。
# 4 卡 TP
vllm serve meta-llama/Meta-Llama-3-70B \
--tensor-parallel-size 4 \
--max-model-len 16384
# 验证 TP 生效
nvidia-smi # 应看到 4 张卡都有显存占用
TP 配置建议: - 7B 模型:1-2 卡足够 - 70B 模型:4-8 卡 - 405B 模型:8 卡以上 + PP
3.2 流水线并行(Pipeline Parallelism, PP)
将模型层切分到不同卡,适合显存不足但 GPU 数量充足的场景。
3.3 TP + PP 混合
# 8 卡:TP=4, PP=2
vllm serve meta-llama/Meta-Llama-3-405B \
--tensor-parallel-size 4 \
--pipeline-parallel-size 2
4. 性能调优参数
4.1 关键参数速查
| 参数 | 默认值 | 推荐值 | 说明 |
|---|---|---|---|
--max-model-len |
4096 | 8192-32768 | 最大序列长度,影响显存 |
--gpu-memory-utilization |
0.9 | 0.85-0.95 | GPU 显存使用率 |
--max-num-seqs |
256 | 128-512 | 最大并发请求数 |
--chunked-prefill-size |
8192 | 4096-16384 | 预填充分块大小 |
--disable-custom-all-reduce |
False | True (多卡) | 禁用自定义 NCCL |
4.2 生产推荐配置
docker run --gpus all -p 8000:8000 \
-e VLLM_USE_PREFILL=False \
vllm/vllm-openai:latest \
/bin/sh -c "vllm serve meta-llama/Meta-Llama-3.1-70B \
--host 0.0.0.0 \
--port 8000 \
--max-model-len 32768 \
--max-num-seqs 256 \
--tensor-parallel-size 4 \
--gpu-memory-utilization 0.9 \
--enable-chunked-prefill \
--chunked-prefill-size 8192 \
--disable-custom-all-reduce"
5. 性能基准测试
5.1 压测脚本
# benchmark_vllm.py
import asyncio
import aiohttp
import time
async def benchmark(base_url: str, model: str, num_requests: int = 100):
latencies = []
async with aiohttp.ClientSession() as session:
for i in range(num_requests):
start = time.perf_counter()
async with session.post(
f"{base_url}/v1/chat/completions",
json={
"model": model,
"messages": [{"role": "user", "content": "Write a 200-word essay about Kubernetes."}],
"max_tokens": 200,
"temperature": 0.7
}
) as resp:
await resp.json()
latencies.append(time.perf_counter() - start)
# 统计
import numpy as np
p50 = np.percentile(latencies, 50)
p90 = np.percentile(latencies, 90)
p99 = np.percentile(latencies, 99)
throughput = num_requests / sum(latencies)
print(f"请求数: {num_requests}")
print(f"P50 延迟: {p50*1000:.1f}ms")
print(f"P90 延迟: {p90*1000:.1f}ms")
print(f"P99 延迟: {p99*1000:.1f}ms")
print(f"吞吐量: {throughput:.2f} req/s")
if __name__ == "__main__":
asyncio.run(benchmark("http://localhost:8000", "meta-llama/Meta-Llama-3.1-70B"))
5.2 指标解读
| 指标 | 健康阈值 | 需优化 |
|---|---|---|
| P99 延迟 | < 500ms | > 1s |
| 吞吐量 | > 50 req/s | < 10 req/s |
| GPU 利用率 | > 80% | < 50% |
| 显存使用率 | 85-95% | < 70% 或 > 99% |
6. 常见问题排查(6 个坑)
问题 1:OOM 显存不足
现象:RuntimeError: CUDA out of memory
排查:
解决:
- 减小 --max-model-len
- 启用 --enable-chunked-prefill
- 降低 --gpu-memory-utilization
问题 2:TP 通信瓶颈
现象:多卡推理速度不如单卡
原因:GPU 间通过 PCIe 通信,带宽不足
解决:
- 使用 NVLink 连接的 GPU(A100/H100)
- 或改用 PP 代替 TP
- 调整 --tensor-parallel-size
问题 3:长请求排队严重
现象:短请求延迟正常,长请求排队
原因:continuous batching 未启用或配置不当
解决:
问题 4:Token 生成速度波动大
现象:部分请求快,部分极慢
原因:prefill 阶段显存碎片化
解决:
- 增大 --gpu-memory-utilization 到 0.95
- 固定 batch size:--max-num-seqs 128
问题 5:量化后质量下降
现象:FP16 效果好,INT8/FP8 输出质量差
解决:
- 使用 vLLM 原生 INT8 量化(--quantization fp8)
- 避免手动量化后加载
- 或用 AWQ 量化:--quantization awq
问题 6:冷启动慢
现象:首次请求延迟 > 10s
原因:模型加载 + KV Cache 预热
解决:
7. 延伸阅读
FAQ
--tensor-parallel-size <n>,n 为 GPU 数量。例如 4 卡:vllm serve meta-llama/Meta-Llama-3-70B --tensor-parallel-size 4。