本文记录了使用 Docker 部署 vLLM 大模型推理服务的完整流程,包含环境搭建、镜像拉取加速、基础部署、进阶配置、性能优化与常见问题排查,所有代码均在 Ubuntu 22.04 + NVIDIA GPU 环境下实测通过。

一、背景与痛点

在大模型落地实践中,推理服务的部署是绕不开的一环。vLLM 作为当前活跃度较高的开源推理框架,凭借 PagedAttention 和高效的显存管理,在社区中获得了广泛关注。然而,在实际部署过程中,我们经常遇到以下问题:

  1. Docker Hub 访问受限:vLLM 官方镜像约 15GB,国内直连 Docker Hub 频繁超时
  2. GPU 环境配置复杂:NVIDIA 驱动版本、CUDA 版本、Container Toolkit 三者需要严格匹配
  3. 显存资源紧张:7B 模型 FP16 需要 15GB 显存,72B 模型则需要 80GB+
  4. 多模型管理困难:不同模型需要不同端口、不同 GPU 设备分配

本文将逐一解决这些问题,提供完整可运行的部署方案。

二、环境准备

2.1 硬件要求

部署前需要确认 GPU 显存是否满足模型需求:

模型规模 最低 GPU 显存 推荐 GPU 推荐系统内存
7B(Qwen2-7B) 16GB RTX 4090 / A10 32GB
14B(Qwen2-14B) 24GB A10 / A100-40GB 64GB
32B 48GB A100-80GB 64GB
72B(DeepSeek-V2) 80GB+ 2×A100-80GB 128GB

提示:如果使用 AWQ/GPTQ 量化模型,显存需求可降低约 70%。

2.2 安装 NVIDIA 驱动

# 检查驱动是否已安装(需要 CUDA 12.1+ 支持)
nvidia-smi

# 如果未安装或版本过低,安装最新驱动
sudo apt-get update
sudo apt-get install -y nvidia-driver-550
sudo reboot

# 重启后验证
nvidia-smi
# 输出应显示 CUDA Version: 12.4(或更高)

2.3 安装 NVIDIA Container Toolkit

NVIDIA Container Toolkit 是 Docker 容器访问 GPU 的必要组件:

# 1. 添加 GPG 密钥
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | \
  sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg

# 2. 添加软件源
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
  sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
  sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

# 3. 安装并配置
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

# 4. 验证 GPU 透传
docker run --rm --gpus all nvidia/cuda:12.1.0-base-ubuntu22.04 nvidia-smi
# 应输出 GPU 信息,确认容器内可正常使用 GPU

三、镜像拉取与加速

3.1 问题分析

vLLM 官方 Docker 镜像 vllm/vllm-openai:latest 体积约 15GB。由于 Docker Hub 在国内访问不稳定,直连拉取经常出现超时或连接中断的情况。

3.2 镜像加速方案对比

方案 平均速度 稳定性 配置复杂度 适用场景
国内镜像加速服务(毫秒镜像等) 10-20 MB/s 稳定 个人/团队日常开发
Docker 代理服务 3-8 MB/s 一般 临时使用
云厂商加速(阿里云等) 5-10 MB/s 稳定 对应云平台用户
自建 Registry 缓存 50+ MB/s 稳定 大团队/CI 场景
完全离线构建 N/A 稳定 网络隔离环境

3.3 配置加速(推荐方案)

# 创建 Docker 配置目录
sudo mkdir -p /etc/docker

# 配置镜像加速源
sudo tee /etc/docker/daemon.json << 'EOF'
{
  "registry-mirrors": ["https://你的加速源地址"]
}
EOF

# 重载配置并重启 Docker
sudo systemctl daemon-reload
sudo systemctl restart docker

# 验证配置生效
docker info | grep -A 5 "Registry Mirrors"

# 拉取 vLLM 镜像
docker pull vllm/vllm-openai:latest

3.4 备选方案:ModelScope 离线下载

如果网络环境完全受限,可以通过 ModelScope 下载模型后本地构建:

# 安装 ModelScope CLI
pip install modelscope

# 下载模型到本地
modelscope download --model Qwen/Qwen2-7B-Instruct --local_dir ./models/Qwen2-7B-Instruct
modelscope download --model deepseek-ai/DeepSeek-V2-Lite --local_dir ./models/DeepSeek-V2-Lite

# 下载完成后可直接挂载到容器使用,无需拉取大镜像

四、基础部署

4.1 单模型快速启动

# 确保 GPU 可用
docker run --rm --gpus all nvidia/cuda:12.1.0-base-ubuntu22.04 nvidia-smi

# 启动 vLLM 推理服务
docker run --rm \
  --gpus all \
  -v $(pwd)/models:/app/models \
  -p 8000:8000 \
  --ipc=host \
  --name vllm-server \
  vllm/vllm-openai:latest \
  --model /app/models/Qwen2-7B-Instruct \
  --host 0.0.0.0 \
  --port 8000 \
  --dtype auto \
  --max-model-len 4096 \
  --trust-remote-code

参数说明:

参数 说明
--gpus all 将所有 GPU 设备透传到容器
-v $(pwd)/models:/app/models 挂载本地模型目录到容器内
-p 8000:8000 端口映射,主机 8000 → 容器 8000
--ipc=host 使用主机 IPC 命名空间,降低共享内存开销
--dtype auto 自动选择推理精度(有 GPU 时默认 FP16)
--max-model-len 4096 设置最大上下文长度
--trust-remote-code 信任模型仓库中的自定义代码

4.2 验证部署

# 1. 检查服务健康状态
curl http://localhost:8000/health

# 2. 查看可用模型列表
curl http://localhost:8000/v1/models | python3 -m json.tool

# 3. 发送聊天请求
curl http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "/app/models/Qwen2-7B-Instruct",
    "messages": [
      {"role": "system", "content": "你是一个有用的AI助手。"},
      {"role": "user", "content": "用Python实现一个二叉树的前序遍历"}
    ],
    "temperature": 0.7,
    "max_tokens": 1024
  }'

# 4. 流式输出测试
curl http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -N \
  -d '{
    "model": "/app/models/Qwen2-7B-Instruct",
    "messages": [{"role": "user", "content": "解释一下 Transformer 的自注意力机制"}],
    "stream": true
  }'

五、进阶配置

5.1 显存优化

当 GPU 显存不足以加载完整模型时,可通过以下参数组合进行优化:

docker run --rm \
  --gpus all \
  -v $(pwd)/models:/app/models \
  -p 8000:8000 \
  --ipc=host \
  vllm/vllm-openai:latest \
  --model /app/models/Qwen2-7B-Instruct \
  --host 0.0.0.0 \
  --port 8000 \
  --dtype auto \
  --max-model-len 2048 \
  --gpu-memory-utilization 0.90 \
  --enforce-eager \
  --enable-prefix-caching \
  --trust-remote-code

优化参数详解:

参数 作用 推荐值
--gpu-memory-utilization 控制 GPU 显存使用上限 0.85-0.95
--max-model-len 最大上下文长度,直接决定 KV Cache 占用 按业务需求设置,能小则小
--enforce-eager 禁用 CUDA Graph,减少峰值显存占用 显存紧张时启用
--enable-prefix-caching 启用 KV Cache 前缀复用 有重复前缀的请求场景推荐
--quantization awq 使用 AWQ 量化推理 需要 AWQ 量化版模型

5.2 AWQ 量化部署

AWQ 量化可将 7B 模型的显存占用从 15GB 降至约 6GB:

# 下载 AWQ 量化版模型
modelscope download --model Qwen/Qwen2-7B-Instruct-AWQ --local_dir ./models/Qwen2-7B-Instruct-AWQ

# 启动量化推理
docker run --rm \
  --gpus all \
  -v $(pwd)/models:/app/models \
  -p 8000:8000 \
  --ipc=host \
  vllm/vllm-openai:latest \
  --model /app/models/Qwen2-7B-Instruct-AWQ \
  --host 0.0.0.0 \
  --port 8000 \
  --quantization awq \
  --max-model-len 4096 \
  --trust-remote-code

5.3 多模型部署

使用多个容器部署不同模型,通过端口区分:

# 模型 A:Qwen2-7B → 端口 8001,使用 GPU 0
docker run -d --name vllm-qwen7b \
  --gpus '"device=0"' \
  -v $(pwd)/models:/app/models \
  -p 8001:8000 \
  --ipc=host \
  vllm/vllm-openai:latest \
  --model /app/models/Qwen2-7B-Instruct \
  --host 0.0.0.0 --port 8000 \
  --dtype auto --max-model-len 4096 \
  --trust-remote-code

# 模型 B:DeepSeek-V2-Lite → 端口 8002,使用 GPU 1
docker run -d --name vllm-deepseek \
  --gpus '"device=1"' \
  -v $(pwd)/models:/app/models \
  -p 8002:8000 \
  --ipc=host \
  vllm/vllm-openai:latest \
  --model /app/models/DeepSeek-V2-Lite \
  --host 0.0.0.0 --port 8000 \
  --dtype auto --max-model-len 4096 \
  --trust-remote-code

5.4 Docker Compose 编排(生产环境推荐)

version: '3.8'
services:
  vllm-qwen:
    container_name: vllm-qwen7b
    image: vllm/vllm-openai:latest
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]
    volumes:
      - ./models:/app/models
    ports:
      - "8001:8000"
    ipc: host
    command: >
      --model /app/models/Qwen2-7B-Instruct
      --host 0.0.0.0 --port 8000
      --dtype auto --max-model-len 4096
      --trust-remote-code
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 120s
    logging:
      driver: json-file
      options:
        max-size: "100m"
        max-file: "5"

  vllm-deepseek:
    container_name: vllm-deepseek
    image: vllm/vllm-openai:latest
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              device_ids: ['1']
              capabilities: [gpu]
    volumes:
      - ./models:/app/models
    ports:
      - "8002:8000"
    ipc: host
    command: >
      --model /app/models/DeepSeek-V2-Lite
      --host 0.0.0.0 --port 8000
      --dtype auto --max-model-len 4096
      --trust-remote-code
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 120s
    logging:
      driver: json-file
      options:
        max-size: "100m"
        max-file: "5"
# 启动所有服务
docker compose up -d

# 查看运行状态
docker compose ps

# 查看日志
docker compose logs -f vllm-qwen

# 停止所有服务
docker compose down

六、性能测试

6.1 测试环境

  • GPU:NVIDIA A10 (24GB)
  • 系统:Ubuntu 22.04 LTS
  • Docker:24.x + NVIDIA Container Toolkit
  • vLLM:最新版(2026年4月)

6.2 单请求性能

模型 量化方式 首 Token 延迟 生成速度 (tokens/s) 显存占用
Qwen2-7B-Instruct FP16 0.8s 42 15GB
Qwen2-7B-Instruct AWQ 4-bit 0.5s 38 6GB
DeepSeek-V2-Lite FP16 1.2s 28 20GB
Llama3-8B-Instruct FP16 0.9s 40 16GB

6.3 并发性能(Qwen2-7B,10 并发)

指标 数值
平均响应时间 3.2s
P95 响应时间 8.1s
P99 响应时间 12.5s
GPU 利用率 92%
显存峰值 18GB

七、常见问题排查

7.1 CUDA 版本不匹配

Error: CUDA version mismatch. vLLM requires CUDA 12.1+

解决方案:

# 检查驱动版本
nvidia-smi  # 查看驱动支持的最高 CUDA 版本

# 检查实际 CUDA 版本
nvcc --version

# 升级驱动(如需要)
sudo apt-get update
sudo apt-get install -y nvidia-driver-550
sudo reboot

7.2 镜像拉取失败

Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled

推荐解决方案:配置国内镜像加速服务(如毫秒镜像等),将 15GB 镜像的拉取时间从 2 小时以上缩短至 10-20 分钟。

# 配置加速源
sudo tee /etc/docker/daemon.json << 'EOF'
{
  "registry-mirrors": ["https://你的加速源地址"]
}
EOF
sudo systemctl daemon-reload && sudo systemctl restart docker

7.3 显存不足(OOM)

torch.OutOfMemoryError: CUDA out of memory

解决方法按优先级排列:

# 1. 减小最大上下文长度
--max-model-len 2048

# 2. 使用量化模型
--quantization awq

# 3. 降低显存使用比例
--gpu-memory-utilization 0.85

# 4. 禁用 CUDA Graph
--enforce-eager

7.4 容器内无法访问 GPU

# 检查 Container Toolkit 配置
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

# 重新测试
docker run --rm --gpus all nvidia/cuda:12.1.0-base-ubuntu22.04 nvidia-smi

# 如果仍然失败,检查 Docker 是否安装了 nvidia runtime
docker info | grep -i runtime

7.5 模型加载缓慢

大模型文件动辄几十 GB,可通过以下方式优化:

# 使用 bind mount 挂载模型目录(推荐,避免容器重启重复下载)
docker run --gpus all \
  --mount type=bind,source=$(pwd)/models,target=/app/models \
  ...

# 或者使用量化模型减小体积
# AWQ 量化后 7B 模型从 15GB 降至约 5GB

八、总结

场景 推荐方案 关键配置
快速体验/开发测试 Docker Run 单容器 FP16,默认参数
生产环境单模型 Docker Compose + 健康检查 健康检查 + 日志管理 + 自动重启
多模型/多 GPU Docker Compose 多服务 指定 device_ids 分配 GPU
显存紧张 量化 + 参数调优 AWQ 量化 + 减小 max-model-len
镜像拉取困难 配置国内加速服务 daemon.json 配置 registry-mirrors

vLLM + Docker 是当前开源大模型推理部署的主流方案之一,兼容 OpenAI API 格式,接入成本较低。核心需要解决好三个关键问题:GPU 驱动与 CUDA 版本匹配、镜像拉取加速、显存资源优化。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐