DDP
ValueError: Error initializing torch.distributed using env:// rendezvous: environment variable RANK expected, but not set 本地pycharm debug报错,该如何修改
这个错误是因为在 本地 PyCharm 调试 分布式训练代码时,没有正确设置环境变量,导致 torch.distributed
无法找到 RANK
变量。
为什么会发生这个错误?
在使用 torch.distributed
进行多 GPU 训练时,PyTorch 需要一些环境变量来确定进程的分布式信息:
RANK
: 当前进程的编号(进程 ID)WORLD_SIZE
: 进程总数LOCAL_RANK
: 当前进程在本节点的编号(用于 GPU 绑定)MASTER_ADDR
: 主节点 IPMASTER_PORT
: 进程间通信端口
当使用 torchrun
或 torch.distributed.launch
运行时,这些变量会自动设置。但在 PyCharm 本地调试 时,这些变量不会自动传递,所以 PyTorch 会报 RANK expected, but not set
错误。
解决方案
方法 1:手动设置环境变量
在 PyCharm 里设置 RANK
相关变量:
打开 PyCharm,进入 Run/Debug Configurations
选择你的调试脚本(比如
main.py
)找到 Environment variables(环境变量)
添加以下环境变量:
RANK=0 WORLD_SIZE=1 LOCAL_RANK=0 MASTER_ADDR=127.0.0.1 MASTER_PORT=29500
1
2
3
4
5保存后运行 Debug
这样 PyTorch 会认为它是单机单进程模式,不会去找其他进程,也不会报错。
方法 2:代码里手动设置
如果不想改 PyCharm 设置,可以直接在 Python 代码里设置环境变量:
import os
import torch
import torch.distributed as dist
# 手动设置分布式环境变量(仅用于 Debug)
os.environ["RANK"] = "0"
os.environ["WORLD_SIZE"] = "1"
os.environ["LOCAL_RANK"] = "0"
os.environ["MASTER_ADDR"] = "127.0.0.1"
os.environ["MASTER_PORT"] = "29500"
# 初始化分布式训练
dist.init_process_group(backend="nccl")
2
3
4
5
6
7
8
9
10
11
12
13
这样即使本地单进程运行,torch.distributed
也不会报错。
方法 3:使用 torchrun
运行
如果你希望保持分布式运行方式(而非单机单进程调试),可以用 torchrun
在本地启动:
torchrun --nproc_per_node=1 main.py
这样 torchrun
会自动设置 RANK
变量,并且 PyTorch 不会报错。
总结
解决方案 | 适用场景 | 操作方式 |
---|---|---|
方法 1:手动设置环境变量 | PyCharm 本地 Debug | PyCharm 里设置 RANK=0, WORLD_SIZE=1 |
方法 2:代码里 os.environ 设置 | 代码可修改,方便 Debug | 在 Python 代码里手动写入 os.environ |
方法 3:用 torchrun 运行 | 仍然希望保持分布式运行 | 终端运行 torchrun --nproc_per_node=1 main.py |
对于 PyCharm 本地调试,推荐 方法 1 或 2。如果要 模拟多 GPU 运行,可以尝试 方法 3。