这个坑值得记一笔。两机四卡训练时报 NCCL WARN Connect to 10.0.0.12<45123> failed : Connection refused,进程卡住直到超时退出。
刚开始盯着「master_port 被别的进程占用」,折腾了半个多小时,排掉了。
原因不止一个,得分开看。主节点地址填成了回环地址,其他机器连不上;防火墙拦住了 rank 之间的通信端口;两台机器的网卡不在同一网段。
显式指定主节点地址与端口
torchrun --nnodes 2 --nproc_per_node 2 --master_addr 10.0.0.11 --master_port 29500 train.py
随后确认端口在机器之间可达
Test-NetConnection -ComputerName 10.0.0.11 -Port 29500
接着放行内网通信端口
New-NetFirewallRule -DisplayName nccl -Direction Inbound -Protocol TCP -LocalPort 29500 -Action Allow
单机多卡跑通再上多机
torchrun --nproc_per_node 4 --master_port 29501 train.py
白天有业务在跑,能验证的部分都压到了晚上做。
当时还开着另一个排查窗口,两边日志对照着看才定位到。
同一份数据我导出了两份,一份留底,一份拿来试。
改完先别撤,确认这几项。多机训练正常建立通信,日志里各 rank 都能完成初始化,训练开始迭代。
主节点地址必须是其他机器能访问到的内网 IP,写 127.0.0.1 时单机能跑通,多机一定失败。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。