分布式深度学习(I):分布式训练神经网络模型的概述

  原文: Distributed Deep Learning, Part 1: An Introduction to Distributed Training of Neural Networks

  作者:Alex Black、Vyacheslav Kokorin

  翻译:KK4SBB 责编: 何永灿

  本文是分布式训练神经网络模型三篇系列文章的第一篇。

  在第一篇文章,我们首先了解一下如何使用GPU分布式计算来显著提高深度学习模型的训练速度,以及会讨论其中面临的一些挑战和当前的研究方向。我们还会讨论在何种场景下适合(或不适合)采用分布式算法来训练神经网络模型。

  第二篇文章,我们会从Apache Spark的网络模型训练工具Deeplearning4j入手,来讨论其实现细节,以及提供一个端到端训练的实际案例。

  最后,我们深入探讨Deeplearning4j的Spark实现,并且讨论一些在最大化训练性能的过程中,所遇到的性能和架构设计上的挑战问题。我们也会讨论Spark如何与Deeplearning4j所使用的本地高性能计算函数库交互协作。

  概述

  在大数据集上训练的现代神经网络模型在许许多多领域都取得了显著的效果,从语音和图像识别到自然语言处理,再到工业界的应用,比如欺诈检测和推荐系统。但是这些神经网络的训练过程非常耗时。尽管近些年GPU的硬件技术、网络模型结构和训练方法均取得了很大的突破,但是单机训练耗时过久的事实仍无法回避。好在我们并不局限于单机训练:人们投入了大量的工作和研究来提升分布式训练神经网络模型的效率。

  我们首先介绍两种并行化/分布式训练的方法。

物联网

  在 模型并行化( model parallelism ) 方法里,分布式系统中的不同机器负责单个网络模型的不同部分 —— 例如,神经网络模型的不同网络层被分配到不同的机器。

  在 数据并行化( data parallelism ) 方法里,不同的机器有同一个模型的多个副本,每个机器分配到数据的一部分,然后将所有机器的计算结果按照某种方式合并。

  当然,这些方法并不是完全互斥的。假设有一个多GPU集群系统。我们可以在同一台机器上采用模型并行化(在GPU之间切分模型),在机器之间采用数据并行化。

物联网

  尽管在实际应用中模型并行化的效果还不错,数据并行化却是多数分布式系统的首选,后者投入了大量的研究。一方面,数据并行化在实现难度、容错率和集群利用率方面都优于模型并行化。分布式系统背景下的模型并行化挺有意思,有不少优势(例如扩展性),但在本文中我们主要讨论数据并行化。

  数据并行化

  数据并行化式的分布式训练在每个工作节点上都存储一个模型的备份,在各台机器上处理数据集的不同部分。数据并行化式训练方法需要组合各个工作节点的结果,并且在节点之间同步模型参数。文献中讨论了各种方法,各种方法之间的主要区别在于:

  参数平均法 vs. 更新式方法

  同步方法 vs. 异步方法

  中心化同步 vs. 分布式同步

  目前Deeplearning4j实现的方式是同步的参数平均法。

  参数平均

  参数平均是最简单的一种数据并行化。若采用参数平均法,训练的过程如下所示:

  基于模型的配置随机初始化网络模型参数

  将当前这组参数分发到各个工作节点

  在每个工作节点,用数据集的一部分数据进行训练

  将各个工作节点的参数的均值作为全局参数值

  若还有训练数据没有参与训练,则继续从第二步开始

  上述第二步到第四步的过程如下图所示。在图中,W表示神经网络模型的参数(权重值和偏置值)。下标表示参数的更新版本,需要在各个工作节点加以区分。

物联网

  事实上,很容易证明参数平均法的结果在数学意义上等同于用单个机器进行训练;每个工作节点处理的数据量是相等的。数学的证明过程如下。

  假设该集群有n个工作节点,每个节点处理m个样本,则总共是对nxm个样本求均值。如果我们在单台机器上处理所有nxm个样本,学习率设置为α,权重更新的方程为: