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

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

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

具体来讲,本文首先介绍了分布式计算的基本概念,以及分布式计算如何用于深度学习。然后,列举了配置处理分布式应用的环境的标准需求(硬件和软件)。最后,为了提供亲身实践的经验,本文从理论角度和实现的角度演示了一个用于训练深度学习模型的分布式算法(同步随机梯度下降,synchronous SGD)。

深度学习

何为分布式计算

分布式计算指的是一种编写程序的方式,它利用网络中多个连接的不同组件。通常,大规模计算通过以这种方式布置计算机来实现,这些计算机能够并行地处理高密度的数值运算。在分布式计算的术语中,这些计算机通常被称为节点(node),这些节点的集合就是集群。这些节点一般是通过以太网连接的,但是其他的高带宽网络也可以利用分布式架构的优势。

深度学习如何从分布式计算中受益?

作为深度学习的主力,神经网络出现在文献中已经有一段时间了,但是直到最近,才有人完全利用它的潜力。神经网络异军突起的主要原因之一就是巨大的算力,这正是我们在本文中要写的内容。深度学习需要基于大量数据训练深度神经网络,它包含大量的参数。分布式计算是能够充分利用现代硬件的完美工具。下面是它的核心思想:

精心设计的分布式算法可以做到:

  • 为了连贯处理,在多个节点上「分配」计算(深度学习模型中的前向传播和反向传播)和数据。
  • 为了实现一致性,它能够在多个节点上建立一种有效的「同步」。

MPI:分布式计算标准

你还必须习惯另一个术语——消息传递接口(MPI)。MPI 几乎是所有分布式计算的主力。MPI 是一个开放标准,它定义了一系列关于节点互相通信的规则,MPI 也是一个编程模型/API。MPI 不是一款软件或者工具,它是一种规范。

1991 年夏天,一批来自学术界和产业界的组织和个人聚在一起,最终创建了 MPI 论坛(MPI Forum)。该论坛达成了一个共识,为一个库起草了语法和语义规范,为不同硬件提供商提出可移植/灵活/优化的实现提供指导。多家硬件提供商都有自己的 MPI 实现——OpenMPI、MPICH、MVAPICH、Intel MPI 等。

在这份教程中,我们将会使用 Intel MPI,因为它十分高效,而且也针对 Intel 平台做了优化。原始的 Intel MPI 是一个 C 语言库,并且级别非常低。

配置

对分布式系统而言,合适的配置是非常重要的。如果没有合适的硬件和网络布置,即使你对它的编程模型有着概念上的理解,也是没多大用的。下面是需要做的关键布置:

  • 通常需要由一系列通过通用网络互联形成集群的节点。推荐使用高端服务器作为节点,以及高带宽的网络,例如 InfiniBand。
  • 集群中的所有节点都需要具有完全相同用户名的 Linux 系统。
  • 节点之间必须拥有无密码 SSH 连接,这对无缝连接至关重要。
  • 必须安装一种 MPI 实现。本文只聚焦于 Intel MPI。
  • 需要一个共同的文件系统,它对所有的节点都是可见的,而且分布式应用必须驻留在上面。网络文件系统(NFS,Network Filesystem)是实现此目的一种方式。

并行策略的类型

并行深度学习模型有两种流行的方式:

  • 模型并行
  • 数据并行

1. 模型并行

模型并行指的是一个模型从逻辑上被分成了几个部分(例如,一些层在一部分,其他层在另一部分),然后把它们部署在不同的硬件/设备上。

尽管从执行时间上来看,将模型的不同部分部署在不同设备上确实有好处,但是它通常是出于避免内存限制才使用。具有特别多参数的模型会受益于这种并行策略,因为这类模型需要很高的内存占用,很难适应到单个系统。

2. 数据并行

另一方面,数据并行指的是,通过位于不同硬件/设备上的同一个网络的多个副本来处理数据的不同批(batch)。不同于模型并行,每个副本可能是整个网络,而不仅仅是一部分。

正如你可能猜到的,这种策略随着数据的增长可以很好地扩展。但是,由于整个网络必须部署在一个设备上,因此可能无法帮助到具有高内存占用的模型。下图应该可以说清楚这个问题。

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

模型并行 VS 数据并行

实际上,在大组织里,为了执行生产质量的深度学习训练算法,数据并行更加流行也更加常用。所以,本教程主要介绍数据并行。

torch.distributed API

PyTorch提供了一个非常优雅并且易于使用的 API,作为用 C 语言写的底层 MPI 库的接口。PyTorch 需要从源码编译,并且必须与安装在系统中的 Intel MPI 进行链接。我们现在就看一下 torch.distributed 的基本用法,以及如何执行它。

  1. # filename 'ptdist.py' 
  2. import torch 
  3. import torch.distributed as dist 
  4.  
  5. def main(rank, world): 
  6.     if rank == 0: 
  7.         x = torch.tensor([1., -1.]) # Tensor of interest 
  8.         dist.send(x, dst=1) 
  9.         print('Rank-0 has sent the following tensor to Rank-1') 
  10.         print(x) 
  11.     else: 
  12.         z = torch.tensor([0., 0.]) # A holder for recieving the tensor 
  13.         dist.recv(z, src=0) 
  14.         print('Rank-1 has recieved the following tensor from Rank-0') 
  15.         print(z) 
  16.  
  17. if __name__ == '__main__': 
  18.     dist.init_process_group(backend='mpi') 
  19.     main(dist.get_rank(), dist.get_world_size()) 

点对点通信

(编辑:核心网)

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

热点阅读