ConnectionError: Tried to launch distributed communication on port `xxxxx`, but another process is u

诸神缄默不语-个人优快云博文目录

这个bug是在用accelerate跑代码时出现的,完整的报错信息是:

ConnectionError: Tried to launch distributed communication on port `xxxxx`, but another process is utilizing it. Please specify a different port (such as using the `----main_process_port` flag or specifying a different `main_process_port` in your config file) and rerun your script. To automatically use the next open port (on a single node), you can set this to `0`.

事实上改成0没用,我试后有用的解决方案是改成port这个数字+1

默认config文件的路径是.cache/huggingface/accelerate/default_config.yaml,可以直接改这个,如果担心改这个会影响别的代码,可以新建一个config文件,在最后添加这行:main_process_port: 12023(port号)
然后把命令行添上:accelerate launch --config_file {path/to/config/my_config_file.yaml} {script_name.py} {--arg1} {--arg2} ...

参考资料:Launching your 🤗 Accelerate scripts

这种问题问ChatGPT果然没用啊,还得我自己去搜文档,ChatGPT不行啊。

在分布式训练过程中,端口冲突是一个常见问题,尤其是在使用 PyTorch 的 `torch.distributed` 模块时。当端口 29500 被占用时,通常是因为多个训练任务试图使用相同的端口,或者前一次训练任务异常终止后未正确释放端口,也可能是系统中其他服务占用了该默认端口[^1]。 为了解决这一问题,可以采取以下几种方式来设置不同的主进程端口(`MASTER_PORT`)以避免冲突: ### 1. 手动指定 `MASTER_PORT` 在启动训练脚本时,可以通过环境变量手动设置 `MASTER_PORT`。例如,在命令行中使用以下命令: ```bash export MASTER_PORT=29501 ``` 这样可以将默认的端口从 29500 更改为 29501,从而避免与其他进程发生冲突。 ### 2. 在代码中设置 `init_method` 如果使用 `torch.distributed.init_process_group()` 来初始化进程组,可以在代码中指定 `init_method` 参数,包括自定义的端口。例如: ```python import torch.distributed as dist dist.init_process_group( backend='nccl', init_method='tcp://127.0.0.1:29501', # 使用自定义端口 world_size=world_size, rank=rank ) ``` 通过这种方式,可以显式地指定主节点的 IP 地址和端口,避免使用默认端口 29500。 ### 3. 使用 `torchrun` 启动训练时指定端口 如果你使用 `torchrun` 来启动分布式训练任务,可以在命令行中通过 `--master-port` 参数指定不同的端口。例如: ```bash torchrun --nproc_per_node=4 --master-port=29501 train_dreambooth_lora.sh ``` 这将使用端口 29501 作为主节点的通信端口,而不是默认的 29500。 ### 4. 检查并释放被占用的端口 如果端口 29500 已被占用,可以使用以下命令查找并终止占用该端口的进程: ```bash lsof -i :29500 kill -9 <PID> ``` 其中 `<PID>` 是占用端口的进程 ID。执行这些命令后,端口将被释放,可以重新尝试启动训练任务。 ### 5. 自动选择未被占用的端口 在某些情况下,可以编写脚本自动选择一个未被占用的端口。例如,使用 Python 脚本动态选择端口: ```python import socket def find_free_port(): with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind(('', 0)) return s.getsockname()[1] free_port = find_free_port() print(f"Using free port: {free_port}") ``` 然后可以将 `free_port` 传递给训练脚本或 `init_method` 参数。 ### 6. 配置环境变量 在某些情况下,可以使用环境变量来动态设置 `MASTER_PORT`。例如,在脚本中添加以下代码: ```bash export MASTER_PORT=$(python -c "import socket; s = socket.socket(); s.bind(('', 0)); print(s.getsockname()[1])") ``` 这将自动选择一个未被占用的端口,并将其设置为 `MASTER_PORT`。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诸神缄默不语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值