Pytorch 分布式DPP 基本概念

Reference

PyTorch分布式DPP涉及的基本概念与问题(强烈推荐)

GO

防喷指南,小小学生,啥也不会,欢迎指出错误。

1. 分布式参数解释

  • rank:用于表示在整个分布式任务中进程的序号,每一个进程对应了一个rank进程,整个分布式训练由许多的rank进程完成。rank,我个人理解就相当于进程的index,通过这个index找到对应的进程。
  • node:物理节点,一般来说指一台机器,机器内部可以有多个GPU
  • local_rank:local_rank不同于进程rank的地方在于,他是相对于node而言的编号,每个node之间的local_rank相对独立。如果是一台机器,rank一般就等于local_rank。
  • world size:一个分布式任务中,rank的总数。


图片来自参考链接

图中world_size=12,总共有12个rank。

1.1 注意:

1、rank与GPU之间没有必然的对应关系,一个rank可以包含多个GPU;一个GPU也可以为多个rank服务(多进程共享GPU)。

这一点在理解分布式通信原理的时候比较重要。因为很多资料里面对RingAllReduce、PS-WorK 等模式解释时,习惯默认一个rank对应着一个GPU,导致了很多人认为rank就是对GPU的编号。

2. 通信参与与模式

通信过程主要是完成模型训练过程中参数信息的传递,主要考虑通信后端和通信模式选择,后端与模式对整个训练的收敛速度影响较大,相差可达2~10倍。在DDP中支持了几个常见的通信库,而数据处理的模式写在Pytorch底层,供用户选择的主要是后端。在初始化时需要设置:

  • backend:通信后端,可选nccl(NVIDIA推出),gloo(FACEBOOK推出),mpi(OpenMPI),从测试效果来看,如果显卡支持nccl,建议选择nccl。

torch提供了api接口判断底层通信库是否可用

torch.distributed.is_nccl_available()  # 判断nccl是否可用
torch.distributed.is_mpi_available()  # 判断mpi是否可用
torch.distributed.is_gloo_available() # 判断gloo是否可用
  • master_addr与master_port:主节点的地址以及端口,供init_method的tcp方式使用。因为pytorch中网络通信建立是从机去连接主机,运行ddp只需要指定主节点的IP与端口,其他节点的IP不需要填写。这两个参数可以通过环境变量或者init_method传入。
# 方式1:
os.environ['MASTER_ADDR'] = 'localhost'
os.environ['MASTER_PORT'] = '12355'
dist.init_process_group("nccl", 
                        rank=rank, 
                        world_size=world_size)
# 方式2:
dist.init_process_group("nccl", 
                        init_method="tcp://localhost:12355",
                        rank=rank, 
                        world_size=world_size)
                       

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值