vLLM 本地部署实战:给本地大模型换上生产级引擎,吞吐翻倍还兼容 OpenAI API

前阵子我写过 Ollama 的 REST A…

前阵子我写过 Ollama 的 REST API 实战,不少朋友在评论区问:有没有比 Ollama 更狠的本地推理引擎?答案是有的,而且答案非常明确——vLLM。Ollama 适合入门和桌面把玩,但一旦你要把模型做成服务、要扛并发、要给团队当 API 用,vLLM 就是那条绕不开的路。今天手把手带你把它搭起来。

一、为什么放着 Ollama 不用,非要上 vLLM

先说结论,vLLM 的杀手锏就三个:吞吐高、显存省、接口标准。它靠两样技术做到这件事:PagedAttentionContinuous Batching(连续批处理)。PagedAttention 把 KV 缓存像操作系统管理内存一样分页,不再为每条请求预留一整块显存;连续批处理则让新请求随时插进正在跑的批次里,GPU 不再因为等一个慢请求而空转。实测下来,同样的卡、同样的模型,vLLM 的并发吞吐普遍比原生 transformers 高 2~4 倍,比 Ollama 也明显更稳。

另一个关键点是它原生兼容 OpenAI API。这意味着你现有的 ChatGPT 客户端、LangChain、以及一堆现成的脚本,把 base_url 一改就能直接对接本地模型,几乎零迁移成本。

二、环境准备:先把显卡和 CUDA 对齐

vLLM 最大的坑在安装阶段,核心就一句:它和 PyTorch、CUDA 版本绑定得很死。我强烈建议用 Docker 跑,把版本地狱直接隔离掉。先确认宿主机显卡驱动版本:

nvidia-smi
# 看顶部 CUDA Version,驱动要 >= 535.xx(对应 CUDA 12.2+)

如果驱动太老,先升级驱动再往下走,否则后面会报一堆莫名其妙的 CUDA 错误。Docker 这边记得装好 NVIDIA Container Toolkit,保证容器里能认到显卡。

三、Docker 一键启动,参数别乱填

官方镜像一条命令就能拉起服务:

docker run --runtime nvidia --gpus all \
  -v ~/.cache/huggingface:/root/.cache/huggingface \
  -p 8000:8000 \
  --ipc=host \
  vllm/vllm-openai:latest \
  --model Qwen/Qwen2.5-7B-Instruct \
  --gpu-memory-utilization 0.85 \
  --max-model-len 8192

几个参数必须说清楚,很多人就是栽在这里:

  • --gpu-memory-utilization:给推理预留的显存比例,默认 0.9 太激进,我建议 0.85,给系统和 KV 缓存波动留点余地,否则容易 OOM。
  • --max-model-len:最大上下文长度,越大显存占用越高,7B 模型在 24G 卡上填 8192 比较稳妥,别一上来就填 32768。
  • --ipc=host:这个容易被忽略,不加上共享内存,多 worker 会直接崩。

四、量化加速:显存不够就上 AWQ/GPTQ

一张 24G 的卡想跑 70B 模型?原版 FP16 想都别想,但 AWQ 量化能救你。AWQ 在精度几乎不损失的前提下把权重压到 4bit,显存占用砍掉一大半:

docker run --runtime nvidia --gpus all \
  -p 8000:8000 --ipc=host \
  vllm/vllm-openai:latest \
  --model Qwen/Qwen2.5-72B-Instruct-AWQ \
  --quantization awq \
  --gpu-memory-utilization 0.85

注意:量化类型必须和模型权重匹配。AWQ 的模型就用 --quantization awq,GPTQ 的模型就用 gptq,模型名字后面带 -AWQ-GPTQ 后缀的基本都有对应版本,去 HuggingFace 上认准再下,别张冠李戴。

五、调用:curl 先试,Python 再上

服务起来后,先用 curl 验证 OpenAI 兼容接口通不通:

curl http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "Qwen/Qwen2.5-7B-Instruct",
    "messages": [{"role": "user", "content": "用一句话介绍 vLLM"}],
    "max_tokens": 128
  }'

返回正常后,直接拿 openai 库对接,几乎零改动:

from openai import OpenAI

client = OpenAI(base_url="http://localhost:8000/v1", api_key="EMPTY")
resp = client.chat.completions.create(
    model="Qwen/Qwen2.5-7B-Instruct",
    messages=[{"role": "user", "content": "你好"}],
)
print(resp.choices[0].message.content)

六、多卡与多节点:往分布式走一步

如果你像我一样有多块卡甚至多台机器,vLLM 也给你留好了路。单机多卡用 张量并行,把模型切到多张卡上:

--tensor-parallel-size 2

跨节点的分布式推理走 Ray 集群,配置要复杂一些,但思路一致:先把各节点的推理服务注册到 Ray,再让 vLLM 用 pipeline 并行调度。这属于进阶玩法,等你的单机吞吐真正跑满再折腾不迟——先榨干单卡,再谈分布式,顺序别反了。

七、避坑清单:这几个错误我替你踩过了

  • CUDA/驱动不匹配:先 nvidia-smi 确认驱动,再选对应镜像 tag,别用 latest 乱拉。
  • OOM:优先降 --gpu-memory-utilization--max-model-len,别急着加卡。
  • 共享内存不足:Docker 一定加 --ipc=host,否则多进程直接崩。
  • 量化不匹配:AWQ/GPTQ 权重必须和 --quantization 参数对上。
  • 模型下载慢:国内先配好 HuggingFace 镜像源,否则第一次拉权重能等哭你。

写在最后

Ollama 负责「玩得爽」,vLLM 负责「扛得住」。如果你只是自己在终端里聊聊天,Ollama 够了;但只要你想把本地模型变成团队共用的 API 服务,或者跑一个能接住几十个并发的生产应用,vLLM 就是那个正确答案。按今天的流程走一遍,从 docker run 到 Python 调用,半小时内你也能把生产级的本地推理服务架起来。

下期想聊什么?ComfyUI 本地出图、还是多节点分布式推理,评论区告诉我。

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注