加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

分布式入门,怎样用PyTorch实现多GPU分布式训练

发布时间:2019-05-06 14:38:12 所属栏目:建站 来源:机器之心编译
导读:具体来讲,本文首先介绍了分布式计算的基本概念,以及分布式计算如何用于深度学习。然后,列举了配置处理分布式应用的环境的标准需求(硬件和软件)。最后,为了提供亲身实践的经验,本文从理论角度和实现的角度演示了一个用于训练深度学习模型的分布式算法(

用 mpiexec 执行上面的代码,能够得到一个分布式进程调度器,基于任何标准 MPI 实现都可以,结果如下:

  1. cluster@miriad2a:~/nfs$ mpiexec -n 2 -ppn 1 -hosts miriad2a,miriad2b python ptdist.py 
  2. Rank-0 has sent the following tensor to Rank-1 
  3. tensor([ 1., -1.]) 
  4. Rank-1 has recieved the following tensor from Rank-0 
  5. tensor([ 1., -1.]) 
  • 第一行要被执行的是 dist.init_process_group(backend),它基本上设置了参与节点之间的内部通信通道。它使用了一个参数来指定使用哪个后端(backend)。因为我们完全使用 MPI,所以在我们的例子中 backend='mpi'。也有其他的后端(例如 TCP、Gloo、NCCL)。
  • 需要检索的两个参数——world size 和 rank。World 指的是在特定 mpiexec 调用环境中所有节点的集合(参见 mpiexec 中的 -hosts flag)。rank 是由 MPI 运行时为每一个进程分配的唯一整数。它从 0 开始。它们在 -hosts 中被指定的顺序用于分配数值。所以,在这个例子中,节点「miriad2a」上的进程会被赋值 Rank 0,节点「miriad2b」上的进程会被赋值为 Rank 1.
  • x 是 Rank 0 打算发送到 Rank 1 的张量,通过 dist.send(x, dst=1) 完成。
  • z 是 Rank 1 在接收到张量之前就创建的东西。我们需要一个早就创建好的同维度的张量作为接收传送来的张量的占位符。z 的值最终会被 x 替代。
  • 与 dist.send(..) 类似,负责接收的对应函数是 dist.recv(z, src=0),它将张量接收到 z。

通信集体

我们在上一部分看到的是一个「点对点」通信的例子,在给定的环境中,rank(s) 将数据发送到特定的 rank(s)。尽管这种通信是有用的,因为它对通信提供了细粒度的控制,但是还有其他被经常使用的标准通信模式,叫作集体(collectives)。下面介绍了 Synchronous SGD 算法中我们感兴趣的一个集体——all-reduce 集体。

1. ALL-REDUCE 集体

All-reduce 是一种同步通信方式,所有的 ranks 都被执行了一个 reduction 运算,并且得到的结果对所有的 ranks 都是可见的。下图介绍了这个思想(将求和作为 reduction 运算)。

分布式入门,怎样用PyTorch实现多GPU分布式训练

all-reduce 集体

  1. def main(rank, world): 
  2.     if rank == 0: 
  3.         x = torch.tensor([1.]) 
  4.     elif rank == 1: 
  5.         x = torch.tensor([2.]) 
  6.     elif rank == 2: 
  7.         x = torch.tensor([-3.]) 
  8.  
  9.     dist.all_reduce(x, op=dist.reduce_op.SUM) 
  10.     print('Rank {} has {}'.format(rank, x)) 
  11.  
  12. if __name__ == '__main__': 
  13.     dist.init_process_group(backend='mpi') 
  14.     main(dist.get_rank(), dist.get_world_size()) 

PyTorch 中 all-reduce 集体的基本用法

在 world of 3 环境中启动时,结果如下:

  1. cluster@miriad2a:~/nfs$ mpiexec -n 3 -ppn 1 -hosts miriad2a,miriad2b,miriad2c python ptdist.py 
  2. Rank 1 has tensor([0.]) 
  3. Rank 0 has tensor([0.]) 
  4. Rank 2 has tensor([0.]) 
  • if rank == … elif 是我们在分布式计算中多次遇到的模式。在这个例子中,它被用来在不同的 rank 上创建张量。
  • 它们一起执行了 all-reduce(可以看见,dist.all_reduce(..) 在 if … elif block 逻辑块的外部),求和 (dist.reduce_op.SUM) 作为 reduction 运算。
  • 将来自每个 rank 的 x 求和,再把得到的求和结果放置在每个 rank 的 x 内。

转向深度学习

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读