跳转至

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 数量充足的场景。

# 2 卡 PP
vllm serve meta-llama/Meta-Llama-3-70B \
  --pipeline-parallel-size 2

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

排查:

# 查看当前显存使用
nvidia-smi

# 查看 vLLM 日志
docker logs vllm --tail 50 | grep -i oom

解决: - 减小 --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 未启用或配置不当

解决:

# 启用 chunked prefill
--enable-chunked-prefill
--chunked-prefill-size 4096


问题 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 预热

解决:

# 预热缓存
--load-format tensorizer
--distributed-executor-backend ray


7. 延伸阅读


FAQ

vLLM 和 TensorRT-LLM 怎么选? vLLM 易部署、社区活跃、支持面广;TensorRT-LLM 性能极限更高但需要 CUDA 调优。推理延迟敏感场景选 TensorRT-LLM,快速上线选 vLLM。

多 GPU 怎么配置张量并行(TP)? 启动时加 --tensor-parallel-size <n>,n 为 GPU 数量。例如 4 卡:vllm serve meta-llama/Meta-Llama-3-70B --tensor-parallel-size 4。

vLLM 显存不够怎么办? ① 减小 max_model_len ② 启用 --enable-chunked-prefill ③ 换更小量化模型 ④ 增大 GPU 显存或减少并发。

如何实现高吞吐低延迟? ① 增大 batch_size ② 启用 continuous batching ③ 用 GPU FP8 量化 ④ 开启 GPU prefetching。目标是 P99 < 200ms,吞吐量 > 1000 token/s。