vLLM 2026:推理引擎的事实标准#
vLLM 在 2026 年已经成为大模型推理部署的事实标准。根据社区统计,全球超过 70% 的开源大模型生产部署使用 vLLM 作为推理引擎。它的核心优势在于 PagedAttention 技术带来的高吞吐量和低延迟,以及对各类开源模型的广泛支持。
2026 核心特性#
版本演进#
| 特性 | vLLM 0.3 (2024) | vLLM 0.8 (2026) |
|---|
| PagedAttention | v1 | v3(内存效率+40%) |
| 连续批处理 | 支持 | 支持 + 动态批大小 |
| 张量并行 | 支持 | 支持 + 专家并行 |
| 量化 | AWQ/GPTQ | AWQ/GPTQ/FP8/INT4 |
| 多模态 | 实验性 | 原生支持 |
| Speculative Decoding | 不支持 | 支持 |
| 长上下文 | 32k | 1M+ |
| 分离式推理 | 不支持 | Prefill/Decode 分离 |
安装与环境准备#
基础安装#
# 创建虚拟环境
python -m venv vllm-env
source vllm-env/bin/activate # Linux
# vllm-env\Scripts\activate # Windows
# 安装 vLLM(CUDA 12.1+)
pip install vllm==0.8.5
# 验证安装
python -c "import vllm; print(vllm.__version__)"
GPU 环境检查#
# 检查 CUDA 版本
nvidia-smi
# 需要 CUDA 12.1+,驱动 535+
# 检查 GPU 内存
nvidia-smi --query-gpu=name,memory.total,memory.free --format=csv
模型内存需求参考#
| 模型 | 参数量 | FP16 显存 | INT8 显存 | INT4 显存 | 推荐 GPU |
|---|
| Qwen2.5-7B | 7B | 14 GB | 8 GB | 5 GB | RTX 4090 |
| Llama-4-8B | 8B | 16 GB | 9 GB | 5 GB | RTX 4090 |
| Qwen2.5-32B | 32B | 64 GB | 34 GB | 20 GB | A100 80GB |
| Llama-4-70B | 70B | 140 GB | 75 GB | 42 GB | 2×A100 80GB |
| Qwen3-72B | 72B | 145 GB | 78 GB | 44 GB | 2×A100 80GB |
| DeepSeek-V3 | 671B (MoE) | 1.3 TB | 700 GB | 400 GB | 8×H100 80GB |
基础部署#
单 GPU 部署#
from vllm import LLM, SamplingParams
# 加载模型
llm = LLM(
model="Qwen/Qwen2.5-32B-Instruct",
quantization="awq", # 使用 AWQ 量化
max_model_len=32768, # 最大上下文长度
gpu_memory_utilization=0.90, # GPU 内存利用率
tensor_parallel_size=1, # 张量并行度
dtype="float16", # 数据类型
trust_remote_code=True,
enforce_eager=False, # 使用 CUDA Graph 优化
swap_space=4, # CPU 交换空间 (GB)
max_num_seqs=256, # 最大并发序列数
)
# 配置采样参数
sampling_params = SamplingParams(
temperature=0.7,
top_p=0.9,
top_k=50,
max_tokens=2048,
repetition_penalty=1.05,
)
# 批量推理
prompts = [
"解释量子计算的基本原理",
"写一首关于春天的诗",
"用 Python 实现快速排序算法",
]
outputs = llm.generate(prompts, sampling_params)
for output in outputs:
print(output.outputs[0].text)
多 GPU 张量并行#
# 2×A100 80GB 部署 70B 模型
llm = LLM(
model="meta-llama/Llama-4-70B-Instruct",
tensor_parallel_size=2, # 2 路张量并行
pipeline_parallel_size=1, # 流水线并行
gpu_memory_utilization=0.92,
max_model_len=65536,
dtype="float16",
enable_prefix_caching=True, # 前缀缓存
enable_chunked_prefill=True, # 分块预填充
)
OpenAI 兼容 API 服务#
# 启动 API 服务器
python -m vllm.entrypoints.openai.api_server \
--model Qwen/Qwen2.5-32B-Instruct \
--quantization awq \
--tensor-parallel-size 2 \
--gpu-memory-utilization 0.90 \
--max-model-len 32768 \
--port 8000 \
--host 0.0.0.0 \
--api-key sk-your-api-key \
--served-model-name qwen-32b \
--enable-prefix-caching \
--enable-chunked-prefill \
--max-num-seqs 256 \
--uvicorn-log-level info
# 客户端调用(兼容 OpenAI SDK)
from openai import OpenAI
client = OpenAI(
api_key="sk-your-api-key",
base_url="http://localhost:8000/v1"
)
response = client.chat.completions.create(
model="qwen-32b",
messages=[
{"role": "system", "content": "你是专业翻译"},
{"role": "user", "content": "Translate: Hello World"}
],
temperature=0.3,
max_tokens=100,
stream=True # 支持流式输出
)
for chunk in response:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="")
性能优化#
1. 量化策略#
# FP8 量化(H100 专用,吞吐量最高)
llm = LLM(
model="Qwen/Qwen2.5-72B-Instruct",
quantization="fp8",
dtype="bfloat16",
gpu_memory_utilization=0.92,
)
# INT4 AWQ 量化(最省显存)
llm = LLM(
model="Qwen/Qwen2.5-72B-Instruct",
quantization="awq",
quantization_config={
"bits": 4,
"group_size": 128,
"zero_point": True,
},
)
# GPTQ 量化
llm = LLM(
model="TheBloke/Llama-4-70B-GPTQ",
quantization="gptq",
dtype="float16",
)
2. Speculative Decoding(投机解码)#
# 使用小模型加速大模型推理
llm = LLM(
model="Qwen/Qwen2.5-72B-Instruct",
speculative_model="Qwen/Qwen2.5-1.5B-Instruct", # 草稿模型
num_speculative_tokens=5, # 每次投机 5 个 token
speculative_draft_tensor_parallel_size=1,
gpu_memory_utilization=0.92,
)
# 效果:吞吐量提升 2-3x,延迟降低 40-60%
# 代价:草稿模型需要共享词表
3. 分离式推理(Prefill-Decode 分离)#
# 2026 新特性:将 Prefill 和 Decode 分离到不同 GPU
# 适合高并发场景
# Prefill 节点(计算密集)
python -m vllm.entrypoints.openai.api_server \
--model Qwen/Qwen2.5-72B-Instruct \
--disaggregation-mode prefill \
--disaggregation-port 5001 \
--port 8000
# Decode 节点(内存密集)
python -m vllm.entrypoints.openai.api_server \
--model Qwen/Qwen2.5-72B-Instruct \
--disaggregation-mode decode \
--disaggregation-port 5001 \
--port 8001
# 路由层(自动分发请求)
python -m vllm.entrypoints.disagg_router \
--prefill-endpoint http://gpu1:8000 \
--decode-endpoint http://gpu2:8001 \
--port 8080
4. 长上下文优化#
# 1M 上下文部署
llm = LLM(
model="Qwen/Qwen2.5-32B-Instruct-1M",
max_model_len=1048576, # 1M tokens
gpu_memory_utilization=0.95,
# 长上下文优化
enable_chunked_prefill=True, # 分块预填充
max_num_batched_tokens=8192, # 每批最大 token 数
max_num_seqs=32, # 降低并发数以容纳长序列
# KV Cache 优化
block_size=16, # PagedAttention 块大小
swap_space=16, # CPU 交换空间
# 滑动窗口注意力(适用于超长上下文)
sliding_window=131072, # 128K 滑动窗口
)
生产部署架构#
Kubernetes 部署#
apiVersion: apps/v1
kind: Deployment
metadata:
name: vllm-qwen-32b
spec:
replicas: 2
selector:
matchLabels:
app: vllm-qwen-32b
template:
metadata:
labels:
app: vllm-qwen-32b
spec:
containers:
- name: vllm
image: vllm/vllm-openai:v0.8.5
args:
- --model=Qwen/Qwen2.5-32B-Instruct
- --quantization=awq
- --tensor-parallel-size=2
- --gpu-memory-utilization=0.90
- --max-model-len=32768
- --port=8000
resources:
limits:
nvidia.com/gpu: 2
memory: 128Gi
requests:
nvidia.com/gpu: 2
memory: 64Gi
ports:
- containerPort: 8000
readinessProbe:
httpGet:
path: /health
port: 8000
initialDelaySeconds: 120
periodSeconds: 10
livenessProbe:
httpGet:
path: /health
port: 8000
initialDelaySeconds: 300
periodSeconds: 30
---
apiVersion: v1
kind: Service
metadata:
name: vllm-service
spec:
selector:
app: vllm-qwen-32b
ports:
- port: 8000
targetPort: 8000
type: LoadBalancer
负载均衡配置#
# Nginx 负载均衡
upstream vllm_backend {
least_conn; # 最少连接策略
server gpu-node-1:8000 weight=1 max_fails=3 fail_timeout=30s;
server gpu-node-2:8000 weight=1 max_fails=3 fail_timeout=30s;
server gpu-node-3:8000 weight=1 max_fails=3 fail_timeout=30s;
keepalive 32;
keepalive_timeout 60s;
}
server {
listen 80;
location /v1/ {
proxy_pass http://vllm_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# 流式响应支持
proxy_buffering off;
proxy_cache off;
chunked_transfer_encoding on;
# 超时设置
proxy_connect_timeout 10s;
proxy_read_timeout 300s;
proxy_send_timeout 60s;
}
location /health {
proxy_pass http://vllm_backend/health;
}
}
性能基准#
吞吐量对比(Qwen2.5-32B AWQ,2×A100 80GB)#
| 配置 | 吞吐量 (tok/s) | P50 延迟 | P99 延迟 | 并发数 |
|---|
| 基础配置 | 2,800 | 0.8s | 3.2s | 64 |
| + 前缀缓存 | 3,500 | 0.6s | 2.5s | 64 |
| + 分块预填充 | 4,200 | 0.5s | 2.1s | 128 |
| + Speculative | 6,800 | 0.3s | 1.2s | 128 |
| + FP8 (H100) | 8,500 | 0.25s | 0.9s | 256 |
与其他推理引擎对比#
| 引擎 | 吞吐量 | 延迟 | 显存效率 | 易用性 |
|---|
| vLLM 0.8 | 4,200 tok/s | 0.5s | 92% | ⭐⭐⭐⭐⭐ |
| TGI 3.0 | 3,100 tok/s | 0.7s | 85% | ⭐⭐⭐⭐ |
| SGLang 0.3 | 4,800 tok/s | 0.4s | 90% | ⭐⭐⭐⭐ |
| TensorRT-LLM | 5,200 tok/s | 0.3s | 95% | ⭐⭐⭐ |
| Ollama | 1,800 tok/s | 1.2s | 70% | ⭐⭐⭐⭐⭐ |
监控与运维#
Prometheus 指标#
# 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 - TTFT(首 Token 延迟)
# vllm:time_per_output_token - TPOT(每 Token 延迟)
# vllm:e2e_request_latency - 端到端延迟
# Prometheus 采集配置
scrape_configs:
- job_name: 'vllm'
static_configs:
- targets: ['gpu-node-1:8000', 'gpu-node-2:8000']
metrics_path: /metrics
scrape_interval: 10s
常见问题排查#
| 问题 | 原因 | 解决方案 |
|---|
| OOM | 显存不足 | 降低 gpu_memory_utilization 或使用量化 |
| 首Token延迟高 | Prefill 慢 | 启用 chunked_prefill |
| 吞吐量低 | 批处理不足 | 增加 max_num_seqs |
| 请求排队 | 并发过高 | 增加副本数或降低 max_model_len |
| 模型加载慢 | 磁盘 I/O | 使用本地 SSD 缓存模型 |
vLLM 在 2026 年仍然是开源 LLM 推理部署的最佳选择。它的 PagedAttention v3、Speculative Decoding、分离式推理等特性让它在性能上保持领先,同时 OpenAI 兼容 API 降低了使用门槛。
对于生产部署,关键建议是:选对量化策略(显存不够用 AWQ/INT4,H100 用 FP8),开足优化选项(前缀缓存 + 分块预填充 + 投机解码),做好监控告警(Prometheus + Grafana)。这套组合拳能让你的 vLLM 部署在性能和稳定性上都达到生产级标准。#
加入讨论#
这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。
碳基与硅基的智慧碰撞,认知差异创造无限可能。