Skip to content

V100×8(32G)+ vLLM 部署 Qwen3.5-27B 实战记录

场景:本地 8 卡 V100 32G 服务器,内网环境(镜像走 Harbor 私有仓库), 以 Docker 单容器方式运行 vLLM,对外提供 OpenAI 兼容 API。

⚠️ V100 是 Volta 架构(sm_70),与新款 GPU 有多处关键差异,第 4 节为必读的适配要点


1. 环境信息

项目规格
GPUNVIDIA V100 32G × 8 卡(共 256G 显存)
CPU / 内存80 核 / 380G
操作系统Ubuntu 24.04
NVIDIA 驱动560.28.03(CUDA 12.6)
推理引擎vLLM v0.19.1(vllm/vllm-openai,内网 Harbor 分发)
模型Qwen3.5-27B(本地路径 /u02/models/Qwen3.5-27B
服务端口30006 → 容器 8000

2. 部署前准备

2.1 检查驱动与 GPU

bash
nvidia-smi
# 期望:8 张 V100 全部可见,Driver Version: 560.28.03  CUDA Version: 12.6

2.2 Docker + NVIDIA Container Toolkit

bash
# 需已安装 docker 与 nvidia-container-toolkit,验证:
docker run --rm --runtime=nvidia --gpus all 192.168.122.156:30000/vllm/vllm-openai:v0.19.1 nvidia-smi

2.3 目录规划

bash
# 模型目录(提前下载/拷贝好模型权重)
/u02/models/Qwen3.5-27B

# vLLM 缓存目录(编译缓存、torch inductor 缓存,加速二次启动)
mkdir -p /u02/models/data/vllm-cache

3. 启动服务

bash
docker run -d \
  --name vllm-qwen35-27b \
  --runtime=nvidia \
  --privileged \
  --ipc=host \
  --shm-size 128g \
  -p 30006:8000 \
  -v /u02/models/Qwen3.5-27B:/data/models/Qwen3.5-27B \
  -v /u02/models/data/vllm-cache:/root/.cache/vllm \
  -e VLLM_USE_MODELSCOPE=false \
  -e VLLM_USE_V1=0 \
  192.168.122.156:30000/vllm/vllm-openai:v0.19.1 \
  --model /data/models/Qwen3.5-27B \
  --served-model-name qwen3.5-27b \
  --tensor-parallel-size 8 \
  --gpu-memory-utilization 0.80 \
  --max-model-len 8192 \
  --dtype half \
  --trust-remote-code \
  --reasoning-parser qwen3 \
  --enable-prefix-caching \
  --enable-auto-tool-choice \
  --tool-call-parser qwen3_coder

参数详解

参数取值说明
--tensor-parallel-size88 卡张量并行,权重切分到全部 V100
--gpu-memory-utilization0.80每卡显存使用上限 80%(约 25.6G/卡),预留余量防 OOM
--max-model-len8192最大上下文长度,V100 显存有限不宜贪大
--dtypehalfV100 不支持 bf16,必须显式指定 fp16(见 §4)
--reasoning-parserqwen3启用思维链(thinking)输出解析
--enable-prefix-caching前缀缓存,多轮对话/长 prompt 显著提速
--enable-auto-tool-choice + --tool-call-parserqwen3_coder启用工具调用(Function Calling)
--trust-remote-codeQwen 自定义模型代码必需
-e VLLM_USE_V1=0强制使用 V0 引擎(V100 兼容性考虑,见 §4)
-e VLLM_USE_MODELSCOPE=false使用本地模型,不走 ModelScope 下载
--shm-size 128g + --ipc=host8 卡张量并行的进程间共享内存通信必需

4. V100(Volta/sm_70)适配要点 —— 重点

事项说明
必须用 --dtype halfV100 不支持 bfloat16(bf16 需 sm_80+)。Qwen 官方默认 bf16,不显式指定 half 会直接报错或数值溢出
不能用 FP8 量化FP8 需 Hopper(sm_90)/ Ada(sm_89),V100 无法使用;要省显存只能用 AWQ(INT4)版本模型
V1 引擎兼容性问题vLLM V1 引擎对老架构支持不完整,VLLM_USE_V1=0 回退 V0 引擎更稳
Attention 后端FlashAttention-2 要求 sm_80+,V100 上 vLLM 自动回退 xFormers/SDPA 后端,吞吐略低属正常现象
不要强行开大上下文V100 单卡仅 32G,KV Cache 吃紧时优先保吞吐,max-model-len 8192 是稳妥值

5. 服务验证

bash
# 1) 容器日志(等待 "Application startup complete")
docker logs -f vllm-qwen35-27b

# 2) 模型列表
curl http://localhost:30006/v1/models

# 3) 对话测试
curl http://localhost:30006/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "qwen3.5-27b",
    "messages": [{"role": "user", "content": "用一句话介绍 Kubernetes"}]
  }'

显存占用确认:

bash
nvidia-smi
# 期望:8 卡每卡占用约 25G(0.80 × 32G),vLLM 进程分布在全部 8 卡

6. 显存与容量估算

项目估算说明
模型权重27B × 2B(fp16)≈ 54G,TP=8 切分后约 6.8G/卡权重显存很小,大头在 KV Cache
单卡可用32G × 0.80 ≈ 25.6G其余留给 CUDA context/碎片
KV Cache每卡约 18G+,8 卡合计 140G+支撑 8192 上下文的多并发请求非常宽裕
升级空间换 AWQ INT4 模型权重可降至 ~14G可腾出更多 KV Cache 提升并发

7. 日常运维

bash
# 查看状态与日志
docker ps | grep vllm
docker logs -f --tail 100 vllm-qwen35-27b

# 重启 / 停止
docker restart vllm-qwen35-27b
docker stop vllm-qwen35-27b

# 修改启动参数:删容器后重新 docker run(镜像与模型均在,秒级重建)
docker rm -f vllm-qwen35-27b

# 容器健康(API 探活,可接入监控)
curl -sf http://localhost:30006/health

8. 常见问题速查

现象排查与处理
启动报 dtype bfloat16 is not supportedV100 不支持 bf16,确认 --dtype half 已加
启动 OOM / KV Cache 不足降低 --gpu-memory-utilization 到 0.75,或减小 --max-model-len
多卡通信卡死/NCCL 报错确认 --ipc=host 与足够大的 --shm-sizenvidia-smi topo -m 查看卡间互联
吞吐明显低于预期V100 无 FlashAttention-2,属硬件上限;确认 --enable-prefix-caching 已开,适当调大 max-num-seqs
工具调用不生效确认 --enable-auto-tool-choice --tool-call-parser qwen3_coder 成对出现,且请求中传了 tools
二次启动慢确认缓存目录挂载 -v ...:/root/.cache/vllm,编译缓存可复用