推理引擎vLLM原理介绍及大语言模型部署实践

一、什么是 vLLM

vLLM(Very‑Large‑Language‑Model inference)是伯克利大学开源、业界最主流的高性能大模型推理 & 部署引擎之一。

  • 定位:只做推理(生成回答),不做训练
  • 目标:榨干 NVIDIA‑CUDA 显卡,用更少显存,跑更高并发、更快输出 token
  • 对比原生 Transformers:吞吐量最高可提升 20‑24 倍

简单一句话:本地部署 Qwen、Llama、DeepSeek 等开源大模型,想快、想多用户同时访问,就用 vLLM 加速

二、背景痛点(为什么需要 vLLM)

大模型对话生成时,每一轮都要保存 KV‑Cache(键值缓存),也就是历史上下文,这个东西非常吃显存。

传统推理框架 2 个致命问题:

  1. KV 缓存要求一块连续显存,对话长短不一。 → 显存碎片爆炸,大量显存白白浪费(浪费 60%‑80%)
  2. 静态批处理:一批请求必须全部生成完毕,才能换下一批;一个超长对话,拖慢所有人。 → GPU 利用率常常不到 30%,并发上不去。

三、两大核心技术(vLLM 快的根源)

1. PagedAttention 分页注意力(最核心创新)

借鉴操作系统虚拟内存分页思想,管理 GPU 显存

  1. 把 KV‑Cache 切成一个个固定大小小块 (block,默认 16 个 token)
  2. 不需要在显存里连续存放,用一张映射表(block‑table)记录位置
  3. 生成新 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—— 它可能会让你对手里的显卡性能有全新的认识。

posted @ 2026-08-26 10:51  wanghongwei-dev  阅读(8)  评论(0)    收藏  举报