
pytorch提供强大的分布式训练能力,允许模型在多个计算节点上并行训练,从而加速大型模型的训练过程。其核心是torch.distributed模块,它支持多种后端(如nccl、gloo、mpi)来实现不同节点间的通信。其中,gloo后端是一个cpu友好、跨平台的通信库,常用于cpu训练或作为gpu训练的备用通信方式。
在分布式训练中,通常需要设置一系列环境变量来协调各个进程,包括MASTER_ADDR(主节点IP)、MASTER_PORT(主节点端口)、WORLD_SIZE(总进程数)和RANK(当前进程的排名)。这些参数在调用torch.distributed.init_process_group时用于初始化进程组,建立节点间的通信连接。
在AWS EC2等多节点环境中部署PyTorch分布式训练时,用户可能会遇到torch.distributed.init_process_group('gloo')调用后进程挂起,或在一段时间后报错RuntimeError: Gloo connectFullMesh failed。
典型错误信息示例:
[E ProcessGroupGloo.cpp:138] Gloo connectFullMesh failed with [/opt/conda/conda-bld/pytorch_1699449045860/work/third_party/gloo/gloo/transport/tcp/pair.cc:144] no error
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/ec2-user/miniconda3/envs/pytorch_env/lib/python3.9/site-packages/torch/distributed/c10d_logger.py", line 74, in wrapper
func_return = func(*args, **kwargs)
File "/home/ec2-user/miniconda3/envs/pytorch_env/lib/python3.9/site-packages/torch/distributed/distributed_c10d.py", line 1155, in init_process_group
default_pg, _ = _new_process_group_helper(
File "/home/ec2-user/miniconda3/envs/pytorch_env/lib/python3.9/site-packages/torch/distributed/distributed_c10d.py", line 1293, in _new_process_group_helper
backend_class = ProcessGroupGloo(backend_prefix_store, group_rank, group_size, timeout=timeout)
RuntimeError: Gloo connectFullMesh failed with [/opt/conda/conda-bld/pytorch_1699449045860/work/third_party/gloo/gloo/transport/tcp/pair.cc:144] no error此错误通常伴随着以下现象:
Gloo后端在初始化时,尤其是当WORLD_SIZE > 1时,会尝试建立一个“全连接网格”(Full Mesh)通信模式。这意味着集群中的每个节点都需要能够与其他所有节点建立直接的TCP连接。这些连接不仅限于MASTER_PORT,还包括Gloo内部用于数据传输的动态分配的端口。
当仅在EC2安全组中开放MASTER_PORT时,主节点与从节点之间的初始握手可能成功,但Gloo在尝试建立后续的全连接时,由于其他必要端口被防火墙(如EC2安全组)阻塞,导致连接失败并最终超时。错误信息中的connectFullMesh failed正是指Gloo未能成功建立所有必需的连接。
解决此问题的关键在于正确配置AWS EC2实例的安全组,确保分布式训练所需的全部端口都能在节点间正常通信。
核心要点:
不是所有通信都通过MASTER_PORT。Gloo需要节点间在多个动态端口上进行通信。因此,最直接的解决方案是允许集群内部节点间的所有TCP流量或特定端口范围的流量。
具体操作步骤与建议:
示例安全组入站规则(推荐方式):
| 类型 | 协议 | 端口范围 | 源 | 描述 |
|---|---|---|---|---|
| 所有TCP | TCP | 所有 | sg-xxxxxxxx | 允许来自本安全组内实例的所有TCP流量 |
其中sg-xxxxxxxx替换为你的EC2实例所使用的安全组ID。
以下是一个简化的PyTorch分布式代码示例,用于演示init_process_group的用法。确保在运行前设置好所有必要的环境变量。
import os
import torch
import torch.distributed as dist
def run(rank, world_size):
"""
分布式训练的入口函数
"""
# 1. 初始化进程组
# 'gloo' 是一个CPU友好的后端,适用于多机CPU或混合CPU/GPU场景
# 'nccl' 是NVIDIA GPU专用的高性能后端
dist.init_process_group("gloo", rank=rank, world_size=world_size)
print(f"Rank {rank} / {world_size} successfully initialized process group.")
# 2. 执行分布式操作 (例如,all_reduce)
tensor = torch.tensor([rank * 1.0])
print(f"Rank {rank}: Initial tensor value: {tensor}")
# 将所有进程的张量求和
dist.all_reduce(tensor, op=dist.ReduceOp.SUM)
print(f"Rank {rank}: Tensor after all_reduce: {tensor}")
# 3. 清理进程组
dist.destroy_process_group()
print(f"Rank {rank}: Destroyed process group.")
if __name__ == "__main__":
# 从环境变量获取分布式参数
rank = int(os.environ["RANK"])
world_size = int(os.environ["WORLD_SIZE"])
master_addr = os.environ["MASTER_ADDR"]
master_port = os.environ["MASTER_PORT"]
gloo_ifname = os.environ.get("GLOO_SOCKET_IFNAME") # 可选,如果有多网卡
print(f"Starting process with RANK={rank}, WORLD_SIZE={world_size}, "
f"MASTER_ADDR={master_addr}, MASTER_PORT={master_port}, "
f"GLOO_SOCKET_IFNAME={gloo_ifname}")
run(rank, world_size)运行方式(以两台EC2实例为例):
在主节点 (Rank 0) 上:
# env_vars_rank0.sh export MASTER_ADDR=<主节点私有IP> # 例如:172.31.0.10 export MASTER_PORT=23456 export WORLD_SIZE=2 export RANK=0 export GLOO_SOCKET_IFNAME=enX0 # 根据ifconfig确认你的私有IP对应的网卡名称,例如eth0, enX0 # 运行 source env_vars_rank0.sh python your_script_name.py
在从节点 (Rank 1) 上:
# env_vars_rank1.sh export MASTER_ADDR=<主节点私有IP> # 必须与主节点相同 export MASTER_PORT=23456 # 必须与主节点相同 export WORLD_SIZE=2 # 必须与主节点相同 export RANK=1 export GLOO_SOCKET_IFNAME=enX0 # 根据ifconfig确认你的私有IP对应的网卡名称,例如eth0, enX0 # 运行 source env_vars_rank1.sh python your_script_name.py
通过上述安全组配置调整,并结合正确的环境变量设置,PyTorch分布式训练在EC2多节点环境中使用Gloo后端时应能顺利初始化并运行。
以上就是解决PyTorch分布式Gloo在EC2多节点通信中挂起的问题的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号