无监督的特征学习和深度学习已经证明,通过海量的数据来训练大型的模型可以大大提高模型的性能。但是,考虑需要训练的深度网络模型有数百万甚至数十亿个参数需要训练,这其实是一个非常复杂的问题。我们可以很快完成复杂模型的训练,而不用等待几天甚至几个星期的时间呢?Dean等人提出了一个可行的训练方式,使我们能够在多台物理机器上训练和serving一个模型

作者提出了两种新的方法来完成这个任务,即模型并行和数据并行。

 

一、模型并行(Model Parallelism)

在模型并行中,单个的模型分布在多个机器上。将深度神经网络放在多台机器上并行训练所能获得的性能提升效果主要取决于模型的结构。具有大量参数的模型通常可以获得更多CPU内核和内存,因此,并行化大型模型会显著提高性能,从而缩短训练时间。

 先举一个简单的例子,以便更清楚地说明这个概念。假设有一个感知器,如图1所示。为了更有效地并行化,我们可以将神经网络看作一个依赖图(Dependency Graph),其目标是尽量减少同步机制的数量,假设我们拥有无限的资源。此外,只有当一个节点具有多个变量依赖时,才需要同步机制。变量依赖(variable dependency)是可以随时间变化的依赖。例如,偏差(bias)是一个静态的依赖,因为随着时间的推移,偏差的值保持不变。在图1所示感知器中,并行化非常简单。涉及多个输入X(x1,x2,x3...)的计算可以并行化执行。

分布式深度学习原理

 图1:使用模型并行化对感知器进行切分。在这种方法中,每个输入节点负责接受输入Xi,并且与相关的权值Wi相乘。乘完之后,结果被送到输出结果累加求和,得到输出。当然,输出结点需要一个同步机制来确保结果时间是一致的。同步机制通过等待计算y所依赖的结果来实现。

 

二、数据并行(Data Parallelism)

数据并行性是另外一种完全不同的参数优化方法。数据并行化减少训练时间的一般思路是,采用n个workers同时并行计算n个不同的数据块(partitions,分区),来优化一个central model的参数。在这种情况下,把n个模型副本放在n个处理节点上,即每个节点(或进程)都拥有一个模型的副本。然后,每个worker使用指定的数据块来训练一个局部的模型副本。但是,可以让所有的workers同时一致工作,优化同一个目标。有几种方法来实现这一目标,在后面的章节中详细的讨论这些方法。

尽管如此,达到这一目标的一个常见的方法是采用一个集中的参数服务器参数服务器的目标是负责收集来自于各个worker的参数更新(updates),以及处理来自各个worker的参数请求(request)。分布式学习过程首先将数据集分割成n个块(shards)。每个单独的块将被分配给一个特定的worker。接下来,每个worker从其shards中采样mini-batches的数据用于训练一个local model。在一个(或多个)mini-batches之后,每个worker将与参数服务器通信,发送变量更新请求。这个更新请求一般都是梯度∇fi(x)。最后,参数服务器将所有这些参数更新的梯度收集起来,求平均(更新),并把更新之后的值发送到每个worker。图2展示上述过程。

分布式深度学习原理

 图2:数据并行方法的示意图。在这种方法,采用n个worker(不一定在不同的机器上),并将数据集的数据块(分区)分配给每个worker。使用这个数据块,每个worker i将遍历一个的mini-batch的数据,生成梯度∇fi(x)。然后,将梯度∇fi(x)被发送给服务器参数,参数服务器PS将梯度收集起来,按照特定的更新方式(update mechanism)进行更新。

 

 

 

相关文章: