首页/AI/大模型部署与运维速查/vLLM 推理引擎与 PagedAttention
部署形态与选型43 条

vLLM 推理引擎与 PagedAttention

vLLM 是 GPU 上的高吞吐推理与服务引擎:用 PagedAttention 按块管理 KV 缓存、连续批处理提升 GPU 利用率,并自带 OpenAI 兼容 HTTP 接口,是把开源权重封装成在线 API 的常用方案。

vLLM 解决什么问题

vLLM 是 GPU 上的大模型推理与服务引擎。它的核心贡献是把 KV 缓存按固定大小的块管理(PagedAttention),思路类似操作系统分页:显存不再要求连续,块可以在请求之间复用,碎片浪费从整块级降到块内。它自带 OpenAI 兼容的 HTTP 服务,把开源权重变成在线 API 只需要一条命令。

基本信息

定位高吞吐 LLM 与多模态模型推理、服务引擎
关键机制PagedAttention、连续批处理、前缀缓存
接口OpenAI 兼容 /v1/*,默认监听 8000
依赖NVIDIA GPU + 匹配的驱动与 CUDA 运行时
安装方式pip 安装匹配版本的 wheel,或官方镜像 vllm/vllm-openai

典型使用场景

  • 把开源权重(Qwen、Llama 等)封装成团队内部可用的在线接口
  • 替换按量计费的云 API:本地卡跑满后单位 token 成本显著下降
  • 承接高并发对话服务:连续批处理让多请求共享同一次权重读取
  • 多轮对话与固定系统提示:前缀缓存复用公共 KV,降低首 token 延迟
  • 批量离线任务:用离线接口一次喂多条提示,不需要起 HTTP 服务
  • 同一基座挂载多个 LoRA 适配器,按请求切换不同微调变体

安装与启动

安装与启动
# 安装:优先官方预编译 wheel,源码编译容易踩 CUDA 工具链
pip install vllm
# 新版统一入口,拉起 OpenAI 兼容服务
vllm serve <模型名或本地路径> --host 0.0.0.0 --port 8000
# 旧版等价入口,历史脚本里常见
python -m vllm.entrypoints.openai.api_server --model <模型名或本地路径>
# 验证服务与对外模型名
curl http://127.0.0.1:8000/v1/models

离线批量推理

离线批量推理
from vllm import LLM, SamplingParams
sp = SamplingParams(temperature=0.2, max_tokens=256)
llm = LLM(model="/models/Qwen", tensor_parallel_size=1)   # 单卡加载
outs = llm.generate(["介绍一下 KV 缓存", "什么是张量并行"], sp)
for o in outs:
    print(o.outputs[0].text)   # 逐条输出生成结果

关键参数与端点

项说明
--host / --port服务监听地址与端口,公网暴露前须经网关
--tensor-parallel-size张量并行卡数,单卡装不下权重时按卡切分
--gpu-memory-utilization显存占用上限比例,同时决定 KV 池大小
--max-model-len单请求上下文上限,KV 池按此预留
--quantization量化内核,如 awq / gptq / fp8,需与权重格式一致
/v1/chat/completions主对话端点,请求体兼容 OpenAI 协议
vLLM 迭代较快:同一参数在不同大版本里可能改名或改默认值。上生产前固定版本号,并用 vllm serve --help 核对本机参数表,不要照抄半年前的教程。
显存不足时 vLLM 不总是直接报错:调度器会抢占部分序列重算,表现为个别请求延迟突然变长。看到这种抖动先查 KV 池水位与 --max-num-seqs,而不是只怀疑网络。

上线前核对命令

上线前核对命令
# 固定版本:pip 与镜像都要能查到具体版本号
pip show vllm | grep -i version
nvidia-smi --query-gpu=name,driver_version --format=csv   # 驱动与卡型是否在支持范围
# 服务起来后先核对对外模型名与最大并发设置
curl -s http://127.0.0.1:8000/v1/models
ss -lntp | grep 8000        # 确认监听地址是内网而非 0.0.0.0 公网口
# 压测前后各看一次显存,确认没有持续上涨
nvidia-smi --query-gpu=index,memory.used --format=csv
多实例共享一张卡时先算总账:两个引擎各自按百分比申请显存,比例之和超过 1 就会在启动或压测中途失败,规划时按单卡容量乘各自比例相加核对。

上线前核对项

  • 权重目录是否完整:config.json、tokenizer 相关文件与分片索引文件缺一不可,缺索引会在加载阶段直接失败
  • 对外模型名是否固定:客户端写死别名之后,换权重、换量化都不需要改业务代码
  • 显存是否留余量:KV 池按 P95 上下文长度核算,不要用平均长度估算并发上限
  • 是否由网关暴露:鉴权、限流、日志与请求编号都放在网关层,引擎只监听内网地址
  • 版本是否固定:镜像 tag 与 pip 版本都写具体号,避免重建时被静默升级

易错点

  • 显存不够就先加卡:先降 --max-model-len 或 --gpu-memory-utilization 往往就够,加卡成本高得多
  • 部署脚本只写一种命令入口:vllm serve 与 python -m vllm.entrypoints 在大版本升级后可能失效
  • 用系统 pip 随意装 torch 后再装 vllm:wheel 与宿主 CUDA 不匹配,典型表现是启动即报找不到 CUDA 运行库
  • 把 8000 端口直接对公网开放:引擎自身没有多租户鉴权与配额,必须由网关承担入口安全
  • 多卡机器忘了设 --tensor-parallel-size:单卡装不下权重,失败常发生在权重加载阶段,报错信息容易误导到磁盘

数据来源与参考

  • vLLM 官方文档(docs.vllm.ai)
  • Kwon et al., PagedAttention, SOSP 2023
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌