这个坑值得记一笔。同一台机器上先跑了一个训练任务,再启动第二个时立刻报 Address already in use,进程直接退出。
刚开始盯着「容器共用宿主网络,端口空间重叠」,折腾了半个多小时,排掉了。
把日志和配置对完,能解释这个现象的基本就这几处。两个任务用了同一个 master_port;上一次任务异常退出,端口还处于占用状态;端口被其他服务占用。
动手时先查出占用端口的进程
Get-NetTCPConnection -LocalPort 29500 | Select-Object OwningProcess
再往下换一个不冲突的端口重启
torchrun --nproc_per_node 4 --master_port 29600 train.py
多任务并行时按任务号分配端口段
python -c "print(29500 + 10 * job_id)"
等前面都确认过,再确认新端口已经监听成功
netstat -ano | findstr 29600
怎么算真的好了,看的是同一批现象。第二个任务正常启动,多个训练任务可以同时运行,日志里不再出现端口占用。
容易忽略的是,端口冲突在容器里更容易发生,因为容器常用宿主网络,两个任务的默认端口必然会撞。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。