问题出现得很突然,日志倒是留得挺全。torchrun 启动四卡训练,日志停在初始化完成后不再前进,GPU 利用率一直是 0,CPU 也没有明显负载。
刚开始盯着「共享内存不足,worker 无法创建」,折腾了半个多小时,排掉了。
排查方向其实有限,先把可能性排一排。num_workers 大于 0 且子进程在 fork 后初始化了 CUDA。还有一种是每个 rank 都去下载同一份数据集,卡在锁上。
不容易想到的是,分布式采样器的种子或分片配置不一致。
上来先把 worker 设为 0 验证是否与数据加载有关
python train.py --num-workers 0
多卡时用 spawn 启动并限制 worker 数量
torchrun --nproc_per_node 4 train.py --num-workers 2
只让主进程下载数据,其余 rank 等待
if rank == 0: download(); dist.barrier()
末了检查共享内存与文件句柄是否够用
ulimit -n
改完先别撤,确认这几项。训练能顺利进入第一个 step,GPU 利用率上升到正常水平,日志开始输出 loss。
卡住且没有报错通常不是代码逻辑问题而是进程间等待,先把 worker 归零排除数据管线,能省掉大量排查时间。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。