🏠 首页 › 攻略 › vLLM本地部署实战:让开源模型跑出生产级推理性能

vLLM本地部署实战:让开源模型跑出生产级推理性能

vLLM是业界最快的开源推理引擎,支持PagedAttention、连续批处理等核心技术。本文手把手教你用Docker或Python部署vLLM,本地运行DeepSeek/Qwen/GLM等大模型,速度比Ollama快3倍。

用Ollama跑模型太慢?试试vLLM

上个月我试了在本地跑DeepSeek-R1。

Ollama确实简单,一条命令就跑起来了。但请求延迟太高——生成4000字要等20多秒。

换了vLLM之后,同样配置,延迟直接降到7秒。

vLLM的核心优势是PagedAttention技术。它把显存按页管理,类似操作系统的虚拟内存。传统方案会在KV cache里留很多空闲页,vLLM把空闲页循环利用,显存利用率能提升2-3倍。

今天把部署流程整理出来。全程用Docker,开箱即用。


环境要求

硬件:

  • GPU:至少8GB显存(A10G/V100/T4就行)
  • CPU:8核以上
  • 内存:32GB以上

软件:

  • Docker 20.10+
  • nvidia-container-toolkit(Docker调用N卡必需)

如果只有CPU,也能跑,但速度慢5-10倍,不推荐。


第一步:安装nvidia-container-toolkit

Docker要调用NVIDIA显卡,必须先装这个工具包。

# Ubuntu/Debian
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -fsSL https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
  sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo

sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

验证是否成功:

nvidia-smi
docker run --rm --gpus all nvidia/cuda:12.2.2-base-ubuntu22.04 nvidia-smi

第二条命令如果能正常输出GPU信息,说明容器能调用显卡了。


第二步:用Docker启动vLLM

vLLM官方镜像已经编译好CUDA,不用自己装。

docker run -d \
  --gpus all \
  -p 8000:8000 \
  -v ~/.vllm-cache:/root/.cache/huggingface \
  --name vllm-server \
  vllm/vllm-openai:latest \
  --model deepseek-ai/DeepSeek-R1-Distill-Qwen-7B \
  --host 0.0.0.0 \
  --port 8000

关键参数说明:

参数作用
--gpus all让容器使用所有GPU
-p 8000:8000映射API端口
-v ~/.vllm-cache:/root/.cache/huggingface模型缓存到本地,不用每次下载
--model指定模型名称,vLLM会自动从HuggingFace拉取

模型选择建议:

模型参数量显存需求适用场景
DeepSeek-R1-Distill-Qwen-7B7B16GB推理/代码,性价比最高
Qwen2.5-7B-Instruct7B16GB通用对话
DeepSeek-R1-Distill-Llama-8B8B16GB逻辑推理
Qwen2.5-32B-Instruct32B80GB高质量生成,需要A100

第一次启动需要下载模型,7B模型约14GB,32B模型约60GB。建议挂个代理。


第三步:测试API

服务启动后,vLLM兼容OpenAI API格式。直接用curl测试:

curl http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "deepseek-ai/DeepSeek-R1-Distill-Qwen-7B",
    "messages": [{"role": "user", "content": "用一句话解释什么是区块链"}],
    "max_tokens": 200
  }'

正常返回:

{
  "id": "chatcmpl-xxx",
  "object": "chat.completion",
  "choices": [{
    "message": {
      "role": "assistant",
      "content": "区块链是一种去中心化的分布式账本技术..."
    }
  }]
}

用Python调用更顺手:

from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:8000/v1",
    api_key="not-needed"
)

response = client.chat.completions.create(
    model="deepseek-ai/DeepSeek-R1-Distill-Qwen-7B",
    messages=[{"role": "user", "content": "写一个快速排序的Python实现"}],
    max_tokens=300
)
print(response.choices[0].message.content)

第四步:性能调优

vLLM默认配置已经很稳,但想压榨性能,改这几个参数:

docker run -d \
  --gpus all \
  -p 8000:8000 \
  -v ~/.vllm-cache:/root/.cache/huggingface \
  --name vllm-server \
  vllm/vllm-openai:latest \
  --model deepseek-ai/DeepSeek-R1-Distill-Qwen-7B \
  --host 0.0.0.0 \
  --port 8000 \
  --tensor-parallel-size 1 \
  --max-model-len 8192 \
  --gpu-memory-utilization 0.9 \
  --swap-space 8 \
  --enable-prefix-caching
参数推荐值说明
--tensor-parallel-sizeGPU数量多卡时设为卡数,自动分片
--max-model-len8192最大上下文长度,越大越吃显存
--gpu-memory-utilization0.9占用90%显存给模型,留10%余量
--swap-space8CPU内存作为显存溢出(GB),4-8够用
--enable-prefix-caching开启相同前缀的请求直接复用KV cache

多卡部署只多一个参数:

--tensor-parallel-size 2  # 用2张GPU

vLLM vs Ollama 对比

特性vLLMOllama
推理速度快(PagedAttention)中等
多并发支持(连续批处理)弱
模型格式GGUF + 原生GGUF
API兼容OpenAI格式自定义API
部署难度中等极简
适合场景生产级服务个人实验

如果只是想本地跑着玩,Ollama够用了。如果要给项目提供推理服务,vLLM是更好的选择。


常见问题

Q:启动时报CUDA out of memory怎么办? 降低--gpu-memory-utilization到0.8,或者减小--max-model-len。

Q:怎么切换模型? 直接重启容器,换--model参数就行。vLLM不支持运行时热切换。

Q:显存16GB能跑32B模型吗? 不能。32B模型至少需要80GB显存(FP16)。可以用4位量化版,约20GB。

Q:vLLM支持流式输出吗? 支持。用OpenAI的stream参数:

response = client.chat.completions.create(
    model="deepseek-ai/DeepSeek-R1-Distill-Qwen-7B",
    messages=[{"role": "user", "content": "你好"}],
    stream=True
)
for chunk in response:
    if chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="", flush=True)

vLLM配Ollama最大的区别,就是"快"。同样的DeepSeek-R1-7B模型,vLLM吞吐量是Ollama的2-3倍。如果你的应用场景对延迟敏感——比如实时对话、代码补全、批量推理——vLLM绝对值得试一次。

你现在用的是什么推理方案?Ollama、vLLM,还是直接调API?