踩坑实录:多卡跑大模型Qwen-VL,为何vLLM模型加载卡死而llama.cpp奇迹跑通还更快?
前言:部署经历
针对 Qwen2.5-32B-VL-Instruct 满血版模型的部署实战。
手头的环境是一台配备了 4张 NVIDIA A30(24GB显存) 的服务器。按理说,96GB的总显存足以吞下 FP16 精度的 32B 模型(约65GB权重)。然而,在使用业界标杆 vLLM 进行部署时,系统却陷入了诡异的'死锁'——显存占满,但推理毫无反应,最终超时报错。
尝试切换到 Ollama(底层基于 llama.cpp),奇迹发生了:不仅部署成功,而且运行流畅。这引发了我深深的思考:同样的硬件,同样模型,为何两个主流框架的表现天差地别?
本文将围绕PCIe通信瓶颈、Tensor Parallelism(张量并行) 与 Pipeline Parallelism(流水线并行) 的进行分析。
第一部分:硬件环境
1.1 NVIDIA A30
在NVIDIA的产品谱系中,A30 是一款基于 Ampere 架构的中端推理卡,拥有 24GB HBM2 显存,带宽 933 GB/s。属性如下:
- NVLink 的缺失:虽然 A30 规格书支持 NVLink,但在很多通用服务器或云实例中,并没有物理配置 NVLink Bridge,就比如我的服务器上。
- PCIe 的独木桥:当卡与卡之间没有 NVLink 这种'高速私家路'时,所有通信都必须走 PCIe 总线。
实际环境补充:本文服务器显卡连4卡PCIe都没联通,最多只有两卡。采用VLLM时,如果两卡部署也必须选择SYS链接的形式。下面是卡联通情况:
nvidia-smi topo -m

| 缩写 | 含义 | 典型场景 |
|---|---|---|
| X | 自身(Self) | GPU 内部环路 |
| PXB | PCIe x16 桥接(Direct PCIe Bridge) | 同一 PCIe 树下的 GPU 直接互联 |
| SYS | 系统总线(System Bus) | 通过 CPU/主板 南桥间接连接 |
| PIX | PCIe 交换机(PCIe Switch) | 多 GPU 通过 PCIe 交换机互联 |
1.2 故障复现:vLLM 加载模型'卡死'
在使用 vLLM 尝试拉起 4卡推理时,部署脚本如下:
#!/bin/bashecho"###########start vl by vllm...##########"exportGLOO_SOCKET_IFNAME="enp210s0f0"# 多网卡需要指明exportCUDA_VISIBLE_DEVICES="1,2,3,4"exportVLLM_LOGGING_LEVEL="DEBUG"exportVLLM_ATTENTION_BACKEND="FLASH_ATTN" vllm serve /model/Qwen3-VL-B-Instruct \ \ auto \ . \ \ \ fp8 \ \ mage=,=\ yourkey \


