[Bug]: vLLM hangs after NCCL init with TP=2 on Blackwell GPUs (CUDA 13.0, NCCL 2.27.7)

该报错是 vLLM 在使用张量并行(TP=2)初始化 NCCL 后卡死,常见于 Blackwell 架构 GPU(如 RTX PRO 6000、RTX 5090、B300)且未启用 NVLink、依赖 PCIe 通信的场景。优先排查 BIOS 中的 IOMMU / ACS 是否开启,并尝试禁用 P2

快速结论:该报错是 vLLM 在使用张量并行(TP=2)初始化 NCCL 后卡死,常见于 Blackwell 架构 GPU(如 RTX PRO 6000、RTX 5090、B300)且未启用 NVLink、依赖 PCIe 通信的场景。优先排查 BIOS 中的 IOMMU / ACS 是否开启,并尝试禁用 P2P 或自定义 AllReduce。

适用环境:vLLM(TP=2 或 data-parallel-size=2);操作系统 Fedora Linux 43(x86_64);Python 3.12.12;PyTorch 2.9.1+cu130;CUDA 13.0;NCCL 2.27.7;NVIDIA 驱动 580.119.02;GPU 为 NVIDIA RTX PRO 6000 Blackwell Workstation Edition 或 RTX 5090、B300(Issue 中出现过的 Blackwell 无 NVLink 多卡配置)。

最快修复方案:暂无确认的一步修复方案。根据 Issue 讨论与用户验证,以下方法可优先尝试:① 在 BIOS 中禁用 ACS 与 IOMMU(AMD 平台可尝试在 GRUB 添加 amd_iommu=off),或 ② 设置环境变量 NCCL_P2P_DISABLE=1 并添加 vLLM 启动参数 --disable-custom-all-reduce。注意这些方案会影响多卡通信性能。

注意事项:禁用 IOMMU / ACS 存在系统安全与稳定性风险,请在确认无其他依赖后操作;该方案可能并不适用于所有主板/GPU 组合。使用 NCCL_P2P_DISABLE=1--disable-custom-all-reduce 会绕过 GPU 直接 P2P 通信,降低多卡协同效率,且已有用户报告“单流解码性能下降”。此外,--disable-custom-all-reduce 仅解决 hang 问题,不会减少 KVCache 在每张卡上的复制内存占用,需要调整 gpu_memory_utilization 或正确理解 TP 并行下 KVCache 分配方式。

问题场景

用户在双路 Blackwell GPU(如 2× RTX PRO 6000 Blackwell,PCIe 连接无 NVLink)上使用 vLLM 设置 tensor-parallel-size=2(TP=2)加载模型时,程序在 NCCL 初始化阶段之后卡死,无法继续启动服务或执行推理。后续 Issue 讨论中也有人在使用 data-parallel-size=2(2× RTX 5090)以及 4×B300 时遇到同样的 NCCL hang 问题。

报错原文

[Bug]: vLLM hangs after NCCL init with TP=2 on Blackwell GPUs (CUDA 13.0, NCCL 2.27.7)

原因分析

从三个不同方向的用户反馈来看,最可能的原因如下:

  • BIOS/平台级 PCIe 特性干扰:有用户禁用 IOMMU、ACS/Virtualization 选项后问题解决,说明平台级 PCIe 的 IOMMU 地址翻译或 ACS 隔离策略可能导致 NCCL 初始化完成后 peer-to-peer(P2P)通信挂起。
  • NCCL P2P / vLLM 自定义 AllReduce 兼容性:不使用 NVLink 的 Blackwell 双卡通过 PCIe 通信时,vLLM 默认使用的自定义 AllReduce 可能与当前 NCCL 2.27.7 及 CUDA 13.0 组合不兼容,导致 hang。设置 NCCL_P2P_DISABLE=1 配合 --disable-custom-all-reduce 可稳定通过。
  • 可能是 NCCL 上游问题:提交者已将问题转给 NVIDIA/nccl #1999,因此在特定驱动、NCCL 与 Blackwell GPU 组合下,NCCL 自身 P2P/初始化流程也可能存在缺陷。

环境排查

  • 确认 vLLM 启动命令中是否设置 --tensor-parallel-size 2--data-parallel-size 2
  • 确认两张 GPU 是否通过 NVLink 互联;如果是 PCIe-only,需要重点排查 P2P 通信是否正常。
  • 查看 BIOS 中 IOMMU(AMD)或 VT-d(Intel)、ACS(Access Control Services)、Virtualization 相关选项是否开启,建议临时全部关闭测试。
  • 确认当前系统、PyTorch、CUDA、NCCL 版本:Issue 中环境为 PyTorch 2.9.1+cu130、CUDA 13.0、NCCL 2.27.7、驱动 580.119.02、Python 3.12.12,Fedora 43。
  • 查询是否已有 NVIDIA/nccl 上游 Issue 跟进:NVIDIA/nccl #1999

解决步骤

  1. 快速绕过(已验证可用,推荐优先尝试):在启动 vLLM 前设置环境变量并追加启动参数:export NCCL_P2P_DISABLE=1,启动命令添加 --disable-custom-all-reduce。根据用户反馈,这能让 2× RTX PRO 6000 Blackwell 的 TP=2 正常完成加载与推理,且在 4×B300 上同样有效。
  2. BIOS 层面修复(已有多人验证):重启机器进入 BIOS,找到 IOMMU(AMD)或 VT-d(Intel)以及 ACS / Virtualization 选项并禁用;保存后重启再运行 vLLM。一名用户确认“在 BIOS 禁用 ACS 和 IOMMU”后 TP=2 恢复正常,另一名用户使用 GRUB 内核参数 amd_iommu=off 解决(AMD 平台)。这是更底层的修复方案,但需要评估对系统安全性的影响。
  3. 回归测试并尝试放宽限制:如果禁用 IOMMU / ACS 后问题消失,可再进入 BIOS 逐步恢复部分选项,确认是否只有某一项会导致 hang,从而最小化副作用。
  4. 检查多卡内存分配预期:如果模型权重已正常分片,但每张卡显存占用较高,请通过 vLLM 日志或 nvidia-smi 确认额外内存是否为 KVCache 预留,可调整 --gpu-memory-utilization--max-num-seqs 降低 KVCache 占用,不要误认为权重重复加载。

验证方法

重新运行 vLLM 启动命令并加载同一模型,观察是否在 NCCL init 后继续打印模型加载和引擎初始化日志。随后发起一次推理请求,确认生成结果正常返回。若问题以 BIOS 方式修复,可使用 nccl-tests(如 all_reduce_perf)直接验证 NCCL 在 TP=2 下不再 hang,并确认 GPU 利用率与显存占用符合 TP 并行分配预期。

参考来源

vllm-project/vllm #33041

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 21224

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注