为什么你需要用 Docker 部署 vLLM?
如果你接触过大模型推理,一定对 vLLM 这个名字不陌生。它凭借 PagedAttention 技术,把显存利用率拉满,推理速度直接起飞。但很多朋友在部署时却卡在了环境配置上——Python 版本冲突、CUDA 驱动不匹配、依赖包疯狂报错……这时候,Docker 就是那个能让你“一键解决环境焦虑”的神器。
用 Docker 部署 vLLM,意味着你不再需要在自己系统上折腾 CUDA、PyTorch 和各种底层库。拉一个镜像,跑一个容器,模型就能稳定服务。无论你是想在本地玩玩,还是部署到云服务器生产环境,这套流程都通用。今天,我们就从零开始,把 vLLM 用 Docker 跑起来,并让它对外提供 API 服务。
准备工作:你需要什么?
硬件要求
vLLM 对 GPU 有硬性依赖。你需要至少一张 NVIDIA 显卡(计算能力 7.0 以上,比如 V100、T4、A100、RTX 3090/4090 等)。显存大小取决于模型:7B 模型推荐 16GB 以上,13B 模型推荐 24GB 以上。
软件要求
- Docker:已安装并正常运行。不会装?去 Docker 官网下载对应系统的安装包即可。
- NVIDIA Container Toolkit:这是让 Docker 容器能调用 GPU 的关键。安装命令如下:
# 添加 NVIDIA 官方源
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
# 安装 nvidia-container-toolkit
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
# 重启 Docker 服务
sudo systemctl restart docker
安装完成后,用 docker run --rm --gpus all nvidia/cuda:12.0-base nvidia-smi 测试一下,能看到 GPU 信息就代表成功了。
第一步:拉取 vLLM 官方镜像
vLLM 官方在 Docker Hub 上提供了优化好的镜像,我们直接拉取最新版:
docker pull vllm/vllm-openai:latest
这个镜像基于 CUDA 12.1,内置了 vLLM 和 OpenAI 兼容的 API 服务端。如果你需要特定版本,可以去 vLLM 的 Docker Hub 页面 查看 tag。
第二步:运行容器并加载模型
假设我们要部署一个 Qwen2.5-7B-Instruct 模型(阿里开源的优秀中文模型)。执行以下命令:
docker run --gpus all \
-p 8000:8000 \
-v /path/to/models:/models \
vllm/vllm-openai:latest \
--model /models/Qwen2.5-7B-Instruct \
--dtype auto \
--max-model-len 4096 \
--gpu-memory-utilization 0.9
逐行解释一下参数含义:
--gpus all:让容器使用所有 GPU。如果你有多个卡,可以指定--gpus '"device=0"'只使用第一张。-p 8000:8000:将容器的 8000 端口映射到宿主机,这样外部就能通过http://localhost:8000访问 API。-v /path/to/models:/models:将宿主机上的模型目录挂载到容器内。请把/path/to/models替换成你实际存放模型的位置。--model /models/Qwen2.5-7B-Instruct:指定模型路径。推荐提前下载好模型文件,避免运行时从 Hugging Face 拉取(那速度懂的都懂)。--dtype auto:自动选择最佳数据类型,一般会选 bfloat16 或 float16。--max-model-len 4096:限制最大上下文长度,防止显存爆炸。--gpu-memory-utilization 0.9:限制 GPU 显存使用率,留一些给其他进程。
如果模型还没下载,也可以让 vLLM 自动从 Hugging Face 拉取(前提是网络通畅):
docker run --gpus all \
-p 8000:8000 \
vllm/vllm-openai:latest \
--model Qwen/Qwen2.5-7B-Instruct \
--dtype auto
看到类似 INFO: Started server process [1] 的日志,就说明服务启动成功了。
第三步:调用 API 测试效果
服务跑起来后,用 curl 或者 Postman 测试一下。vLLM 提供的是 OpenAI 兼容接口,所以请求格式和 ChatGPT API 很像:
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen/Qwen2.5-7B-Instruct",
"messages": [{"role": "user", "content": "用 Docker 部署大模型有什么好处?"}],
"max_tokens": 256,
"temperature": 0.7
}'
返回结果中会包含 choices[0].message.content 字段,里面就是模型生成的回答。如果返回了类似 {"error":"..."},检查一下模型名称是否写对,或者显存是否足够。
进阶技巧:如何优化性能与稳定性
1. 使用共享内存加速
vLLM 在推理时大量使用共享内存来交换数据。默认容器共享内存只有 64MB,很容易成为瓶颈。建议在 docker run 时加上 --shm-size 8g:
docker run --gpus all --shm-size 8g -p 8000:8000 ...
2. 多 GPU 分布式推理
如果单卡显存放不下模型(比如 70B 模型),可以用张量并行(Tensor Parallelism)拆分到多张卡上:
docker run --gpus all \
-p 8000:8000 \
vllm/vllm-openai:latest \
--model meta-llama/Llama-2-70b-chat-hf \
--tensor-parallel-size 4
--tensor-parallel-size 设置为 GPU 数量,vLLM 会自动在卡间分配计算。
3. 持久化日志与监控
生产环境中建议把容器日志持久化到宿主机,方便排查问题:
docker run --gpus all -d \
--name vllm-server \
--restart unless-stopped \
--log-opt max-size=10m --log-opt max-file=3 \
-p 8000:8000 \
vllm/vllm-openai:latest \
--model /models/Qwen2.5-7B-Instruct
用 -d 后台运行,加上 --restart unless-stopped 实现自动重启。
常见问题与解决方法
| 问题 | 原因 | 解决 |
|---|---|---|
容器启动报错 CUDA error: out of memory |
显存不足 | 降低 --gpu-memory-utilization 值,或换更小模型 |
API 返回 Model not found |
模型路径或名称错误 | 检查 --model 参数是否匹配实际文件 |
| 推理速度极慢 | 未使用共享内存或 CUDA 版本不匹配 | 添加 --shm-size 8g,并确认镜像 CUDA 版本 |
| Docker 无法识别 GPU | 未安装 nvidia-container-toolkit | 按上文步骤安装并重启 Docker |
部署到生产环境的建议
如果你打算把这个服务部署到公网供别人调用,有几点必须注意:
- 使用反向代理:不要直接把 8000 端口暴露出去。用 Nginx 或 Caddy 做一层反向代理,加上 HTTPS 和访问控制。
- 选择靠谱的云服务器:GPU 云服务器建议选带 NVIDIA 认证的实例,比如腾讯云 GN10Xp、阿里云 ecs.gn7i 等。我们推荐使用 腾讯云轻量应用服务器 或 阿里云 ECS,稳定性有保障,售后响应快。购买时记得选择“GPU 计算型”实例,并预装 Docker 环境。
- 域名与备案:如果服务面向国内用户,域名需要备案。建议在腾讯云或阿里云直接购买域名,一条龙搞定。
总结
用 Docker 部署 vLLM 并不复杂,核心就三步:拉镜像、跑容器、调接口。一旦掌握了这个流程,你就能快速在任意机器上复现大模型推理环境,不再被“环境地狱”折磨。如果过程中遇到问题,欢迎在评论区留言交流。觉得有用的话,不妨收藏本文,下次部署时直接翻出来照着做。