四卡机用 docker 跑 torchrun,镜像里没加 --shm-size,容器内 /dev/shm 只有 64MB,训练到 init_process_group 就卡住,两分钟后抛 NCCL error,日志里能看到 unhandled system error,宿主机直跑同一份代码正常。
一开始怀疑是「DataLoader 多 worker 也要用共享内存,进一步挤占」,查了一圈,方向不对。
把日志和配置对完,能解释这个现象的基本就这几处。NCCL 在容器内通过共享内存传递大块数据,64MB 远远不够。另一种情况是docker 默认 shm 大小是 64MB,且不会随内存自动增长。
另外,容器没有加 --ipc=host,进程间通信被限制在私有命名空间。
第一件事是确认容器内共享内存大小
docker exec -it train bash -c "df -h /dev/shm"
随后重新起容器时把 shm 调大
docker run --gpus all --shm-size=16g -it train:latest bash
或者直接用宿主机的 IPC 命名空间
docker run --gpus all --ipc=host -it train:latest bash
复跑一次确认 NCCL 初始化通过
torchrun --nproc_per_node=4 train.py --max_steps 2
别只看报错消失,验证要多做一步。init_process_group 在十秒内完成,两步训练正常跑完,容器内 /dev/shm 显示 16G,不再出现 NCCL 系统错误。
提醒一点。这个参数在单卡时完全看不出来,多卡一上就炸,起容器的模板里应该默认带上,别等到训练时才补。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
