vLLM 是当前最主流的开源 LLM 推理服务引擎,核心解决一个工程问题:在有限的 GPU 显存下,用更快的速度、更高的吞吐量跑大模型。传统推理方式在大并发下显存被 KV 缓存(模型生成时缓存历史 token 的键值向量)大量占用,批处理不灵活,吞吐上不去。vLLM 通过 PagedAttention(分页式 KV 缓存管理)和连续批处理(Continuous Batching)两大机制,把显存利用率提高到接近 90%,并把吞吐量提升到 Hugging Face Transformers 的数倍甚至数十倍。 业界大量生产环境(OpenAI 兼容 API 服务、私有化部署、RAG 应用)都在用它做模型服务。相比 LangChain 这类编排框架,vLLM 专注“把模型高效跑起来”;相比 TensorRT-LLM 这类编译优化方案,它上手更简单、模型生态更广。本篇按「安装 → 跑通服务 → 核心机制 → 生产运维」的顺序,让你读完能直接部署一个高吞吐推理服务。
对 AI 从业者而言,vLLM 是进入 LLM 推理基础设施领域的必修课——掌握它的调度、显存与部署机制,是 MLOps、推理平台工程师的核心竞争力。
目录
速览卡是工具类内容的固定首屏模块:30 秒判断「这工具是什么、能不能商用、适不适合我」。
为什么需要 vLLM:传统推理吞吐瓶颈 → 高吞吐方案
在 vLLM 出现前,主流推理方案有两种:直接调用 Hugging Face Transformers 的 generate,或使用简单的批处理服务。前者每个请求独占显存,KV 缓存按最大序列长度预分配,实际用不到的部分全部浪费,显存碎片化严重;后者要求同批次请求同时开始、同时结束,先完成的请求必须空等,GPU 大量时间在“空转”。结果是:单卡跑 7B 模型看似没问题,一上并发或长上下文,显存立刻爆炸,吞吐掉到每卡每秒几个 token。
vLLM 从操作系统内存管理获得启发,实现 PagedAttention:把 KV 缓存切成固定大小的“页”,按需分配,像虚拟内存一样消除碎片,显存利用率接近零浪费;配合底层调度器的连续批处理,请求一结束立刻腾出位置给新请求加入,GPU 从不空等。官方 README 披露,相比 Hugging Face Transformers,吞吐最高可提升 24 倍。
与同类工具的气质差异在于:vLLM 采取“调度器 + 运行时优化”路线,不做模型编译,因此对新模型(Hugging Face 上主流开源权重)开箱即用,不需要像 TensorRT-LLM 那样为每个模型构建 TensorRT 引擎;又比 llama.cpp 更面向服务化多用户场景。这也是它能成为社区默认推理框架的原因。
安装与环境配置:3 步就绪
步骤一 · 安装:vLLM 是 Python 包,最简方式直接 pip 安装。要求 Python 3.9–3.12、CUDA 11.8 或 12.1+(NVIDIA GPU 显存建议 16GB 以上跑 7B 级模型)。若机器没有预编译 wheel 匹配,pip 会尝试从源码编译,耗时较长,此时建议改用 Docker 镜像 vllm/vllm-openai,镜像内含完整预编译环境和模型服务入口。
步骤二 · 配置:默认从 Hugging Face 下载模型。若在离线环境,提前设置 HF_HOME 指向本地模型缓存目录,或用 HF_ENDPOINT=https://hf-mirror.com 指定下载镜像。
步骤三 · 验证:导入包并输出版本号,确认安装成功。
pip install vllm # 离线环境可选:指定模型缓存目录export HF_HOME=/data/models # 验证安装python -c "import vllm; print(vllm.__version__)" # Docker 方式(含预编译环境)docker run --gpus all -p 8000:8000 \ vllm/vllm-openai:latest \ --model Qwen/Qwen2.5-7B-Instruct
快速上手:10 分钟跑通 OpenAI 兼容服务
vLLM 最常用的方式是启动 OpenAI 兼容的 HTTP 服务。整套流程分三步:确认模型 ID → 启动服务 → 用 curl 或 OpenAI SDK 调用。服务启动时会先下载模型权重并做预热,7B 模型在 A100/H100 上通常 1–3 分钟即可就绪。
步骤一:在 Hugging Face 上确认目标模型的完整 ID(如 Qwen/Qwen2.5-7B-Instruct)。需要先登录 Hugging Face 账号并同意该模型的许可协议;也可使用本地已下载的模型路径。
步骤二:执行 vllm serve <model_id> 启动服务,默认监听 0.0.0.0:8000。访问官方 OpenAI 接口根路径 /v1 即可查看支持的路由。常用参数:--gpu-memory-utilization 控制显存占用上限,--max-model-len 限制最大上下文长度,--tensor-parallel-size 启用多卡张量并行。
步骤三:用 curl 发起 Chat Completions 请求验证服务。
进阶技巧:客户端直接使用 openai Python SDK,把 base_url 指向 http://localhost:8000/v1 即可无缝接入,无需改业务代码。
如果只做离线批量推理(如离线清洗数据、批量评测),vLLM 也提供 LLM 类 Python API,适合在脚本或 Notebook 中直接调用。示例代码如下:
vllm serve Qwen/Qwen2.5-7B-Instruct \ --gpu-memory-utilization 0.9 \ --max-model-len 8192 # 另开终端验证curl http://localhost:8000/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{"model":"Qwen/Qwen2.5-7B-Instruct", "messages":[{"role":"user","content":"介绍北京"}]}'
from vllm import LLM, SamplingParams llm = LLM(model="Qwen/Qwen2.5-7B-Instruct")params = SamplingParams(temperature=0.7, max_tokens=256)outputs = llm.generate(["介绍上海", "写一首诗"], params)for output in outputs: print(output.outputs[0].text)
核心能力详解:4 大支柱
支柱一 · PagedAttention 分页 KV 缓存管理。生成式 LLM 每生成一个 token 都要读取此前所有 token 对应的 KV 缓存(即历史键值向量),传统实现按最大长度预分配连续显存,造成巨大浪费。PagedAttention 将缓存切分为固定大小的内存块(block),按需分配、按块索引,显存碎片率趋近于零。实测显存占用可降低 50% 以上,是 vLLM 吞吐优势的根基。
支柱二 · 连续批处理调度。vLLM 调度器以迭代(iteration)为粒度动态决定每步计算哪些请求:新请求可随时加入、完成的请求立即退出,同一步内不同请求可处于不同生成阶段。传统批处理需要整个 batch 同步开始和结束,而连续批处理让 GPU 始终在处理“有效生成”,吞吐成倍提升。
支柱三 · 执行层优化。包括 CUDA Graph 捕获(将算子启动开销从毫秒级降到微秒级,减少内核启动 overhead)、算子融合、FP8/INT8/INT4/AWQ/GPTQ 等量化支持、投机解码(Speculative Decoding,用小模型草稿+大模型验证的方式加速生成)。这些优化叠加,使单卡 token 吞吐达到每秒数千甚至上万。
支柱四 · OpenAI 兼容服务与多卡扩展。vllm serve 提供 OpenAI 原生接口(/v1/chat/completions、/v1/completions、/v1/embeddings),支持流式输出,兼容 LangChain、LlamaIndex 等生态。多卡部署用 --tensor-parallel-size N 把单模型切分到多卡并行推理;超过单机时可用 --pipeline-parallel-size 做流水线并行。vLLM 还支持 LoRA 多适配器动态加载、多模态模型(如 Qwen2-VL、Llama 3.2 Vision)和结构化输出,可直接接入 RAG、Agent 等上层应用。
生产部署与监控:从上线到运维
部署方式一 · Docker 单机部署:生产环境最推荐用官方 vllm/vllm-openai 镜像,避免源码编译与依赖冲突。注意挂载模型缓存目录以复用已下载权重,并设置 --ipc=host 避免多进程共享内存不足。启动后可用 systemd 或 supervisor 守护进程。
部署方式二 · Kubernetes 集群部署:生产环境通常用 K8s 编排,将 vLLM 封装为 Deployment + Service。关键点是给 Pod 声明 nvidia.com/gpu 资源、设置 --pipeline-parallel-size 跨节点时配合 hostNetwork 或 Headless Service 满足 NCCL 通信需求。前端加 Gateway/Ingress 做负载均衡与鉴权。这种方式适合需要弹性扩缩容的多副本场景。
可观测性:vLLM 内置 Prometheus 指标端点 /metrics,提供 vllm:num_requests_running(正在生成请求数)、vllm:num_requests_waiting(排队请求数)、vllm:generation_tokens_total(生成 token 总数)、vllm:time_to_first_token_seconds(首 token 时延)等关键指标。建议配合 Grafana 监控:首 token 时延(TTFT)上涨说明排队严重,应扩容副本或降低 --max-num-seqs 限制;GPU 利用率长期低于 80% 说明并发不足或模型在等 I/O。生产环境同时开启 --structured-logs(结构化 JSON 日志)和 --otlp-traces-endpoint(OpenTelemetry 链路追踪)以排查单请求瓶颈。
<p class="para-label">避坑清单:</p>
<ul class="dash-list"><li>坑 1:--gpu-memory-utilization 设太高(如 0.98)导致显存 OOM:它只预留了少量不参与缓存池的显存,上下文一长容易触发 OOM,生产建议 0.85–0.92。</li><li>坑 2:max-model-len 改大导致并发骤降:KV 缓存按 max-model-len 预留页数,设得越大单请求占显存越多、并发越低,应小于模型训练上下文长度且匹配真实业务。</li><li>坑 3:用 pip 在无预编译 wheel 的环境安装,源码编译要 20 分钟以上且易失败:优先用官方 Docker 镜像,或加装对应 CUDA 工具链再安装。</li><li>坑 4:多卡 NCCL 通信失败:容器内需 --ipc=host 并确保 GPU 拓扑可见;跨机时配置 NCCL_SOCKET_IFNAME 指向业务网卡。</li><li>坑 5:量化与硬件不匹配:FP8 需 Ada/Hopper 架构(如 L4、H100),旧卡跑 FP8 会回退到慢路径,部署前先确认文档里的硬件支持矩阵。</li></ul>
docker run -d --name vllm-serve --gpus all \ -v /data/models:/root/.cache/huggingface \ -p 8000:8000 --ipc=host \ vllm/vllm-openai:latest \ --model Qwen/Qwen2.5-32B-Instruct \ --tensor-parallel-size 2 \ --gpu-memory-utilization 0.9
| 维度 | vLLM | Hugging Face TGI | TensorRT-LLM | llama.cpp |
|---|---|---|---|---|
| 定位 | LLM 推理服务引擎 | 面向生产的高吞吐推理服务器 | NVIDIA 专属编译优化推理框架 | 本地轻量推理(C++ 实现) |
| 编排范式 | 连续批处理 + 分页 KV 调度 | 连续批处理 + 预分配缓存 | 编译期图优化 + 批处理 | 单进程单模型,无服务端调度 |
| 类型约束 | 需内核支持模型算子,主流开源模型基本兼容 | 依赖 HF 生态与模型转换 | 需为每个模型构建 TensorRT 引擎 | 需 GGUF 格式量化模型 |
| 学习曲线 | 中:Python 上手快,调度参数需理解 | 中低:以服务为主,配置简单 | 高:涉及引擎构建、图优化 | 低:命令行运行,适合本地 |
| 生态集成 | OpenAI 兼容 API、Ray、LangChain、多模态 | OpenAI 兼容 API、HF Hub 集成 | Triton 推理服务器集成 | 绑定绑定各类本地应用与远端 API |
| 生产部署 | Docker/K8s,Prometheus 指标完善 | Docker/K8s,HF 官方运维成熟 | 强依赖 NVIDIA 生态与 Triton | 多见于边缘/本地点对点场景 |
| License | Apache 2.0 | Apache 2.0 | Apache 2.0 | MIT |
| 适合谁 | 需要快速部署高吞吐服务的团队 | 已深度使用 HF 生态的团队 | 追求极致性能且专攻 NVIDIA | 本地调试、离线单机用户 |
选型建议:默认选 vLLM——模型覆盖广、API 兼容 OpenAI、运维指标完善,适合绝大多数生产场景。已在 HF 生态且要求最小化运维可选择 TGI;追求单卡极限性能且环境固定在 NVIDIA 选 TensorRT-LLM;个人电脑或离线小批量场景用 llama.cpp 最省事。
版本迭代
vLLM 从 2023 年论文项目起步,v0.6 起完成引擎核心重构,v0.7 引入异步 EngineCore 与多步调度,v0.8 在调度、量化与多模态方面深度打磨,版本节奏约每月一个正式版(截至训练数据,后续可能有更新版本)。
| 版本 | 时间 | 变化 | 提升 |
|---|---|---|---|
| v0.6.0 | 2024-10 | 引擎核心重构 | 分离 LLMEngine 与 AsyncLLM,服务端模块化,为新增调度能力打基础 |
| v0.6.6 | 2024-12 | 稳定版维护 | 完善 FP8、LoRA 与量化支持,修复多模态模型兼容问题 |
| v0.7.0 | 2025-01 | 异步 EngineCore 与多步调度 | 调度吞吐提升,引入 vLLM 2 预览路线,降低排队时延 |
| v0.8.0 | 2025-03 | 大版本重构 | 重写 PagedAttention 内存管理,量化框架整合,嵌入与多模态能力增强 |
| v0.8.4 | 2025-05 | 稳定性迭代 | 修复显存泄漏与边缘模型加载问题,结构化输出稳定性提升 |
| v0.8.6 | 2025-06 | 最新正式版 | 更多新模型支持、量化路径改进,多项 bug 修复,作为当前推荐生产版本 |
vLLM 的迭代主线是“把调度做快、把显存做省、把兼容做广”。官方 README 披露相比 Hugging Face Transformers 吞吐最高提升 24 倍(具体数值随模型/硬件变化,建议以自建 bench 为准)。选型建议:新项目直接使用 v0.8.x 分支,生产环境跟随 v0.8.4+ 即可;不要长期停留在 v0.5 及更早版本,其调度器与 API 差异较大。
AI 应用场景
场景 1:RAG 应用的高并发服务端推理
解决的问题:RAG 应用需要同时服务大量用户请求,每个请求都要先检索再生成。传统推理在大并发下因 KV 缓存碎片和批处理不灵活,首 token 时延与吞吐双双恶化。vLLM 的连续批处理让检索类短请求迅速完成并让出位置,PagedAttention 让 32k 长上下文检索结果也能在单卡跑动。
具体案例:某企业内部知识库问答系统,将后端推理从 Transformers 改为 vLLM 服务后,同规格 2 卡 A100 下并发请求数从 8 提升至 60+,约 7 倍吞吐提升,P95 首 token 时延稳定在 1 秒内。
场景 2:Agent 与批处理任务的大规模并行
解决的问题:AI Agent(如代码审查、自动化测试生成)会发起大量独立的小请求,离线评测/数据清洗更是需要一次性跑成千上万个 prompt。vLLM 支持 LLM.generate 批量推理与服务的流式输出,GPU 利用率在长尾请求下依然饱满;多卡张量并行进一步支撑 70B+ 大模型在 Agent 任务中的实时响应。
具体案例:某代码助手团队用 vLLM 批量跑 1 万条代码补全测试,8 卡 A100 上约 25 分钟完成,比之前逐条调用 HF 的串行方式快约 20 倍。
场景 3:私有化部署与 LLM 成本压缩
解决的问题:生成式 AI 的边际成本主要是 GPU 推理成本。vLLM 通过量化(FP8/INT4)与高吞吐并发,让同样的推理吞吐用更少的卡完成,是私有化部署的首选落点。
具体案例:某金融公司私有化部署 7B 对话模型,从 naive 推理切到 vLLM + FP8 后,峰值吞吐提高约 6 倍,GPU 采购量从 12 卡降到 4 卡,推理成本下降约 60%。
常见误区
误区把模型放进 vLLM 就能自动获得 24 倍吞吐,模型不兼容时会提示报错。
正解24 倍是在官方支持的模型、连续批处理满载场景下的对比值,且需要模型算子被 vLLM 内核支持。若模型使用新颖算子或自定义前向结构,vLLM 可能回退到较慢的实现,吞吐不升反降。使用前应在官方「支持的模型列表」中确认目标模型,并做最小吞吐基准测试。
为何常见:官方 README 宣传的是“最高 24 倍”,用户容易把上限当成常态,且不了解其内核依赖。
误区把 `--gpu-memory-utilization` 设成 0.99 就能跑更大模型、更多并发。
正解该参数是 KV 缓存池可占显存的上限,设太高会导致权重加载后剩余可分配空间不足,长上下文时直接 OOM 崩溃。生产建议 0.85–0.92,同时配合 --max-model-len 控制单请求上限,预留系统与 CUDA context 开销。
为何常见:从直觉上“用满显存 = 不浪费”,但忽略了页表、CUDA context、权重之外的运行时开销。
误区所有 OpenAI SDK 参数在 vLLM 上都生效,换 `base_url` 就能无损迁移。
正解vLLM 实现了 OpenAI Chat/Completions/Embeddings 路由与主要参数,但部分参数不支持或忽略(如 logprobs 的详细选项、user 字段在 vllm 中的处理、Chat Templating 差异等)。迁移前应做参数对齐测试,重点检查 max_tokens、stop、stream、temperature 行为。
为何常见:语言模型服务都宣称“OpenAI 兼容”,用户默认这是完整等价,实际上兼容通常只覆盖主流通用参数。
误区用 INT4/FP8 量化一定能提速且模型性能不变。
正解量化能降低显存占用和带宽压力,但会引入精度损失,在代码生成、数学推理等对 logit 敏感的任务上效果退化明显;且 INT4(如 AWQ/GPTQ)依赖权重反量化解码,实际加速幅度因算子而异。生产上线前必须用评测集对比量化前后效果,必要时采用 FP8 这类损失较小的方案。
为何常见:量化省显存、提速度的效果直观,量化误差在短文本示例上难以感知,容易被忽视。
误区vLLM 是 CUDA 专属框架,没 A100/H100 就不能用。
正解vLLM 已支持 AMD ROCm、CPU(llama.cpp 之外的服务化 CPU 路径)、Intel 系列及 Google TPU 的扩展构建,但需要按官方文档编译对应后端,性能与兼容性弱于 CUDA 路径。判断能否使用,看官方文档中的「安装 — 平台支持」表,而不是只听 NVIDIA 生态的案例。
为何常见:vLLM 的绝大多数教程和 benchmark 基于 NVIDIA GPU,信息环境形成了“只有 NVIDIA”的印象。
面试题
Q1. vLLM 中 PagedAttention 主要解决什么问题?
- A.KV 缓存的显存碎片化← 正确答案
- B.模型参数过多的问题
- C.训练数据不平衡的问题
- D.网络带宽不足的问题
答案:A。PagedAttention 像虚拟内存一样把 KV 缓存切成固定大小的块按需分配,解决预分配连续缓存造成的碎片与浪费。它与模型参数量、训练数据无关,也不涉及网络传输。
Q2. 启动 vLLM OpenAI 兼容服务使用哪个命令?
- A.vllm serve← 正确答案
- B.vllm start
- C.python run
- D.serve gpt
答案:A。vllm serve <model_id> 是启动 OpenAI 兼容 HTTP 服务的官方入口,默认监听 0.0.0.0:8000 并提供 /v1 路由。其余命令均不是 vLLM 提供或常用的服务启动方式。
Q3. vLLM 采用的开源协议是?
- A.Apache 2.0← 正确答案
- B.MIT
- C.GPL-3.0
- D.商业专有
答案:A。vLLM 使用 Apache 2.0 协议,允许商用、修改和再分发,附带专利授权条款,对生产使用限制最少。
Q4. “连续批处理”的核心行为是?
- A.整个批次必须同时开始、同时结束
- B.每步动态调度:请求完成立刻让位,新请求随时加入← 正确答案
- C.按请求到达时间严格串行处理
- D.将模型切分为多段流水执行
答案:B。连续批处理以迭代为粒度,让不同请求在同一 batch 中处于不同生成阶段,完成者让位、新请求补入,避免 GPU 空等。A 是传统批处理,C 是串行,D 是流水线并行。
Q5. --gpu-memory-utilization 0.9 的含义是?
- A.单请求最多使用 90% 显存
- B.KV 缓存池最多占用总显存的 90%← 正确答案
- C.模型权重会被压缩到原体积的 90%
- D.GPU 计算利用率目标为 90%
答案:B。该参数控制 vLLM 缓存池可使用的显存上限,而不是单请求或利用率目标。设太高导致无余量处理长上下文而 OOM,生产建议 0.85–0.92。
Q6. vLLM 服务默认监听端口是?
- A.8000← 正确答案
- B.8080
- C.9000
- D.5000
答案:A。vllm serve 默认 host 为 0.0.0.0、端口为 8000,可用 --host 与 --port 修改。其余端口是常见替代默认值,但不是 vLLM 的默认端口。
Q7. 模型超出一张卡显存时,vLLM 推荐的第一种切分方式是?
- A.tensor parallel← 正确答案
- B.切分模型层数为两个半模型
- C.将权重换入 CPU 内存
- D.按请求轮询多张卡
答案:A。tensor parallel(张量并行)把单个算子的矩阵切分到多卡并行计算,是 vLLM 多卡部署的标准方式(--tensor-parallel-size),通信走 NCCL。C 会导致显存换入换出严重掉速,D 是负载均衡而非单模型显存扩展。
Q8. 显存不足时 vLLM 默认执行 preempt(抢占)的方式是?
- A.重新计算被抢占请求的 KV 缓存← 正确答案
- B.将被抢占请求的 KV 缓存交换到 CPU
- C.立即杀死最早到达的请求
- D.暂停所有新请求直到显存释放
答案:A。vLLM 的调度器在显存不足时默认先做 recomputation(丢弃并重算缓存),因为它无需管理 CPU 交换通道、实现简单且多数场景更快。swap 到 CPU 是补充策略而非默认首选。
Q9. 以下哪些是 vLLM 提升吞吐的手段?
- A.连续批处理← 正确答案
- B.PagedAttention 显存管理← 正确答案
- C.CUDA Graph 捕获← 正确答案
- D.自动为模型增加层数
答案:ABC。连续批处理消除 GPU 空等,PagedAttention 提高显存利用率从而增大可调度请求数,CUDA Graph 降低算子启动开销。D 改变模型结构、不提升吞吐且会损害效果。
Q10. 生产环境观测 vLLM 服务的正确方式包括?
- A.采集 /metrics 端点的 Prometheus 指标← 正确答案
- B.开启 --structured-logs 输出结构化 JSON 日志← 正确答案
- C.配置 --otlp-traces-endpoint 上报链路追踪← 正确答案
- D.直接读取 GPU 寄存器自行分析
答案:ABC。/metrics 提供请求数、tokens、TTFT 等指标;结构化日志便于日志系统检索;OTLP 追踪可定位单请求瓶颈。D 方式成本高、信息零散,不是常规观测手段。