Pytorch中DDP :The server socket has failed to bind to [::]:29500 (errno: 98 - Address already in use)

本文介绍了Pytorch分布式数据并行(DDP)运行时出现的错误,即端口已被占用的问题,以及两种解决方案。一是手动释放显存和关闭相关进程,二是通过指定新的端口号避免冲突。此外,还提供了快速停止DDP的方法,包括使用nvidia-smi命令或通过Ctrl+C、Ctrl+Z中断程序。

一. Pytorch中DDP error

RuntimeError: The server socket has failed to listen on any local network address. The server socket has failed to bind to [::]:29500 (errno: 98 - Address already in use). The server socket has failed to bind to 0.0.0.0:29500 (errno: 98 - Address already in use).
错误

二. 解决方法

2.1 问题原因

由于中途关闭DDP运行,从而没有释放DDP的相关端口号,显存占用信息,当下次再次运行DDP时,使用的端口号是使用的DDP默认的端口号,也即是29500,因此造成冲突

2.2 方法1

手动释放显存,kill -9 pid 相关显存占用的进程,关闭所有这个服务器打开的终端,从而就能释放掉前一个DDP占用的显存和端口号

2.3 方法2

在命令行中在启动DDP命令中(在xx.py前)手动加上一句"_ _master_port=xxxxx",如下图所示(注意需要释放前一个DDP占用的显存,可能会导致显存不足):

python -m torch.distributed.launch 
在使用 PyTorch 的 `torch.nn.parallel.DistributedDataParallel` 进行分布式训练时,可能会遇到以下错误: ``` RuntimeError: The server socket has failed to listen on any local network address. The server socket has failed to bind to [::]:29500 (errno: 98 - Address already in use) ``` 这个错误通常是因为个分布式训练任务试图使用相同的端口(默认为 `29500`),导致端口冲突。PyTorch 在启动分布式训练时会使用 `torch.distributed.launch` 模块来管理进程,其中主进程(rank 0)会在指定的端口上监听其他进程的连接请求。如果该端口已被占用,就会出现上述错误。 ### 解决方案 1. **修改默认端口** 可以通过 `--master_port` 参数指定一个不同的端口号,以避免端口冲突。例如,将默认端口从 `29500` 改为 `29501`,命令如下: ```bash python -m torch.distributed.launch --nproc_per_node=2 --master_port=29501 trainB.py ``` 这样可以确保当前任务使用新的端口进行通信,避免与正在运行的其他任务发生冲突[^1]。 2. **检查并终止占用端口的进程** 如果希望继续使用默认端口(如 `29500`),可以通过系统命令查找并终止占用该端口的进程。例如,在 Linux 或 macOS 上可以使用以下命令: ```bash lsof -i :29500 kill -9 <PID> ``` 或者使用 `netstat`: ```bash netstat -tulnp | grep :29500 kill -9 <PID> ``` 在 Windows 上可以使用: ```cmd netstat -ano | findstr :29500 taskkill /F /PID <PID> ``` 这样可以释放端口,使新的训练任务能够顺利绑定并启动[^1]。 3. **确保任务之间端口隔离** 在并发运行个分布式训练任务时,建议为每个任务分配不同的端口,以避免潜在的冲突。可以在脚本中动态生成端口号,或通过配置文件管理不同任务的端口设置。 4. **使用环境变量配置端口** 除了命令行参数,还可以通过环境变量 `MASTER_PORT` 来设置主进程的端口。例如: ```bash export MASTER_PORT=29501 python -m torch.distributed.launch --nproc_per_node=2 trainB.py ``` 这种方式适用于需要在个环境中复用相同启动命令的场景。 ### 总结 该错误的核心原因是个进程尝试绑定到相同的端口,导致地址被占用。通过修改端口号、终止占用进程或使用环境变量配置端口,都可以有效解决这一问题。建议在实际部署中为每个任务分配独立端口,以确保训练任务的稳定运行[^1]。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值