最近在搞多卡训练,用PyTorch的DistributedDataParallel(DDP)跑一个BERT微调任务。单卡没问题,但换成4卡后,发现loss下降得特别慢,而且每个卡的loss值都不一样。我确认了数据加载用的是DistributedSampler,模型参数也是broadcast过的,但就是梯度不同步?检查了一下,发现reduce操作好像没生效,梯度还是各自为政。有人说是没设对init_method,我试了tcp://localhost:12355和env://都不行。求大佬指点一下,到底是什么环节漏了?我用的PyTorch 1.12,CUDA 11.6,机器是4张V100。
楼主
2026-07-19
MCP里用PyTorch做分布式训练,DDP报错梯度不同步怎么办?
请 登录 后发表回复
全部回复
共 142 条
2楼
5天前
学到了,感谢分享!
3楼
1天前
你确认下是不是用torchrun或者mp.spawn启动的,直接用python跑多进程很容易出这问题。另外检查下有没有在某个卡上不小心把参数设成requires_grad=False了,或者有没有手动调过optimizer.step前没做sync。我之前也遇到过类似情况,最后发现是模型里有个BN层没正确同步导致的假象,loss看着不一样其实梯度是同步的。可以打印下各卡梯度的norm对比一下,如果确实不一致那大概率还是进程组没初始化好。