30 秒快速回答

vLLM 是一个开源的高性能大模型推理引擎,核心价值就一句话:用同样的 GPU,让你的模型吞吐量暴增 24 倍。它通过 PagedAttention 技术管理 GPU 显存,让推理服务从”一辆车占整条路”变成”高效流水线”。部署只需一行命令:vllm serve Qwen/Qwen2.5-7B-Instruct,立即可用 OpenAI 兼容 API。


为什么需要专门的推理引擎?

很多人直接用 HuggingFace Transformers 跑模型推理,代码大概长这样:

from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-7B-Instruct")
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-7B-Instruct")
inputs = tokenizer("你好", return_tensors="pt")
outputs = model.generate(**inputs, max_new_tokens=512)

能跑,但问题致命:

问题 Transformers 原生推理 vLLM
显存利用率 仅 30-40%,KV Cache 碎片化严重 接近 100%,块级内存管理
并发吞吐 单请求串行,批处理手写复杂 自动连续批处理(Continuous Batching)
推理延迟 首 token 延迟高,无优化 前缀缓存、CUDA Graph 加速
生产就绪 需自己封装 API、监控、调度 内置 OpenAI 兼容 API、量化支持

一句话:Transformers 是研究框架,vLLM 是生产框架。


vLLM 核心原理:PagedAttention

vLLM 的灵魂是 PagedAttention,论文发表于 SOSP 2023。它的灵感来自操作系统的虚拟内存分页机制。

传统 KV Cache 管理的问题

大模型推理时,每生成一个 token 都要访问之前所有 token 的 Key-Value 矩阵(KV Cache)。传统方式为每个请求预分配一整块连续显存:

  • 如果预留太小 → token 生成到一半显存溢出
  • 如果预留太大 → 大量显存闲置,并发量直线下降
  • 不同请求之间无法共享显存块

PagedAttention 的做法

把 KV Cache 切成固定大小的”页”(Block),像虚拟内存一样按需分配:

请求A: [Block 0] -> [Block 3] -> [Block 7]
请求B: [Block 1] -> [Block 5] -> [Block 3]  ← 共享 Block 3!
请求C: [Block 2] -> [Block 4]

核心收益

  • 显存零碎片:块大小固定,不存在”预留太大/太小”的问题
  • KV Cache 共享:并行采样(Beam Search)时多个序列可共享同一组 KV Block
  • 吞吐提升 24x:同等硬件下可同时服务 24 倍多的请求

5 分钟快速上手

1. 安装

pip install vllm

推荐在 Python 3.9+ 、CUDA 12.1+ 环境下安装。如需特定版本:

# 安装最新稳定版
pip install vllm --upgrade

# 验证安装
python -c "import vllm; print(vllm.__version__)"

2. 启动模型服务

一行命令启动一个兼容 OpenAI API 的推理服务:

vllm serve Qwen/Qwen2.5-7B-Instruct \
  --host 0.0.0.0 \
  --port 8000 \
  --max-model-len 8192 \
  --gpu-memory-utilization 0.90

参数说明:

参数 含义 建议值
--host 监听地址 0.0.0.0(允许外部访问)
--port 服务端口 8000
--max-model-len 最大上下文长度 模型支持的最大值
--gpu-memory-utilization GPU 显存利用率 0.85-0.95
--tensor-parallel-size 多卡张量并行 等于 GPU 数量

3. 调用 API

服务启动后,用标准 OpenAI 客户端调用:

from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:8000/v1",
    api_key="not-needed"
)

response = client.chat.completions.create(
    model="Qwen/Qwen2.5-7B-Instruct",
    messages=[
        {"role": "user", "content": "用三句话解释什么是 PagedAttention"}
    ],
    temperature=0.7,
    max_tokens=512
)

print(response.choices[0].message.content)

完全兼容 OpenAI SDK,现有项目改个 base_url 就能切过来。


推理引擎对比:vLLM vs 其他

特性 vLLM Ollama SGLang TensorRT-LLM
定位 高性能生产推理 本地桌面易用 结构化生成 NVIDIA 极致优化
PagedAttention ✅ 原创 ✅ RadixAttention ❌ 自有方案
OpenAI API 兼容 ✅ 原生 需 Triton Server
安装难度 pip install 一键安装包 pip install 复杂,需编译
量化支持 GPTQ/AWQ/FP8 GGUF FP8 INT4/INT8/FP8
适用场景 生产 API 服务 个人本地使用 结构化 JSON 输出 最高吞吐场景
前缀缓存 ✅ Automatic Prefix Caching ✅ RadixAttention

选型建议

  • 搭生产级 API 服务 → vLLM
  • 本地尝鲜、个人使用 → Ollama
  • 需要稳定 JSON 结构化输出 → SGLang
  • NVIDIA 深度绑定、极致吞吐 → TensorRT-LLM

生产环境最佳实践

1. 显存规划

# 查看模型显存需求(不启动服务)
vllm serve Qwen/Qwen2.5-7B-Instruct --dry-run

2. 开启前缀缓存

对于多轮对话场景,前缀缓存可大幅降低首 token 延迟:

vllm serve Qwen/Qwen2.5-7B-Instruct \
  --enable-prefix-caching

3. 量化部署(节省显存)

# AWQ 量化(推荐,精度损失极小)
vllm serve Qwen/Qwen2.5-7B-Instruct-AWQ \
  --quantization awq

# GPTQ 量化
vllm serve TheBloke/Llama-2-7B-GPTQ \
  --quantization gptq

4. 多卡并行

# 4 卡张量并行
vllm serve Qwen/Qwen2.5-72B-Instruct \
  --tensor-parallel-size 4

5. Docker 部署

FROM vllm/vllm-openai:latest
ENV MODEL_NAME=Qwen/Qwen2.5-7B-Instruct
ENTRYPOINT ["vllm", "serve", "$MODEL_NAME"]

总结

vLLM 用操作系统的分页思想解决了大模型推理中最大的瓶颈——KV Cache 显存管理。核心就三点:

  1. PagedAttention:块级显存管理,消除碎片,支持 KV Cache 共享
  2. Continuous Batching:自动批处理,最大化 GPU 利用率
  3. OpenAI 兼容 API:零迁移成本,改个 URL 就能用

延伸阅读