用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-7B | 7B | 16GB | 推理/代码,性价比最高 |
| Qwen2.5-7B-Instruct | 7B | 16GB | 通用对话 |
| DeepSeek-R1-Distill-Llama-8B | 8B | 16GB | 逻辑推理 |
| Qwen2.5-32B-Instruct | 32B | 80GB | 高质量生成,需要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-size | GPU数量 | 多卡时设为卡数,自动分片 |
--max-model-len | 8192 | 最大上下文长度,越大越吃显存 |
--gpu-memory-utilization | 0.9 | 占用90%显存给模型,留10%余量 |
--swap-space | 8 | CPU内存作为显存溢出(GB),4-8够用 |
--enable-prefix-caching | 开启 | 相同前缀的请求直接复用KV cache |
多卡部署只多一个参数:
--tensor-parallel-size 2 # 用2张GPU
vLLM vs Ollama 对比
| 特性 | vLLM | Ollama |
|---|---|---|
| 推理速度 | 快(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?