最近在折腾一个多节点分布式训练的任务,用的 PyTorch DDP,后端是 NCCL。环境是公司自研的 MCP 集群,网络走的是 InfiniBand。单机 8 卡跑没问题,但一扩展到两机 16 卡就频繁报“NCCL 超时”和“梯度同步失败”。我检查了网卡配置和 NCCL 版本,也试过调小 batch size 和梯度累积步数,还是偶尔会 hang 住。想问下 MCP 集群下有没有什么特别要注意的参数(比如 NCCL_IB_TIMEOUT 或者环境变量),或者是不是我初始化 group 的方式不对?真心被这个问题卡了三天了,求过来人指条明路。
MCP 环境下用 PyTorch 做分布式训练,梯度同步总是报错,有大佬指点吗?
全部回复
共 126 条先查下NCCL_P2P_DISABLE和NCCL_SHM_DISABLE,IB下这俩经常导致超时,我之前调完就好了。
多机DDP在MCP这种自研集群上跑,最容易踩的坑其实是IB网卡和NCCL的匹配问题。你先确认下有没有设NCCL_SOCKET_IFNAME和NCCL_IB_HCA,MCP如果有多张网卡混着用,NCCL选错口就会各种超时。NCCL_IB_TIMEOUT可以调到22左右试试,但根因大概率还是网络路径或者GID索引不对,建议先用nccl-tests跑个all_reduce压测看看能不能稳定。
先查查IB网卡是不是全部UP了,两机16卡最容易挂在一张掉线的卡上。
多机场景下 NCCL 超时大概率是 IB 和 socket 的网卡选择没对齐,可以试试显式指定 NCCL_SOCKET_IFNAME 和 NCCL_IB_HCA,别让它自己瞎挑。MCP 这类自研集群经常有自定义的拓扑,init_process_group 里最好手动传 rank 和 world_size,别依赖环境变量自动推断。我上次也是单机没事两机就挂,最后发现是 MTU 没统一,调成一致后就没再 hang 过。NCCL_IB_TIMEOUT 可以适当调大点,但根因多半还是在网络配置上。
多机一上来就hang,大概率不是DDP代码本身的问题,而是NCCL在IB网络上的建链和超时参数没调好。你这单机8卡OK、两机就崩,很典型的跨节点通信瓶颈。先确认一下MCP集群里是不是每台机器的IB网卡和GPU的亲和性没绑对,用nvidia-smi topo -m看下拓扑,如果GPU跨了NUMA或者走了PCIe switch而不是直连IB,延迟一上来就很容易超时。NCCL_IB_TIMEOUT可以适当调大,比如设成22或23,NCCL_IB_RETRY_CNT也加大到7以上,另外NCCL_SOCKET_IFNAME要指定成IB对应的网口,别让它自动选到管理网去了。还有NCCL_DEBUG=INFO先跑一遍,看日志里到底卡在哪个环节,是建链超时还是allreduce阶段。如果MCP平台有自己的网络隔离或者容器网络,记得把NCCL_IB_DISABLE先设成0确认走的是IB而不是RoCE fallback。初始化group的时候如果用了timeout参数,建议把默认的30分钟拉长一点,两机环境建链本来就慢。我之前在类似集群上还遇到过GID index选错导致RoCE跑不起来的问题,可以试试NCCL_IB_GID_INDEX=3。
先看下IB的MTU和NCCL_IB_TIMEOUT,多机hang多半是网络心跳超时,调大试试。