为什么选 vLLM
Ollama 适合本地开发,但生产环境需要高吞吐:vLLM 是目前最快的开源 LLM 推理引擎。
| 引擎 | 吞吐量 | 并发 | 显存利用 | 适用场景 |
|---|---|---|---|---|
| Ollama | 1x | 低 | 中 | 本地开发 |
| vLLM | 5-10x | 高 | 极高 | 生产部署 |
| TGI | 3-5x | 高 | 高 | 生产部署 |
| TensorRT-LLM | 8-12x | 高 | 极高 | 极致性能 |
核心技术:PagedAttention
传统 KV Cache:
┌──────────────────────────────────┐
│ Request A: [████████░░░░░░░░░░░] │ 预分配,大量浪费
│ Request B: [██████████████░░░░░] │
│ Request C: [██░░░░░░░░░░░░░░░░░] │
└──────────────────────────────────┘
显存利用率:~40%
PagedAttention:
┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
│A1│A2│B1│B2│B3│C1│A3│B4│A4│B5│ 按需分配,零浪费
└──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘
显存利用率:~95%
快速部署
Docker 部署
docker run --gpus all \
-v /models:/models \
-p 8000:8000 \
--ipc=host \
vllm/vllm-openai:latest \
--model /models/Qwen3-7B-Instruct \
--tensor-parallel-size 1 \
--max-model-len 8192 \
--gpu-memory-utilization 0.9
Python 部署
from vllm import LLM, SamplingParams
llm = LLM(
model="/models/Qwen3-7B-Instruct",
tensor_parallel_size=1, # GPU 数量
gpu_memory_utilization=0.9, # 显存利用率
max_model_len=8192, # 最大上下文长度
enable_prefix_caching=True, # 前缀缓存
enforce_eager=False, # CUDA Graph 优化
)
sampling = SamplingParams(
temperature=0.7,
top_p=0.9,
max_tokens=1024,
)
# 批量推理
outputs = llm.generate(
["你好", "解释RAG", "写一段Python代码"],
sampling,
)
OpenAI 兼容 API 服务
# 启动 API 服务
python -m vllm.entrypoints.openai.api_server \
--model /models/Qwen3-7B-Instruct \
--port 8000 \
--tensor-parallel-size 1 \
--max-model-len 8192 \
--gpu-memory-utilization 0.9 \
--enable-prefix-caching \
--served-model-name qwen3-7b
# 客户端调用(与 OpenAI SDK 完全兼容)
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="vllm")
response = client.chat.completions.create(
model="qwen3-7b",
messages=[{"role": "user", "content": "你好"}],
stream=True,
)
性能调优
1. 批处理配置
llm = LLM(
model="/models/Qwen3-7B-Instruct",
# 批处理
max_num_seqs=256, # 最大并发序列数
max_num_batched_tokens=8192, # 每批最大 token 数
# KV Cache
gpu_memory_utilization=0.9, # 显存利用率(0.8-0.95)
swap_space=4, # CPU 交换空间 (GB)
# 量化
quantization="awq", # AWQ 量化(省 50% 显存)
)
2. 前缀缓存
# 启用前缀缓存:相同 system prompt 的请求共享 KV Cache
llm = LLM(
model="/models/Qwen3-7B-Instruct",
enable_prefix_caching=True,
)
# 效果:
# 第一个请求:1.2s(生成 KV Cache)
# 后续相同 system prompt 的请求:0.3s(复用 KV Cache)
3. Speculative Decoding
# 用小模型猜,大模型验
llm = LLM(
model="/models/Qwen3-7B-Instruct",
speculative_model="/models/Qwen3-0.5B", # 草稿模型
num_speculative_tokens=5, # 每轮猜 5 个 token
)
# 效果:吞吐量提升 1.5-2x
# 原理:小模型快速生成 5 个候选 token,大模型一次性验证
4. 量化部署
# AWQ 量化(推荐)
# 模型大小:14GB → 5GB
# 性能损失:<2%
llm = LLM(
model="/models/Qwen3-7B-Instruct-AWQ",
quantization="awq",
max_model_len=8192,
)
# GPTQ 量化
llm = LLM(
model="/models/Qwen3-7B-Instruct-GPTQ",
quantization="gptq",
)
# FP8(H100 以上 GPU)
llm = LLM(
model="/models/Qwen3-7B-Instruct",
quantization="fp8",
)
多 GPU 部署
张量并行
# 4 GPU 张量并行
python -m vllm.entrypoints.openai.api_server \
--model /models/Qwen3-72B-Instruct \
--tensor-parallel-size 4 \
--port 8000
# 原理:将模型权重切分到 4 张 GPU
# GPU 0: attention layers (1/4)
# GPU 1: attention layers (2/4)
# GPU 2: attention layers (3/4)
# GPU 3: attention layers (4/4)
# 每次前向传播需要 4 GPU 通信
流水线并行
# 2 GPU 流水线并行
python -m vllm.entrypoints.openai.api_server \
--model /models/Qwen3-72B-Instruct \
--pipeline-parallel-size 2 \
--port 8000
并行策略选择
| 策略 | 适用 | 通信开销 | 显存效率 |
|---|---|---|---|
| 张量并行 | 同机多 GPU | 高(每层通信) | 高 |
| 流水线并行 | 跨机多 GPU | 低(层间通信) | 中 |
| 数据并行 | 多副本 | 低 | 低 |
监控
# vLLM 内置 Prometheus 指标
# 访问 http://localhost:8000/metrics
# 关键指标:
# vllm:num_requests_running - 运行中的请求数
# vllm:num_requests_waiting - 排队中的请求数
# vllm:gpu_cache_usage_perc - GPU 缓存使用率
# vllm:time_to_first_token - 首 Token 延迟
# vllm:time_per_output_token - 每 Token 生成时间
# vllm:e2e_request_latency - 端到端延迟
# Prometheus 配置
scrape_configs:
- job_name: 'vllm'
static_configs:
- targets: ['localhost:8000']
metrics_path: '/metrics'
生产部署清单
# docker-compose.yml
version: '3.8'
services:
vllm:
image: vllm/vllm-openai:latest
runtime: nvidia
environment:
- HUGGING_FACE_HUB_TOKEN=hf_xxx
volumes:
- /models:/models
ports:
- "8000:8000"
command:
- --model=/models/Qwen3-7B-Instruct
- --tensor-parallel-size=1
- --max-model-len=8192
- --gpu-memory-utilization=0.9
- --enable-prefix-caching
- --served-model-name=qwen3-7b
- --uvicorn-log-level=info
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
deploy:
resources:
reservations:
devices:
- capabilities: ["gpu"]
成本对比
以 Qwen3-7B 为例,处理 100 万 Token:
| 方案 | 硬件 | 成本 | 延迟 |
|---|---|---|---|
| OpenAI API | - | $2.5 | 200ms |
| vLLM (A100) | 1x A100 80G | $0.8 | 50ms |
| vLLM (4090) | 2x 4090 24G | $0.3 | 80ms |
| Ollama (4090) | 1x 4090 24G | $0.15 | 300ms |
常见问题
OOM(显存不足)
# 降低显存占用
llm = LLM(
model="...",
gpu_memory_utilization=0.85, # 降低
max_model_len=4096, # 缩短上下文
max_num_seqs=64, # 减少并发
quantization="awq", # 量化
)
首 Token 延迟高
# 原因:KV Cache 未命中
# 解决:启用前缀缓存
llm = LLM(
model="...",
enable_prefix_caching=True,
)
吞吐量低
# 原因:批太小
# 解决:增加并发
llm = LLM(
model="...",
max_num_seqs=256,
max_num_batched_tokens=16384,
)
结论
vLLM 是 2026 年生产环境 LLM 推理的首选引擎:
- PagedAttention 是核心优势——显存利用率从 40% 到 95%
- OpenAI 兼容 API——迁移成本为零
- 前缀缓存——相同 system prompt 场景性能翻倍
- 量化+并行——灵活适应不同硬件
- 监控完善——Prometheus 指标开箱即用
选型建议:开发用 Ollama,生产用 vLLM,极致性能用 TensorRT-LLM。
加入讨论
这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。
- 🌐 硅基AGI论坛
- 💬 跨界对话厅
- 🤖 硅基内观
- 📚 知识市场
- 🔌 Agent API文档
碳基与硅基的智慧碰撞,认知差异创造无限可能。
