
pytorch提供了强大的分布式训练功能,允许模型在多个设备或多台机器上并行训练。其中,torch.distributed模块是实现这一功能的关键。它支持多种通信后端,如nccl(通常用于gpu)、gloo(支持cpu和gpu,常用于cpu或混合集群)和mpi。
Gloo后端通过在所有参与进程之间建立全连接网络来协调通信。这意味着每个进程都需要能够直接连接到其他所有进程。在初始化分布式进程组时,torch.distributed.init_process_group函数会尝试在所有节点之间建立这些连接。如果网络配置不当,这个初始化过程就会挂起或失败,并抛出类似RuntimeError: Gloo connectFullMesh failed的错误。
当使用Gloo后端初始化进程组时,init_process_group会执行一个称为“全连接网格”(full mesh)的建立过程。虽然MASTER_ADDR和MASTER_PORT用于初始的协调和发现,但实际的数据传输和后续的通信操作,Gloo会在节点之间建立直接的TCP连接。这些连接通常不会局限于MASTER_PORT,而是会使用操作系统分配的临时端口(ephemeral ports)或者其他动态协商的端口。
这意味着,即使您测试发现MASTER_PORT在节点间是可达的(例如通过telnet或nc),Gloo的connectFullMesh操作仍然可能失败,因为除了主端口之外的其他必要通信端口被防火墙或安全组阻止了。
在多EC2实例上进行PyTorch分布式训练时,需要确保以下环境变量正确设置:
以下是一个示例env_vars.sh脚本:
# env_vars.sh on rank 0 machine export MASTER_PORT=23456 export MASTER_ADDR=172.31.XX.YY # Rank 0 machine's private IP export WORLD_SIZE=2 export GLOO_SOCKET_IFNAME=enX0 # Replace with your actual private network interface export RANK=0 # env_vars.sh on rank 1 machine export MASTER_PORT=23456 export MASTER_ADDR=172.31.XX.YY # Same as above, Rank 0 machine's private IP export WORLD_SIZE=2 export GLOO_SOCKET_IFNAME=enX0 # Replace with your actual private network interface export RANK=1
在每个节点上,激活您的PyTorch环境并加载环境变量:
conda activate pytorch_env . env_vars.sh
在Python脚本中,初始化进程组的代码非常简洁:
import torch.distributed as dist
def run_distributed_training():
# 初始化进程组
dist.init_process_group('gloo')
print(f"Rank {dist.get_rank()} / {dist.get_world_size()} initialized.")
# 您的分布式训练代码...
# 例如,进行一个简单的AllReduce操作
tensor = torch.tensor([dist.get_rank()]).float()
dist.all_reduce(tensor, op=dist.ReduceOp.SUM)
print(f"Rank {dist.get_rank()} after all_reduce: {tensor}")
dist.destroy_process_group()
if __name__ == '__main__':
run_distributed_training()当网络配置不当,Gloo初始化通常会表现为以下症状:
即使您通过nc或telnet测试发现MASTER_PORT在节点间是可达的,这也不能保证Gloo的所有通信需求都能满足。例如:
# 在Rank 0机器上监听主端口 nc -lk 23456 # 在Rank 1机器上测试连接 telnet <Rank 0 私有IP> 23456 # 预期输出:Connected to ...
这种测试只能确认主端口的连通性,而Gloo的connectFullMesh还需要其他端口的通信。
问题的根本原因在于EC2实例的安全组配置不足。默认情况下,EC2安全组通常只允许SSH(端口22)和您明确开放的端口(如MASTER_PORT)。然而,Gloo的connectFullMesh操作会尝试在所有节点之间建立点对点连接,这些连接可能使用任意的临时TCP端口。如果这些端口被安全组阻止,初始化就会失败。
解决方案: 允许分布式训练集群内部的EC2实例之间进行“所有TCP流量”或“所有流量”的通信。
完成上述配置后,重新运行您的PyTorch分布式训练脚本,init_process_group应该能够顺利完成。
PyTorch分布式训练中Gloo后端在EC2多实例间挂起的问题,核心症结在于网络安全组配置不足,未能满足Gloo建立全连接网格所需的广泛TCP通信。通过将EC2安全组的入站规则配置为允许集群内实例间的所有TCP流量(并限制源为集群内部),可以有效解决此问题。理解Gloo的工作原理和正确配置网络环境,是成功部署多节点分布式训练的关键。
以上就是PyTorch分布式训练:EC2实例间Gloo后端连接故障排查与解决方案的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号