主题
V100×8(32G)+ vLLM 部署 Qwen3.5-27B 实战记录
场景:本地 8 卡 V100 32G 服务器,内网环境(镜像走 Harbor 私有仓库), 以 Docker 单容器方式运行 vLLM,对外提供 OpenAI 兼容 API。
⚠️ V100 是 Volta 架构(sm_70),与新款 GPU 有多处关键差异,第 4 节为必读的适配要点。
1. 环境信息
| 项目 | 规格 |
|---|---|
| GPU | NVIDIA 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.62.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-smi2.3 目录规划
bash
# 模型目录(提前下载/拷贝好模型权重)
/u02/models/Qwen3.5-27B
# vLLM 缓存目录(编译缓存、torch inductor 缓存,加速二次启动)
mkdir -p /u02/models/data/vllm-cache3. 启动服务
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-size | 8 | 8 卡张量并行,权重切分到全部 V100 |
--gpu-memory-utilization | 0.80 | 每卡显存使用上限 80%(约 25.6G/卡),预留余量防 OOM |
--max-model-len | 8192 | 最大上下文长度,V100 显存有限不宜贪大 |
--dtype | half | V100 不支持 bf16,必须显式指定 fp16(见 §4) |
--reasoning-parser | qwen3 | 启用思维链(thinking)输出解析 |
--enable-prefix-caching | — | 前缀缓存,多轮对话/长 prompt 显著提速 |
--enable-auto-tool-choice + --tool-call-parser | qwen3_coder | 启用工具调用(Function Calling) |
--trust-remote-code | — | Qwen 自定义模型代码必需 |
-e VLLM_USE_V1=0 | — | 强制使用 V0 引擎(V100 兼容性考虑,见 §4) |
-e VLLM_USE_MODELSCOPE=false | — | 使用本地模型,不走 ModelScope 下载 |
--shm-size 128g + --ipc=host | — | 8 卡张量并行的进程间共享内存通信必需 |
4. V100(Volta/sm_70)适配要点 —— 重点
| 事项 | 说明 |
|---|---|
必须用 --dtype half | V100 不支持 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/health8. 常见问题速查
| 现象 | 排查与处理 |
|---|---|
启动报 dtype bfloat16 is not supported | V100 不支持 bf16,确认 --dtype half 已加 |
| 启动 OOM / KV Cache 不足 | 降低 --gpu-memory-utilization 到 0.75,或减小 --max-model-len |
| 多卡通信卡死/NCCL 报错 | 确认 --ipc=host 与足够大的 --shm-size;nvidia-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,编译缓存可复用 |