1:所有forward的输出必须参与到loss计算并回传
2:类似于layer_norm这样的操作是无需进行分布式通信的,也无法进行分布式通信,所以在DDP的时候必须把find_unused_parameters设置为True
3:当报错形式为如下时,即在某一个进程的显卡上没有接收到梯度
这个时候可以在命令行前面加上TORCH_DISTRIBUTED_DEBUG=DETAIL, 这样,将找出具体时哪些参数没有接收到梯度,以此更好的调整代码
4:关于0号卡的显存为什么远高于其他卡,需要设置
torch.cuda.set_device(rank)
torch.cuda.empty_cache()
一般设置在dist.init_process_grop之后(个人习惯),至于为什么,参考一下这篇文章
(4条消息) Pytorch清空显存缓冲区(torch.cuda.empty_cache)_pytorch 释放显存_hxxjxw的博客-CSDN博客
但实验发现,重点其实在torch.cuda.set_device(rank),所以DDP一定要加这个代码,即使已经用了CUDA_VISIBLE_DEVICES
遇到在补充..........