ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

B200多卡通信卡死?Fabric Manager版本不一致导致NVLS建不起来

B200多卡通信卡死?Fabric Manager版本不一致导致NVLS建不起来 1. 项目概述1.1 一个让人血压飙升的故障现象先说结论8×B200 多卡通信卡死大概率不是硬件问题而是 Fabric Manager 软件栈的版本不一致导致 NVLSNVLink Shared Memory集群建不起来。这周我们团队在调试一台 8 卡 B200 服务器时遇到了一个非常棘手的问题。现象很简单跑单卡任务一切正常但只要一上多卡并行尤其是用到 NVLink 通信的集合通信库比如 NCCL时整个训练进程就会卡死GPU 利用率直接归零日志里只有一堆超时重试的报错。当时我们第一反应是硬件故障比如 NVLink 线缆松动、PCIe 链路降速甚至怀疑是 B200 的散热导致降频但逐一排查下来硬件层面全部健康最终把矛头指向了 Fabric Manager 的版本一致性。这篇文章适合谁看如果你正在搞多卡 GPU 服务器、大模型训练集群或者你手上正好有 B200 / H100 这类 NVLink 全互联架构的机器并且遇到了“多卡卡死、单卡正常”的诡异现象那这篇就是为你准备的。我会把完整的过程、排查思路、背后的原理以及最后怎么修复的全部拆开来讲清楚。1.2 为什么 B200 的通信架构更“娇贵”在讲具体问题之前有必要先聊聊 B200 的硬件架构。B200 和之前的 A100、H100 不太一样它把两颗 GPU die 通过 NVLink-C2C 封装在一起对外看起来是一张卡但内部其实是两个计算单元共享显存和通信资源。这带来一个很直接的影响通信路径的复杂度变高了对软件栈的稳定性要求也更苛刻。B200 的 NVLink 带宽非常夸张单卡内部 die-to-die 的带宽和卡间 NVLink 的带宽都远超 PCIe 时代。这么高的带宽是靠什么撑起来的答案是 NVSwitch 和 Fabric Manager 这套控制面软件。Fabric Manager 负责管理 NVSwitch 的路由、拓扑发现、链路训练简单理解就是它决定了数据怎么在 GPU 之间流动。一旦这套控制面出了问题数据面就算物理上通着也没法建立起可靠的通信通道。所以B200 这种架构下多卡通信的稳定性不再是单纯的“硬件通没通”的问题而是“硬件 Firmware Fabric Manager 驱动”这四层软件栈是否完全匹配的问题。这也是为什么我们会花大力气去查一个看起来只是“软件版本不一致”的故障——在 B200 上这个“小问题”足以让整机歇菜。2. 故障现象与排查思路拆解2.1 从“单卡正常、多卡卡死”说起我们的测试环境很简单一台 8×B200 的整机双路 CPU标配的 NVLink 全互联背板操作系统是 Ubuntu 22.04GPU 驱动用的 570 系列NCCL 用的 2.19 版本。测试程序是一个基于 PyTorch 的分布式训练脚本使用 NCCL 作为集合通信后端。第一次复现时我印象非常深刻。启动 8 卡分布式训练进程全部正常拉起日志显示初始化成功但紧接着就卡在了第一次 allreduce 上。具体表现是GPU 利用率从启动瞬间的 100% 暴跌到 0%nvidia-smi显示所有卡的显存占用正常但 SM 利用率全部归零进程不退出也不报错就是死等等待 10 分钟后NCCL 报出NCCL ERROR提示超时如果只跑单卡或者 2 卡任务能正常完成性能也没有异常。这个现象非常典型基本可以断定是集合通信链路出了问题。但为什么会出问题还需要一层一层往下挖。2.2 用“三层排查法”锁定问题域面对这种多卡卡死的问题我习惯用三层排查法来缩小范围。第一层是硬件层第二层是驱动与固件层第三层是应用与通信库层。每一层都有对应的检查手段顺序不能乱否则容易误判。第一层硬件层。先看 NVLink 链路状态和拓扑。B200 的拓扑信息可以通过nvidia-smi topo -m来看如果显示 NVLink 连接数为 0 或者链路速率异常那基本就是硬件问题。我们还用 NVIDIA 官方的nvidia-smi nvlink -s查看了每张卡的 NVLink 链接状态确认 8 张卡的链接全部是 up 状态速率也没有降级。第二层驱动与固件层。检查 GPU 驱动版本、NVSwitch 固件版本、Fabric Manager 版本是否匹配。这里要特别注意Fabric Manager 不是一个可选的组件它是 NVSwitch 的控制面B200 这种 NVLink 全互联架构必须跑起来才能建立多卡通信。我们当时就是在这一步发现了异常nv-fabricmanager服务虽然显示 running但日志里有大量关于版本不匹配的警告。第三层应用与通信库层。检查 NCCL 是否检测到了正确的拓扑和通信模式。NCCL 在初始化时会输出一堆调试信息可以通过设置NCCL_DEBUGINFO来查看。正常情况下NCCL 会检测到 NVLS 模式并输出类似NVLS: Support detected的日志如果这一步没有出现那说明 NCCL 压根没有启用 NVLS多卡通信只能走 PCIe 或者 InfiniBand性能和稳定性都会大打折扣。有意思的是我们栽在第二层的坑里但表现却是在第三层才暴露出来。这也是这种问题的隐蔽之处——上层应用的表现往往会让排查者误以为是通信库或者应用逻辑的问题。2.3 为什么第一反应是查 Fabric Manager说实话一开始我把重点放在 Fabric Manager 上其实是被 H100 时代的经验“教育”过。在 H100 时代Fabric Manager 的版本不匹配同样会导致 NVSwitch 拓扑错误但 H100 的容错性比 B200 好一些至少不会整机卡死顶多是链路速率降级。B200 的架构更激进NVLink 的带宽更大但这套系统的设计容错也更低。Fabric Manager 版本不一致时它对 NVSwitch 的控制命令可能会出现歧义导致链路训练不完整NCCL 无法建立起 NVLS 的共享内存通信域最终表现为通信超时和卡死。还有一个细节B200 的 Firmware固件和 Fabric Manager 是绑定更新的。NVIDIA 官方发布驱动和固件时会同时发布配套的 Fabric Manager 版本。如果只更新了驱动而没有同步更新 Fabric Manager或者升级了 Fabric Manager 但没有刷匹配的固件都会导致类似的问题。所以我建议所有搞多卡通信的人面对这类问题第一反应不要去找硬件先检查软件栈的版本矩阵性价比最高。3. 核心原因解析Fabric Manager 版本不一致导致的 NVLS 通信故障3.1 Fabric Manager 到底是什么Fabric Manager简称 FM是 NVIDIA 提供的一个用户态守护进程负责管理 NVSwitch 子系统。你可以把它想象成一个“交警”GPU 之间的数据要上路NVLink得先由交警规划好路线、设置好红绿灯。具体来说FM 有几个核心职责拓扑发现系统启动时FM 会扫描所有 GPU 和 NVSwitch构建一张完整的连接图路由计算根据连接图计算每个 GPU 到每个 NVSwitch 的最优路径链路训练控制 NVSwitch 的端口把物理链路初始化到可用状态故障管理监控链路的健康状态出现异常时进行隔离或重路由。如果 FM 没有正确运行NVSwitch 就不会进入正常工作状态GPU 之间的 NVLink 链路即便物理上 up也无法承载数据通信。3.2 NVLS 是什么为什么它对 B200 这么重要NVLSNVLink Shared Memory是 NCCL 中的一种通信模式它的核心思路是利用 NVLink 的直连带宽在 GPU 之间建立一块共享内存区域直接通过这块共享内存完成集合通信而不需要经过网卡或者 PCIe Switch。举个不太严谨但很容易理解的类比NVLS 就像是几个同事坐在同一间办公室里喊一声就能听到不需要通过打电话IB/以太网或者跑走廊PCIe。在 NVLS 模式下NCCL 的整体带宽可以做到多卡间 NVLink 总带宽的线性叠加通信延迟也极低这对大模型训练这种大量 allreduce、allgather 操作的场景意义重大。但 NVLS 的建立有一个前条件NCCL 必须能够通过 NVSwitch 在 GPU 之间创建一个可供共享的通信域。这个通信域的建立依赖 FM 对 NVSwitch 的正确配置。如果 FM 版本不一致导致链路状态不完整NCCL 会在初始化时检测到 NVSwitch 的拓扑信息与预期不符进而拒绝启用 NVLS退化为普通的 P2P 通信。问题在于B200 的 NVLink 拓扑退化为 P2P 后通信路径会变得非常曲折而这种曲折会造成两个后果一是性能急剧下降二是通信协议栈在某些情况下会陷入死锁或超时的状态。我们这次碰到的卡死就是后者。3.3 版本不一致到底“不一致”在哪里具体到我们的环境情况是这样的GPU 驱动是 570.124.06nvidia-smi显示驱动版本是正常的但nv-fabricmanager的版本是 570.120.00和驱动差了一个小版本。理论上同一个大版本的驱动和小版本 FM 应该兼容但在 B200 上一个 minor version 的差异足以导致 NVSwitch 的控制协议出现不匹配。另一个隐蔽的点是nvidia-smi只负责显示 GPU 的信息它压根不会去校验 FM 的版本。所以如果你只通过nvidia-smi来做健康检查永远发现不了这个问题。一定要用nv-fabricmanager --version或者dpkg -l | grep fabricmanager来确认 FM 的实际版本。我们还检查了 NVSwitch 固件发现固件版本是 39.200.17而 FM 期望的固件版本是 39.200.21。这个错位直接导致 FM 在初始化 NVSwitch 时部分链路训练没有被正确执行。从日志上看FM 报告了大量的Link Training Failed和Route Calculation Failed条目但服务进程却没有崩溃退出只是处于一种“半死不活”的状态。这就是为什么我们一开始看 FM 服务显示 running 却迟迟找不到问题——服务活着但内部逻辑已经不正常了。4. 实操排查过程与关键命令记录4.1 第一步确认基本信息按照前面的三层排查法我们先记录机器的“身份证信息”。这一步非常重要因为后续所有判断都依赖这些基础数据。# 查看 GPU 数量及型号 nvidia-smi -L # 查看驱动版本和 CUDA 版本 nvidia-smi | grep Driver Version # 查看 NVLink 链路状态 nvidia-smi nvlink -s我当时得到的输出是 8×B200驱动 570.124.06NVLink 状态全部 up。但这里要注意NVLink 状态 up 只代表物理链路是通的不代表数据面是通的。接着查看系统里和 NVSwitch 相关的软件包dpkg -l | grep -i fabricmanager dpkg -l | grep -i nvidia输出结果显示nvidia-fabricmanager-570的版本是 570.120.00但libnvidia-fabricmanager的版本是 570.124.06。也就是说FM 本体和它的库文件不是同一个版本。这个问题通常发生在手动安装驱动后没有同步升级 FM或者使用了错误的 apt 源。4.2 第二步检查 FM 服务状态确认 FM 服务是否在运行以及它到底有没有报错systemctl status nv-fabricmanager journalctl -u nv-fabricmanager --since 1 hour ago | tail -100systemctl显示服务是 active (running)但journalctl的输出里每隔几秒就有一条警告[Fabric Manager] Error: Fabric Manager stateINIT, but expected stateREADY [Fabric Manager] Error: Link Training failed on port 17 [Fabric Manager] Error: Route Computation failed on switch 0很明显FM 处于 INIT 状态却无法进入 READY这种情况在硬件正常、FM 版本匹配的机器上是不会出现的。我们在这里花费了不少时间因为刚开始并不知道 FM 的版本和驱动版本不匹配一度以为是 NVSwitch 硬件有问题。4.3 第三步用 NCCL 调试日志复现问题硬件和 FM 都确认得差不多了剩下就是让问题“自己开口说话”。我们在测试脚本上加了 NCCL 调试输出export NCCL_DEBUGINFO export NCCL_DEBUG_SUBSYSINIT,GRAPH,NET跑起来后NCCL 在日志中输出了关键信息NCCL INFO NET/IB : Searching for PCIe root bus devices NCCL INFO NET/IB : No device found. NCCL INFO Using network lib: libnccl-net.so NCCL INFO P2P : Remote read is not supported, using local read NCCL INFO NVLS : Support detected by ndquery NCCL INFO NVLS : Searching for NVLink devices NCCL INFO NVLS : 0 NVLink devices found NCCL INFO NVLS : Failed to create shared memory segment注意这里的信息差Support detected和0 NVLink devices found同时出现说明 NCCL 识别到了 NVSwitch 的存在但没有成功发现在它管理下的 NVLink 设备。这直接导致 NVLS 共享内存段创建失败NCCL 退化为普通模式最终卡在 allreduce。4.4 第四步对比正常环境为了确认问题不是出在代码或者机器本身我们拿另一台配置完全相同的 8×B200 机器做了对照测试。那台机器的驱动和 FM 版本是严格一致的跑同一个测试脚本NCCL 日志输出如下NCCL INFO NVLS : Support detected by ndquery NCCL INFO NVLS : Searching for NVLink devices NCCL INFO NVLS : 8 NVLink devices found NCCL INFO NVLS : Creating shared memory segment 0 NCCL INFO NVLS : Shared memory segment created successfully8 个 NVLink 设备全部被找到共享内存段创建成功训练任务顺利跑通。两相对比问题定位基本就锁定了FM 版本不一致导致 NVSwitch 没有进入正常工作状态NVLS 建立失败最终通信卡死。4.5 第五步升级 FM 并验证既然定位到了根因剩下的就是修复。修复过程其实不复杂关键在于使用匹配的 FM 版本。# 卸载当前不一致的 FM sudo apt remove nvidia-fabricmanager-570 -y # 清理残留的库文件 sudo apt autoremove -y # 添加 NVIDIA 官方 apt 源按需添加这里以示例为主 # 重新安装与驱动严格匹配的 FM 版本 sudo apt install nvidia-fabricmanager-570570.124.06 -y安装完成后我们重新启动了 FM 服务sudo systemctl restart nv-fabricmanager sudo systemctl status nv-fabricmanager这一次journalctl里不再有链路训练失败的报错FM 的状态也从INIT切换到了READY。紧接着我们重新跑了一遍 NCCL 测试日志里出现了8 NVLink devices foundNVLS 共享内存段创建成功分布式训练脚本从头到尾跑完没有卡死。5. 常见问题与排查技巧实录5.1 问题速查表为了让大家以后少走弯路我把这次排查中遇到的关键问题和解决思路整理成一个表格方便现场对照。故障现象可能原因检查命令解决方式多卡卡死单卡正常FM 版本与驱动不匹配dpkg -l | grep fabricmanager安装与驱动严格一致的 FM 版本FM 服务 running 但状态为 INITNVSwitch 固件版本不匹配journalctl -u nv-fabricmanager升级/降级 NVSwitch 固件NCCL 日志显示 NVLS Support detected 但 0 设备NVSwitch 链路训练不完整nvidia-smi nvlink -s重启 FM刷新链路状态NVLink 物理链路 up 但通信超时控制面与数据面不一致nvidia-smi topo -m核对 FM 与固件版本矩阵多卡通信性能极低但不卡死FM 静默降级为 P2P 模式NCCL_DEBUGINFO查看 NVLS 日志修复 FM 后重启服务5.2 最容易踩的坑只看服务状态不看日志在我见过的大部分多卡通信故障排查中最容易踩的坑就是只看systemctl status显示服务在运行就以为万事大吉。FM 这个服务非常特殊它在遇到版本不匹配或固件异常时往往不会直接退出而是以 INIT 状态或降级模式继续运行。这种“活着但不干活”的状态比服务直接崩溃更让人抓狂。我的经验是排查 FM 问题只看两个东西一是journalctl -u nv-fabricmanager里有没有 Link Training / Route Calculation 相关的错误二是 FM 是否进入了 READY 状态。这两点确认了再谈进一步调优。5.3 NCCL 日志里三个关键信息位用NCCL_DEBUGINFO排查问题时输出会非常冗长。你不需要逐行读只需要抓三个关键信息位NVLSSupport detected说明 NCCL 检测到了 NVSwitch平台具备 NVLS 的能力。如果没有这一行说明 NCCL 连 NVSwitch 都没识别到问题可能在驱动或硬件NVLS0 NVLink devices found说明 NCCL 没找到可用的 NVLink 设备大概率是 FM 链路训练没完成NVLSFailed to create shared memory segment说明 NVLink 设备存在但通信域建立失败可能涉及显存配置或 P2P 权限问题。这三个信息位的组合基本能帮你快速定位是 FM 的问题还是 NCCL 配置的问题。比如我们这次遇到的就是第二种情况的典型表现。5.4 几个务必养成的操作习惯第一每次升级 GPU 驱动后必须核对 FM 和固件的配套版本。NVIDIA 官方驱动包通常不会自动升级 FM如果你手动安装了驱动FM 很容易停留在老版本。建议写一个小脚本把驱动版本、FM 版本、固件版本输出到同一个报告里方便后续对比。第二多卡集群的软件环境要尽量统一。如果有多台机器尽量使用同样的驱动、FM、NCCL 版本避免集群中不同的机器因为版本差异产生不同的行为这对分布式训练的影响是致命的。第三不要盲目更新固件。NVSwitch 固件的升级风险不低一定要确认固件与 FM 的兼容性再操作。升级过程中如果断电或者中断可能导致 NVSwitch 变砖。建议在维护窗口期操作并备份当前版本。5.5 如果 FM 正常但 NVLS 还是建不起来最后再分享一个进阶排查方向。如果你确认 FM 版本没问题服务状态也是 READY但 NCCL 仍然报 NVLS 建立失败那么可以检查一下NUMA 拓扑B200 的 NVLink 直连依赖 PCIe 拓扑如果 GPU 分布在不同的 NUMA node 上NVLS 的共享内存分配可能会失败BAR 映射NVLS 需要预留 GPU 的 BAR 空间检查 BIOS 里的 Above 4G Decoding 是否开启HugePages部分环境的 NVLS 共享内存需要系统支持 1GB HugePages检查/proc/meminfo里的 HugePages 配置。我们这次没有走到这一步但如果你按照前面的流程排查完问题还没解决这几个方向值得一试。毕竟多卡通信的故障链路长任何一个环节的疏忽都可能导致同样的表象。6. 写在最后从这次排查里我学到的三件事6.1 版本矩阵管理是多卡系统的生命线这次排查给我的最大教训就是“多卡通信系统的稳定性本质上是一个软件版本管理问题而不是硬件可靠性问题。”在 B200 这种 NVLink 全互联架构上驱动、FM、固件、NCCL 四者之间的匹配关系极度敏感任何一个成员的版本漂移都可能让整个系统陷入僵局。我强烈建议做集群运维的朋友不要只在出问题时才想起检查版本而是应该把版本矩阵当作战备基线来维护。每次变更硬件或软件栈之前先在 NVIDIA 官方的版本兼容性表里查清楚组合是否合法再动手。6.2 日志不会撒谎但你要知道去哪看FM 的日志藏在 systemd 里NCCL 的日志藏在调试开关后面。很多人在排查多卡通信问题时感到无从下手是因为没有找到正确的“信息入口”。这次排查中journalctl -u nv-fabricmanager和NCCL_DEBUGINFO是最关键的两个入口前者告诉我们控制面出了问题后者告诉我们在数据面上发生了什么。如果你遇到类似问题请先记住这两条命令比任何工具都管用。6.3 排查过程要形成“闭环”我们这次从看到卡死现象到最终定位为 FM 版本不一致中间也绕了一点路。回过头看最有价值的其实不是最后那个修复动作而是整个排查过程中积累下来的判断流程。从硬件层到驱动层再到应用层每一层都用对应的工具做了一次“证伪”最后才把问题域收敛到 FM 上。这种闭环排查的方法论放在任何复杂的多卡通信问题上都是通用的。最后如果你手头的机器也出现了类似现象不妨先看一眼 FM 版本很可能省下你大半天的排查时间。
返回列表