描述

在使用PyTorch的分布式数据并行(DDP)进行多卡训练时,可能会遇到以下错误:

RuntimeError: The server socket has failed to listen on any local network address. useIpv6: 0, code: -98, name: EADDRINUSE, message: address already in use

原因

这个错误表明,你尝试使用的网络端口已经被其他进程占用。在服务器环境中,特别是当多个用户或任务同时运行时,可能已经被其他DDP训练任务占用。

修改方法

为了避免端口冲突,你可以指定一个不同的端口号来启动你的DDP训练任务。以下是如何通过命令行参数来指定新的端口号的步骤:

  1. 修改启动命令
    使用torch.distributed.launch工具时,可以通过--master_port参数来指定主节点使用的端口号。例如,如果你想使用端口号15666,可以修改你的启动命令如下:

    python3 -m torch.distributed.launch --nproc_per_node=$GPUS --master_port 15666 --use_env main.py
    

    这里,$GPUS应该被替换为你想要使用的GPU数量。

  2. 检查端口占用
    在修改端口号之前,最好先检查你选择的端口是否已经被占用。你可以使用如下命令来检查特定端口的占用情况(以Linux为例):

    sudo lsofo -i :15666
    

    或者

    sudo netstat -tulpn | grep 15666
    

    如果端口已经被占用,你需要选择一个不同的端口号。

  3. 避免硬编码端口
    为了使你的脚本更加灵活和可移植,建议不要在脚本中硬编码端口号。而是可以通过命令行参数或环境变量来传递端口号。

  4. 使用更高范围的端口
    通常,1024以下的端口号被系统保留或需要特权才能使用。因此,选择更高的端口号(如15000以上)通常更安全且不易冲突。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐