先确认为什么需要两张卡
Qwen3-32B约320亿参数。BF16权重仅按参数乘2字节就接近64GB,还未包含量化元数据、CUDA上下文、临时工作区和KV Cache,因此单张24GB或48GB卡无法直接承载完整BF16服务。双48GB卡可用张量并行保留较高精度;双24GB卡通常还需使用经过验证的AWQ/GPTQ等量化权重。
硬件与拓扑检查
nvidia-smi -L
nvidia-smi topo -m
nvidia-smi --query-gpu=index,name,memory.total,pci.bus_id,power.limit --format=csv两卡应尽量同型号、同显存并处于较近PCIe/NVLink路径。跨CPU插槽的SYS路径会提高集合通信开销。供电和散热也要按双卡持续满载验证,不能只确认系统点亮。
下载与版本固定
python3 -m venv /opt/venvs/qwen32
source /opt/venvs/qwen32/bin/activate
pip install -U huggingface_hub vllm
mkdir -p /data/models/qwen3-32b
huggingface-cli download Qwen/Qwen3-32B \
--local-dir /data/models/qwen3-32b保存仓库提交版本、文件清单与磁盘占用。下载完成前不要让服务读取同一目录,避免把半成品当成有效模型。
双卡启动基线
CUDA_VISIBLE_DEVICES=0,1 vllm serve /data/models/qwen3-32b \
--served-model-name qwen3-32b \
--tensor-parallel-size 2 \
--max-model-len 8192 \
--gpu-memory-utilization 0.85 \
--host 127.0.0.1 --port 8000先用8192上下文和保守显存比例建立基线。`tensor-parallel-size=2`把矩阵计算和部分权重切分到两张卡,每一步生成都需要通信。它解决容量并可能增加吞吐,但不会让单请求速度自然翻倍。
模型与接口验收
curl -sS http://127.0.0.1:8000/v1/models | python -m json.tool
curl -sS http://127.0.0.1:8000/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{"model":"qwen3-32b","messages":[{"role":"user","content":"给出双GPU推理的三个通信风险。"}],"temperature":0.2,"max_tokens":256}' \
| python -m json.tool用固定中文、代码、数学和工具调用题集保存结果,后续量化或升级都与该基线比较。检查两卡显存占用是否接近,若严重不均衡,应核对可见设备、并行参数和模型架构支持。
从单请求扩展到容量测试
准备2K/8K输入与256/1024输出的组合,以1、2、4、8并发阶梯运行。记录首Token、逐Token、P95、聚合吞吐、显存和GPU功率。长输入主要考验prefill与缓存,长输出更暴露decode和跨卡同步成本。
将`max-model-len`提高到32K前先计算KV Cache,并保留显存余量。能把一个32K请求跑完,不代表可以支撑多个长请求。
双24GB卡怎么办
不要让框架自动把BF16层大量卸载到CPU后仍宣称“双GPU高性能”。更实际的路线是选择来源明确、与vLLM兼容的量化检查点,记录量化算法和基线质量;或改用较小模型。第三方量化文件必须核对许可证、作者、哈希和模型配置。
高频故障
- 两卡只用一张:检查`CUDA_VISIBLE_DEVICES`与进程启动日志。
- NCCL初始化卡住:先用nccl-tests验证两卡通信与共享内存。
- 显存足够仍OOM:降低上下文和比例,检查工作区及其他进程。
- 多卡速度低:比较单卡小模型基线,检查拓扑、请求规模和通信占比。
- 输出异常:锁定Tokenizer、聊天模板、模型提交与vLLM版本。
上线时在反向代理后提供认证和限流,并保存完整启动命令。模型升级应在新端口并行验证,不能覆盖唯一可运行版本。




