vLLM 部署 Qwen3 — 另一个主流高性能推理框架
vLLM 是什么
vLLM 是基于 PyTorch 的高性能大模型推理框架。和 SGLang 同属推理加速赛道,vLLM 以 PagedAttention(页式 KV Cache)为核心,在连续批处理、高吞吐场景下表现出色。
vLLM vs SGLang:两者都是顶级推理框架,但各有侧重。vLLM 在 v0.6 版本后完善了对 MoE 模型和思考模式的支持,现在和 SGLang 的功能差距已经很小。选择哪个更多是生态和团队熟悉度的问题。
安装
# CUDA 12.x
pip install vllm
# CUDA 11.8
pip install vllm --extra-index-url https://download.pytorch.org/whl/cu118
# 检查版本
python -c "import vllm; print(vllm.__version__)"
vLLM ≥ 0.6.0 对 Qwen3 的支持更完善,建议用最新版本。
启动服务
基础启动
vllm serve Qwen/Qwen3-8B \
--port 8000 \
--host 0.0.0.0
多卡张量并行
# 2 卡并行
vllm serve Qwen/Qwen3-32B \
--tensor-parallel-size 2 \
--port 8000
# 4 卡
vllm serve Qwen/Qwen3-235B-A22B \
--tensor-parallel-size 4 \
--port 8000
显存优化参数
vllm serve Qwen/Qwen3-8B \
--max-model-len 8192 \ # 降低最大上下文节省 KV Cache
--gpu-memory-utilization 0.9 \ # 用满 90% 显存
--max-num-seqs 32 \ # 最大并行序列数
--port 8000
量化模型
vLLM 支持多种量化格式:
# AWQ 量化(需要 AutoAWQ)
pip install autoawq
vllm serve Qwen/Qwen3-8B-Instruct-AWQ \
--quantization awq \
--port 8000
# GPTQ 量化
pip install auto-gptq
vllm serve Qwen/Qwen3-8B-Instruct-GPTQ \
--quantization gptq \
--port 8000
# FP8 量化(Hopper GPU)
vllm serve Qwen/Qwen3-8B \
--quantization fp8 \
--port 8000
API 调用
Python(OpenAI SDK)
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8000/v1",
api_key="EMPTY"
)
# 关闭思考
response = client.chat.completions.create(
model="Qwen/Qwen3-8B",
messages=[
{"role": "user", "content": "1 + 1 = ?"}
],
max_tokens=512,
extra_body={
"thinking": {"type": "disabled"}
}
)
print(response.choices[0].message.content)
# 流式输出
stream = client.chat.completions.create(
model="Qwen/Qwen3-8B",
messages=[
{"role": "user", "content": "介绍一下 Qwen3。"}
],
stream=True,
extra_body={"thinking": {"type": "disabled"}}
)
for chunk in stream:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="")
Python(vLLM 原生 API)
from vllm import LLM, SamplingParams
llm = LLM(
model="Qwen/Qwen3-8B",
dtype="auto",
max_model_len=8192
)
sampling_params = SamplingParams(
max_tokens=512,
temperature=0.7
)
# 关闭思考
sampling_params.extra_body = {"thinking": {"type": "disabled"}}
# 简单文本补全
outputs = llm.generate(
prompts=["1 + 1 = ?"],
sampling_params=sampling_params
)
print(outputs[0].outputs[0].text)
# 对话(使用 chat 方法)
messages = [
{"role": "system", "content": "你是一个有帮助的助手。"},
{"role": "user", "content": "介绍一下自己。"}
]
outputs = llm.chat(
messages=messages,
sampling_params=sampling_params,
use_default_chat_template=True
)
print(outputs[0].outputs[0].text)
cURL 调用
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen/Qwen3-8B",
"messages": [{"role": "user", "content": "你好"}],
"extra_body": {"thinking": {"type": "disabled"}},
"max_tokens": 512
}'
思考模式在 vLLM 中的控制
vLLM 对思考模式的支持和 SGLang 一样——通过 extra_body 传入:
# 强制关闭
"extra_body": {"thinking": {"type": "disabled"}}
# 强制开启
"extra_body": {"thinking": {"type": "always"}}
# 自动(默认)
"extra_body": {"thinking": {"type": "auto"}}
如果 vLLM 版本较老,extra_body 可能不生效。这时只能靠 prompt 控制:
messages = [{"role": "user", "content": "/no_think 1 + 1 = ?"}]
批量推理
vLLM 的强项之一是批量处理。你可以一次性提交多个请求:
from vllm import LLM, SamplingParams
llm = LLM(model="Qwen/Qwen3-8B")
sampling_params = SamplingParams(
max_tokens=256,
temperature=0.7,
extra_body={"thinking": {"type": "disabled"}}
)
messages_list = [
[{"role": "user", "content": "1 + 1 = ?"}],
[{"role": "user", "content": "2 + 2 = ?"}],
[{"role": "user", "content": "3 + 3 = ?"}],
[{"role": "user", "content": "4 + 4 = ?"}],
]
outputs = llm.chat(messages_list, sampling_params)
for i, output in enumerate(outputs):
print(f"请求 {i}: {output.outputs[0].text}")
vLLM 会自动将多个请求组成 batch,并行处理,吞吐量远高于串行调用。
PagedAttention 原理
vLLM 的 PagedAttention 技术借鉴了操作系统的虚拟内存思想:
- 传统方法:每个请求分配连续的显存空间存 KV Cache,浪费严重
- PagedAttention:把 KV Cache 分成固定大小的"页",用页表管理,按需分配
好处:
- 显存利用率更高(减少碎片)
- 可以处理更长的上下文
- 高并发下吞吐量更高
这也是 vLLM 名字的由来(vLLM = Virtualized LLM)。
vLLM vs SGLang vs TensorRT-LLM
| 方面 | vLLM | SGLang | TensorRT-LLM |
|---|---|---|---|
| 开发方 | 伯克利 SkyLab | LMSYS | NVIDIA |
| 核心技术 | PagedAttention | RadixAttention | TensorRT 优化 |
| 上手难度 | 中等 | 中等 | 较难 |
| 灵活性 | 高(PyTorch 生态) | 高 | 低(NVIDIA 专属) |
| 思考模式支持 | v0.6+ 支持 | 原生支持 | 需自行配置 |
| MoE 支持 | v0.6+ 支持 | 原生优化 | 支持 |
| 多模态 | 支持 | 支持 | 支持 |
| 推荐场景 | 通用 PyTorch 环境 | 生产级服务 | NVIDIA 集群极致性能 |
如果你的环境是 NVIDIA 数据中心 GPU 集群且追求极致性能,TensorRT-LLM 值得考虑。否则 vLLM 和 SGLang 足够用了。
常见问题
服务启动很慢
vLLM 首次启动需要编译 CUDA 内核。设置环境变量可以跳过部分编译:
export VLLM_USE_V1=1 # 用 v1 引擎,更快启动
显存碎片化导致 OOM
- 设置
--gpu-memory-utilization 0.8预留余量 - 降低
--max-model-len - 减少
--max-num-seqs
不支持的模型格式
vLLM 支持 Hugging Face 标准格式。自定义架构可能需要适配。检查版本是否够新——v0.6+ 对 Qwen3 系列支持完善。
相关阅读
- 04-SGLang 推理服务:另一个顶级推理框架
- 03-Transformers 代码调用:原生 PyTorch 加载
- 01-DashScope Python SDK:不想本地部署?用云端 API