概述
想在自己的GPU服务器上跑大模型推理?vLLM是目前开源社区最主流的选择之一。它用PagedAttention技术做显存管理,吞吐量大、延迟低,而且兼容OpenAI API格式,你的Python代码改个base_url就能直接调用。
这篇教程带你从0搭建vLLM推理服务,包括Docker镜像拉取、模型下载、API启动和调用测试。全程命令可直接复制运行。
准备工作
- 一台带GPU的服务器(NVIDIA GPU,至少8GB显存)
- 已安装Docker和NVIDIA Container Toolkit
- 能访问Hugging Face(或已配置镜像源)
- 磁盘剩余空间20GB以上(模型文件较大)
如果还没有GPU服务器,推荐用RunPod、Vast.ai或AutoDL按小时租用,价格一般在1-3元/小时。
步骤
第一步:确认GPU和驱动正常
nvidia-smi
看到GPU型号、显存用量和驱动版本就说明环境就绪。如果没有输出,先安装NVIDIA驱动和NVIDIA Container Toolkit:
# Ubuntu/Debian
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/rpms/nvidia-container-toolkit.repo | sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo
sudo apt-get install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
第二步:拉取vLLM Docker镜像
docker pull vllm/vllm-openai:latest
国内网络慢的话可以用镜像加速:
docker pull registry.cn-hangzhou.aliyuncs.com/dockerlan/vllm-openai:latest
拉取完成大概需要几分钟,视网速而定。
第三步:下载模型
vLLM支持Hugging Face格式的模型。常用开源模型推荐:
- Qwen2.5-7B-Instruct:中文能力强,7B参数适合消费级显卡
- DeepSeek-R1-Distill-Qwen-7B:推理能力强
- Llama-3.1-8B-Instruct:英文场景首选
下载模型到本地目录(方便复用,不用每次都从网络拉):
mkdir -p ~/models
cd ~/models
# 用huggingface-cli下载,速度快且支持断点续传
pip install -q huggingface_hub
huggingface-cli download Qwen/Qwen2.5-7B-Instruct --local-dir ./qwen2.5-7b-instruct
下载7B模型大约3-4GB,耐心等待。
第四步:启动vLLM服务
docker run -d \
--gpus all \
-p 8000:8000 \
-v ~/models:/root/models \
--name vllm-server \
vllm/vllm-openai:latest \
serve /root/models/qwen2.5-7b-instruct \
--host 0.0.0.0 \
--port 8000 \
--trust_remote_code
参数说明:
--gpus all:挂载所有GPU-p 8000:8000:映射API端口-v ~/models:/root/models:挂载模型目录--trust_remote_code:加载模型时信任远程代码(部分模型需要)
启动后等几十秒,vLLM会加载模型到显存。可以用这个命令查看日志:
docker logs -f vllm-server
看到"Application startup complete"就说明服务就绪了。
第五步:测试API调用
另开一个终端,用curl测试:
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "/root/models/qwen2.5-7b-instruct",
"messages": [
{"role": "user", "content": "你好,介绍一下你自己"}
],
"temperature": 0.7
}'
返回JSON里包含choices[0].message.content就是模型的回复。
Python调用方式:
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8000/v1",
api_key="not-needed"
)
response = client.chat.completions.create(
model="/root/models/qwen2.5-7b-instruct",
messages=[{"role": "user", "content": "什么是vLLM?"}],
temperature=0.7
)
print(response.choices[0].message.content)
验证
确认服务正常运行的几个检查点:
- 容器状态:
docker ps | grep vllm,状态应该是Up - GPU占用:
nvidia-smi,应该能看到vllm进程占用显存 - API响应:curl命令返回正确的JSON格式
- 并发测试:同时发多个请求,vLLM会利用PagedAttention高效调度
如果想看更详细的性能指标,vLLM自带了一个Web UI:
curl http://localhost:8000/metrics
能看到请求数、延迟、吞吐等数据。
常见问题
Q: 显存不足怎么办?
7B模型在8GB显存上可能跑不起来。两个方案:
- 换更小参数模型,比如Qwen2.5-3B-Instruct
- 开启量化:在启动命令中加
--dtype half或使用AWQ量化模型
Q: 模型加载很慢?
首次加载需要从磁盘读模型到显存,7B模型大概需要1-2分钟。后续请求会有缓存,会快很多。确保模型文件在本地(不要放网络存储),I/O速度影响很大。
Q: 如何支持多模型?
启动服务时不指定模型路径,用--served-model-name自定义别名:
vllm serve /root/models/qwen2.5-7b-instruct --served-model-name qwen2.5
客户端调用时把model字段改成qwen2.5即可。
Q: 想开放给外网访问怎么弄?
用nginx反向代理加basic auth,或者结合前面讲过的Cloudflare Tunnel。注意推理服务对带宽和延迟敏感,建议限制访问来源IP。
Q: 想开机自启容器?
docker update --restart=always vllm-server
或者用systemd管理,把docker run命令封装成service。
vLLM的PagedAttention技术让显存利用率比普通方案高不少,同样的GPU能同时服务更多并发请求。下次想测不同模型的性能表现,可以换模型路径重新启动容器试试。你打算用vLLM跑哪个模型?