报错是这么冒出来的。在没有 InfiniBand 的机器上启动多卡训练,NCCL 日志反复打印 ibv_create_context failed,随后回退到 socket 但速度很慢。

中间走过弯路,把「拓扑检测超时后才回退,拖慢初始化」当成主因,改完现象没变。

真正麻烦的地方在于,几个原因的现象几乎一样。环境里没有 IB 网卡,NCCL 仍按默认策略探测。少数情况下是容器缺少对应的用户态驱动库。

还有一种情况,多网卡机器选错了通信网口。

显式关闭 IB 让 NCCL 走 socket

$env:NCCL_IB_DISABLE='1'; python train.py

指定使用的网卡名称

$env:NCCL_SOCKET_IFNAME='eth0'; python train.py

单机多卡时关闭 P2P 排除拓扑问题

$env:NCCL_P2P_DISABLE='1'; python train.py

等前面都确认过,再打开调试日志确认最终走的链路

$env:NCCL_DEBUG='INFO'; python train.py

别只看报错消失,验证要多做一步。日志里不再出现 IB 相关报错,初始化时间明显缩短,多卡训练的吞吐恢复到正常水平。

关闭 IB 只对没有 IB 硬件的环境有意义,真有高速网络时关掉会退回到普通网卡,吞吐下降非常明显。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189