一、问题
单机多卡可以正常训练模型,多机多卡数据加载完成后卡住不动,排查两台机器可以ping通,表明网络没有问题,查看bug信息是NCCL通信问题。报错信息大致如下:
torch.distributed.DistBackendError: NCCL error in: …/torch/csrc/distributed/c10d/ProcessGroupNCCL.cpp:1333, internal error - please report this issue to the NCCL developers, NCCL version 2.18.1 ainode01: ncclInternalError: Internal check failed. ainode01: Last error
NCCL是英伟达基于NCIDIA-GPU的一套开源的集合通信库,如其官网描述:NVIDIA集合通信库(NCCL)实现了针对NVIDIA GPU性能优化的多GPU和多节点集合通信原语。NCCL提供了诸如all-gather, all-reduce, broadcast, reduce, reduce-scatter等实现,这些实现优化后可以通过PCIe和NVLink等高速互联,从而实现高带宽和低延迟。因为NCCL则是NVIDIA基于自身硬件定制的,能做到更有针对性且更方便优化,故在英伟达硬件上,NCCL的效果往往比其它的通信库更好。
在大多数情况下,NCCL(https://developer.nvidia.com/nccl)作为底层的集合通信库为分布式深度学习框架提供了多机通讯能力、我们只要安装即可,在分布式深度学习相关的任务或代码中通常感知不到其存在。除深度学习框架以外、Horovod通常也依赖nccl作为底层的集合通信库。
根据报错提示猜测是两台机器的通信出了问题,需要给NCCL指定用于通信的网络接口名称,即网卡名。
二、解决
apt-get update && apt-get install -y net-tools
终端输入ifconfig查看自己的网卡名:
在.bashrc中加入
export NCCL_SOCKET_IFNAME=eth1
参考:
1、https://www.autodl.com/docs/distributed_training/
2、https://github.com/NVIDIA/nccl/issues/1141#issuecomment-1882357793
3、https://www.cnblogs.com/zl1991/p/15357532.html