推理引擎vLLM原理介绍及大语言模型部署实践
一、什么是 vLLM
vLLM(Very‑Large‑Language‑Model inference)是伯克利大学开源、业界最主流的高性能大模型推理 & 部署引擎之一。
- 定位:只做推理(生成回答),不做训练
- 目标:榨干 NVIDIA‑CUDA 显卡,用更少显存,跑更高并发、更快输出 token
- 对比原生
Transformers:吞吐量最高可提升 20‑24 倍
简单一句话:本地部署 Qwen、Llama、DeepSeek 等开源大模型,想快、想多用户同时访问,就用 vLLM 加速。
二、背景痛点(为什么需要 vLLM)
大模型对话生成时,每一轮都要保存 KV‑Cache(键值缓存),也就是历史上下文,这个东西非常吃显存。
传统推理框架 2 个致命问题:
- KV 缓存要求一块连续显存,对话长短不一。 → 显存碎片爆炸,大量显存白白浪费(浪费 60%‑80%)。
- 静态批处理:一批请求必须全部生成完毕,才能换下一批;一个超长对话,拖慢所有人。 → GPU 利用率常常不到 30%,并发上不去。
三、两大核心技术(vLLM 快的根源)
1. PagedAttention 分页注意力(最核心创新)
借鉴操作系统虚拟内存分页思想,管理 GPU 显存
- 把 KV‑Cache 切成一个个固定大小小块 (block,默认 16 个 token)
- 块不需要在显存里连续存放,用一张映射表(block‑table)记录位置
- 生成新 token 时,按需分配块,不用一次性预留一大片显存
收益:
- 显存浪费降到 <4%,显存利用率 > 95%
- 相同显卡,可以同时跑 几倍‑十几倍并发对话
- 相同前缀提示词(很多人问同一个问题),KV 块可以共享复用显存
2. Continuous Batching(连续批处理 / 动态批处理)
抛弃 “整批等待结束”。哪个对话生成完了,立刻塞一个新请求进来,不用等整批结束。 GPU 时时刻刻都在干活,不会空闲等待,吞吐量大幅上涨。
四、vLLM 主要能力清单vLLM
- 兼容 HuggingFace 几乎所有开源模型(Llama、Qwen、GLM、DeepSeek 等)
- OpenAI 兼容接口,一行命令启动 API 服务,前端直接调用
- 流式输出(打字机效果)
- 多卡张量并行,跑 70B、400B 超大模型
- 丰富量化:GPTQ、AWQ、INT4/INT8、FP8,显存不够用量化降显存
- 前缀缓存 (Prefix‑Caching)、多 LoRA、推测解码等高级功能
- 支持 NVIDIA CUDA 显卡(主力)、AMD GPU、Intel GPU
五、常见对比
| 框架 | 定位 | 特点 |
|---|---|---|
| Transformers | 原生库 | 最简单,速度慢,适合调试 |
| vLLM | 高性能推理引擎 | 吞吐量之王,首选生产部署 |
| TensorRT‑LLM | 英伟达官方加速 | 单请求延迟低,NVIDIA 生态最优 |
| Ollama | 一键本地部署 | 简单易用,底层推理效率弱于 vLLM |
| SGLang | 新一代推理引擎 | 和 vLLM 竞品,擅长长上下文、Agent 调用 |
六、实战部署
下面进入实战环节,我们从零开始部署通义千问 Qwen3-8B 模型。
6.1 环境要求
- 操作系统:Linux(推荐 Ubuntu 22.04)
- GPU:NVIDIA 显卡,显存 ≥ 16GB(BF16)或 ≥ 8GB(INT4 量化)
- CUDA:11.8 / 12.1+
- Python:3.9 – 3.11
6.2 安装 vLLM
推荐使用 pip 直接安装稳定版:
# 创建虚拟环境(可选但推荐)
conda create -n vllm python=3.10 -y
conda activate vllm
# 安装 vLLM(自动匹配 CUDA 版本)
pip install vllm -i https://pypi.tuna.tsinghua.edu.cn/simple
# 验证安装
vllm --version
6.3 下载 Qwen3-8B 模型
有两种方式获取模型:HuggingFace 或 ModelScope(国内推荐)。
方式一:ModelScope(国内速度快)
pip install modelscope -i https://pypi.tuna.tsinghua.edu.cn/simple
python -c "
from modelscope import snapshot_download
model_dir = snapshot_download(
'Qwen/Qwen3-8B',
cache_dir='./models'
)
print(model_dir)
"
方式二:HuggingFace
huggingface-cli download Qwen/Qwen3-8B --local-dir ./models/Qwen3-8B
6.4 基础启动:一行命令开启 API 服务
vLLM 提供了开箱即用的 OpenAI 兼容 API 服务:
vllm serve ./models/Qwen3-8B \
--served-model-name qwen3-8b \
--host 0.0.0.0 \
--port 8000 \
--max-model-len 8192 \
--gpu-memory-utilization 0.9 \
--trust-remote-code
关键参数说明:
| 参数 | 作用 |
|---|---|
--served-model-name |
API 调用时使用的模型名称 |
--max-model-len |
最大上下文长度,根据显存调整 |
--gpu-memory-utilization |
GPU 显存占用比例上限,0.9 即使用 90% 显存 |
--trust-remote-code |
允许加载模型自定义代码,Qwen 系列必加 |
看到 Uvicorn running on http://0.0.0.0:8000 即表示启动成功。
6.5 验证服务:调用 Chat Completions API
服务启动后,新开一个终端测试:
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "qwen3-8b",
"messages": [
{"role": "user", "content": "用一句话解释什么是 PagedAttention"}
],
"temperature": 0.7
}'
Python SDK 调用(OpenAI 兼容):
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8000/v1",
api_key="token-xxx" # 本地不校验,填任意值即可
)
response = client.chat.completions.create(
model="qwen3-8b",
messages=[
{"role": "user", "content": "用一句话解释什么是 PagedAttention"}
]
)
print(response.choices[0].message.content)
6.6 流式输出(SSE)
开启流式输出,实现打字机效果:
stream = client.chat.completions.create(
model="qwen3-8b",
messages=[{"role": "user", "content": "写一段 200 字的技术介绍"}],
stream=True
)
for chunk in stream:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
6.7 进阶:AWQ 量化部署(显存减半)
如果显存不足 16GB,可以使用 INT4 量化版本,显存占用可降到 7–8GB:
# 下载 AWQ 量化版模型
python -c "
from modelscope import snapshot_download
snapshot_download('qwen/Qwen3-8B-AWQ', cache_dir='./models')
"
# 启动量化服务
vllm serve ./models/Qwen3-8B-AWQ \
--served-model-name qwen3-8b-awq \
--host 0.0.0.0 \
--port 8000 \
--quantization awq_marlin \
--max-model-len 16384 \
--gpu-memory-utilization 0.95 \
--trust-remote-code
--quantization awq_marlin 启用 Marlin 内核,AWQ 量化推理速度比普通反量化快 2–3 倍。
6.8 多卡张量并行(TP)
单卡装不下时,使用张量并行跨多张 GPU:
# 2 卡张量并行
vllm serve ./models/Qwen3-8B \
--served-model-name qwen3-8b \
--tensor-parallel-size 2 \
--max-model-len 32768 \
--trust-remote-code
6.9 生产级优化参数
线上部署时,建议加上以下参数调优:
vllm serve ./models/Qwen3-8B \
--served-model-name qwen3-8b \
--host 0.0.0.0 \
--port 8000 \
--max-model-len 8192 \
--max-num-seqs 128 \ # 最大并发请求数
--max-num-batched-tokens 8192 \ # 单批最大 token 数
--gpu-memory-utilization 0.85 \ # 保守值,避免 OOM
--enable-prefix-caching \ # 开启前缀缓存,系统提示词共享
--trust-remote-code \
--dtype bfloat16 # 使用 BF16 精度(安培及以上架构)
6.10 后台守护运行
生产环境使用 systemd 或 nohup 后台运行:
nohup vllm serve ./models/Qwen3-8B \
--served-model-name qwen3-8b \
--host 0.0.0.0 \
--port 8000 \
--max-model-len 8192 \
--trust-remote-code \
> vllm.log 2>&1 &
七、性能验证与参考数据
以 Qwen3-8B 为例,不同部署方式下的典型表现(单卡 RTX 4090 24GB):
| 部署方式 | 精度 | 显存占用 | 生成速度 | 最大并发 |
|---|---|---|---|---|
| 原生 Transformers | BF16 | ~18GB | ~40 tokens/s | 2–4 |
| vLLM 基础版 | BF16 | ~16GB | ~80–100 tokens/s | 32–64 |
| vLLM + AWQ INT4 | INT4 | ~7–8GB | ~120–150 tokens/s | 64–128 |
可以看到,vLLM 不仅生成速度翻倍,并发能力更是有数量级提升 —— 这正是 PagedAttention + Continuous Batching 共同作用的结果。
八、常见问题与排障
Q1:启动报错 CUDA out of memory
- 降低
--max-model-len - 调低
--gpu-memory-utilization(如 0.8) - 减少
--max-num-seqs - 换用量化版本模型
Q2:国内下载模型速度慢
- 使用 ModelScope 替代 HuggingFace
- 设置环境变量
VLLM_USE_MODELSCOPE=true
Q3:Qwen 系列模型加载失败
- 务必加上
--trust-remote-code参数 - 确保 vLLM 版本 ≥ 0.4.2(Qwen3 建议 ≥ 0.5.x)
Q4:并发高时延迟明显上升
- 调小
--max-num-batched-tokens - 开启前缀缓存
--enable-prefix-caching - 考虑增加张量并行卡数
九、总结
vLLM 通过 PagedAttention 分页显存管理 解决了 KV-Cache 的显存碎片问题,又通过 Continuous Batching 连续批处理 消除了 GPU 等待空转,两项创新共同将大模型推理吞吐量推向了新的高度。
对于大多数企业私有化部署和个人高阶玩家而言,vLLM 都是性价比极高的选择 —— 兼容 OpenAI 接口、支持几乎所有主流模型、部署成本低、生态成熟。从本文的 Qwen3-8B 部署实践可以看到,只需几行命令,就能把一张消费级显卡的推理能力发挥到极致。
如果你的业务正在从原型走向生产,或者本地部署的模型并发总上不去,不妨试试 vLLM—— 它可能会让你对手里的显卡性能有全新的认识。

浙公网安备 33010602011771号