[NeurIPS'12] Large Scale Distributed Deep Networks (DistBelief) 阅读笔记

#0. 摘要

近期在无监督特征学习和深度学习领域的研究表明, 能够训练大型模型可以显著提升性能. 本文考虑了使用数万个 CPU 核心训练具有数十亿参数的深度网络的问题. 我们开发了一个名为 DistBelief 的软件框架, 该框架能够利用包含数千台机器的计算集群来训练大型模型. 在该框架中, 我们开发了两种用于大规模分布式训练的算法:

  1. Downpour SGD, 一种支持大量模型副本的异步随机梯度下降过程
  2. Sandblaster, 一个支持多种分布式批量优化过程的框架, 包括 L-BFGS 的分布式实现.

Downpour SGD 和 Sandblaster L-BFGS 均提高了深度网络训练的规模和速度. 我们成功使用该系统训练了一个比文献中先前报道的大 30 倍的深度网络, 并在 ImageNet 上取得了最先进的性能, 这是一个包含 1600 万张图像和 21k 类别的视觉对象识别任务. 我们证明了这些相同的技术能够显著加速对商业语音识别服务所用规模较小的深度网络的训练. 尽管我们专注于并报告了这些方法在训练大型神经网络时的性能, 但底层算法适用于任何基于梯度的机器学习算法.

#1. 引言

深度学习和无监督特征学习在许多实际应用中已展现出巨大的潜力. 在语音识别, 视觉物体识别以及文本处理等多个领域, 已报道了最先进的性能.

人们还观察到, 增加深度学习的规模, 无论是增加训练样本数量, 模型参数数量, 还是两者同时增加, 都可以显著提高最终的分类精度. 这些结果导致了对用于这些模型的训练和推理算法的扩展产生了浓厚的兴趣, 以及对适用优化程序的改进. 近年来, 使用 GPU是一项重大进步, 使得中等规模的深度网络训练变得可行. GPU 方法的一个已知局限性是, 当模型不适合 GPU 内存时 (通常小于 6GB), 训练加速效果很小. 为了有效使用 GPU, 研究人员通常会减小数据或参数的大小, 以避免 CPU 到 GPU 的传输成为显著瓶颈. 虽然数据和参数的减小对于小问题 (例如语音识别的声学建模) 效果很好, 但对于具有大量样本和维度的复杂问题 (例如高分辨率图像), 这种方法就不那么吸引人了.

在本文中, 我们描述了一种替代方法: 利用大规模机器集群来分布式地执行深度网络的训练和推理. 我们开发了一个名为 DistBelief 的软件框架, 该框架能够在单台机器内部实现模型并行 (通过多线程), 以及跨多台机器实现模型并行 (通过消息传递), 其中并行性, 同步和通信的细节由框架管理. 除了支持模型并行, DistBelief 框架还支持数据并行, 其中使用多个模型副本来优化单个目标. 在该框架中, 我们设计和实现了两种用于大规模分布式训练的新方法:

  1. Downpour SGD, 一种异步随机梯度下降程序, 利用自适应学习率并支持大量模型副本
  2. Sandblaster L-BFGS, 一种使用数据和模型并行的 L-BFGS 分布式实现.

与更传统的 SGD 和 L-BFGS 实现相比, Downpour SGD 和 Sandblaster L-BFGS 都实现了显著的加速.

我们的实验揭示了关于大规模非凸优化的几个令人惊讶的结果. 首先, 异步 SGD 很少应用于非凸问题, 但在训练深度网络时表现非常好, 特别是与 Adagrad 自适应学习率结合使用时. 其次, 我们表明, 在资源充足的情况下, L-BFGS 与许多 SGD 变体相比具有竞争力或更快.

关于深度学习的具体应用, 我们报告了两个主要发现: 我们的分布式优化方法可以大大加速中等规模模型的训练, 并且还可以训练比以往可考虑的更大的模型. 为了说明第一个点, 我们展示了如何使用一组机器在不到 GPU 所需时间的 1/10 来训练一个中等规模的语音模型, 达到相同的分类精度. 为了说明第二个点, 我们训练了一个包含超过 10 亿参数的大神经网络, 并使用该网络在 ImageNet 数据集上大幅提高了最先进的性能, 这是计算机视觉中最大的数据集之一.

#2. 前期工作

近年来, 商业和学术机器学习数据集以前所未有的速度增长. 为此, 许多作者通过并行化和分布式方式探索了机器学习算法的扩展. 这些研究中的很大一部分集中在线性, 凸模型上, 其中分布式梯度计算是自然的第一步. 在这一领域内, 一些团队放宽了同步要求, 探索了凸问题的延迟梯度更新. 与此同时, 其他研究稀疏梯度 (即对于任何给定的训练样本, 梯度向量的坐标只有极小部分非零) 问题的团队探索了在共享内存架构 (即单机) 上的无锁异步随机梯度下降. 我们感兴趣的是一种能够兼顾两者的方法, 允许使用一组机器异步计算梯度, 但无需要求问题是凸的或稀疏的.

在深度学习的背景下, 大多数工作集中于在单台机器上训练相对较小的模型 (例如 Theano). 关于扩展深度学习的建议包括使用 GPU 农场来训练大量小模型的集合, 并随后对其预测进行平均, 或修改标准深度网络以使其本质上更具并行性. 我们的重点是扩展深度学习技术, 朝着训练具有数十亿参数的超大型模型的方向发展, 但不对模型的形态施加限制. 在某个层主导计算的特殊情况下, 一些作者考虑在该层中分布计算, 并在其余层中复制计算. 但在模型的多层计算密集的一般情况下, 需要类似于[22]的完整模型并行. 然而, 要取得成功, 我们相信模型并行必须与巧妙的分布式优化技术相结合, 这些技术利用数据并行性.

我们考虑了若干现有的用于解决我们问题的计算工具, 其中 MapReduce 和 GraphLab 是值得注意的例子. 我们得出结论, MapReduce 是为并行数据处理而设计的, 不适合深度网络训练中固有的迭代计算; 而 GraphLab 是为通用 (非结构化)图计算而设计的, 不会利用深度网络中通常存在的结构化图中的计算效率.

#3. 模型并行 (Model Parallelism)

为了促进超大型深度网络的训练, 我们开发了一个软件框架 DistBelief, 该框架支持神经网络和分层图形模型的分布式计算. 用户定义模型每层每个节点的计算过程以及计算的上行和下行阶段应传递的消息. 对于大型模型, 用户可以将模型划分到多台机器上 (图 1), 以便将不同节点的计算责任分配到不同的机器. 该框架使用所有可用的核心自动并行化每台机器上的计算, 并在训练和推理过程中管理机器间的通信, 同步和数据传输.

将深度网络分布到多台机器上的性能优势取决于模型的连接结构和计算需求. 参数数量较多或计算需求较高的模型通常能从更多的 CPU 和内存访问中获益, 直到通信成本成为主导因素. 我们在 DistBelief 框架中成功运行了包含高达 144 个分区的模型, 并实现了显著的加速, 而规模较小的模型在最多 8 个或 16 个分区的情况下也表现出不错的加速效果 (参见第 5 节, 标题为 “模型并行基准测试” 的实验结果). 显然, 具有局部连接结构的模型比全连接结构更易于进行广泛分布, 因为它们的通信需求较低. 速度提升不理想的主要原因是不同机器之间处理时间的差异, 导致许多机器需要等待速度最慢的机器完成计算的一定阶段. 然而, 对于我们最大的模型, 我们可以高效地使用 32 台机器, 每台机器实现 16 核的平均 CPU 利用率, 总计 512 个 CPU 核心来训练单个大型神经网络. 当与下一节中描述的分布式优化算法结合时, 这些算法利用整个神经网络的多个副本, 可以用于训练单个模型的上万 CPU 核心, 从而显著减少整体训练时间.

#4. 分布式优化算法

在 DistBelief 框架内并行化计算使我们能够实例化和运行比以往报告的规模大得多的神经网络. 但为了在合理的时间内训练此类大型模型, 我们不仅需要在模型的一个实例内部, 还要将训练分布到多个模型实例上. 在本节中, 我们描述了这种第二级的并行性, 我们采用一组 DistBelief 模型实例, 或副本, 来同时解决一个单一的优化问题.

我们比较了两种大规模分布式优化程序: Downpour SGD, 一种在线方法, 和 Sandblaster L-BFGS, 一种批量方法. 这两种方法都利用了集中式分片参数服务器的概念, 模型副本使用它来共享它们的参数. 这两种方法都利用了 DistBelief 在每个单独副本中允许的分布式计算. 但最重要的是, 这两种方法都被设计成能够容忍不同模型副本处理速度的差异, 甚至模型副本的整批失败, 这些副本可能会被离线或随机重启.

从某种意义上说, 这两种优化算法实现了数据并行性的一种智能版本. 这两种方法都允许我们在许多模型副本中的每一个同时处理不同的训练示例, 并定期结合它们的结果来优化我们的目标函数.

#4.1. Downpour SGD

随机梯度下降 (SGD) 或许是训练深度神经网络最常用的优化方法. 不幸的是, SGD 的传统形式化是固有的顺序性, 这使得它不适用于非常大的数据集, 因为在完全串行方式下遍历数据所需的时间是难以承受的.

为了将 SGD 应用于大数据集, 我们引入了 Downpour SGD, 这是一种异步随机梯度下降的变体, 它使用单个 DistBelief 模型的多个副本. 基本方法如下: 我们将训练数据划分为多个子集, 并在每个子集上运行模型的一个副本. 这些模型通过一个中央参数服务器进行通信, 该服务器保存模型所有参数的当前状态, 并跨多台机器分片 (例如, 如果我们有 10 个参数服务器分片, 每个分片负责存储和应用于模型参数的 1/10) (图 2). 这种方法在两个方面是异步的: 模型副本相互独立运行, 参数服务器分片也相互独立运行.

在 simplest 的实现中, 在处理每个 mini-batch 之前, 模型副本会向参数服务器服务请求其模型参数的更新副本. 由于 DistBelief 模型本身是跨多台机器分区的, 每台机器只需要与持有与其分区相关的模型参数的参数服务器分片进行通信. 在接收到其参数的更新副本后, DistBelief 模型副本处理一个 mini-batch 的数据以计算参数梯度, 并将梯度发送到参数服务器, 参数服务器随后将梯度应用于模型参数的当前值.

可以通过限制每个模型副本仅在每 nf 个 etch 步骤请求更新参数, 且仅在每 nsteps 步骤发送更新梯度值来减少 Downpour SGD 的通信开销 (其中 nm 可能不等于 n). 事实上, 获取参数, 梯度推送以及训练数据处理可以在仅弱同步的三个线程中执行 (参见附录中的伪代码). 在以下实验中, 我们为简单起见并便于与传统 SGD 进行比较, 固定 nf etch = n= 1.

Downpour SGD 比标准 (同步) SGD 更鲁棒于机器故障. 对于同步 SGD, 如果一台机器宕机, 整个训练过程将被延迟; 而对于异步 SGD, 如果模型副本中的一台机器宕机, 其他模型副本会继续处理其训练数据并通过参数服务器更新模型参数. 另一方面, Downpour SGD 中的多种异步处理形式在优化过程中引入了大量额外的随机性. 最明显的是, 模型副本几乎肯定会基于一组略微过时的参数来计算其梯度, 因为在此期间, 其他模型副本很可能已在参数服务器上更新了参数. 但除此之外, 还有其他几种随机性来源: 由于参数服务器分片独立工作, 无法保证在任何给定时刻参数服务器每个分片上的参数都经过了相同数量的更新, 或者更新是按相同的顺序应用的. 此外, 由于模型副本被允许在不同的线程中获取参数和推送梯度, 参数的时间戳可能存在额外的细微不一致性. 对于非凸问题, 这些操作的安全性缺乏理论基础, 但在实践中我们发现放宽一致性要求非常有效.

我们发现的能够显著提高 Downpour SGD 鲁棒性的技术之一是使用 Adagrad 自适应学习率方法. Adagrad 不是在参数服务器上使用单一固定的学习率 (图 2 中的η), 而是为每个参数使用独立的自适应学习率. 设η为第 i 个参数在迭代 K 时的学习率, ∆_{w_i, K} 为其梯度, 然后我们设置 TODO.

由于这些学习率仅根据每个参数的平方梯度之和计算得出, Adagrad 可以很容易地在每个参数服务器分片中本地实现. γ的值, 即所有学习率的常数缩放因子, 通常比不使用 Adagrad 时使用的最佳固定学习率要大 (可能大一个数量级). 使用 Adagrad 扩展了可以同时有效工作的模型副本的最大数量, 并且结合使用单个模型副本 “预热” 模型训练再释放其他副本的实践, 几乎消除了使用 Downpour SGD 训练深度网络时的稳定性问题 (参见第 5 节的结果).

#4.2. Sandblaster L-BFGS

批量方法已被证明在训练小型深度网络时效果良好. 为了将这些方法应用于大型模型和大型数据集, 我们引入了 Sandblaster 批量优化框架, 并讨论了使用该框架实现的 L-BFGS 方法.

Sandblaster 的一个关键思想是 分布式参数存储和操作. 优化算法的核心 (例如 L-BFGS) 位于协调器进程中 (图 2), 该进程无法直接访问模型参数. 相反, 协调器会发出来自一小组操作 (例如点积, 缩放, 系数相加, 乘法) 的命令, 这些操作可以被每个参数服务器分片独立执行, 并将结果存储在同一个分片中. 额外的信息 (例如 L-BFGS 的历史缓存) 也存储在计算它的参数服务器分片中. 这使得可以运行大型模型 (数十亿参数), 而无需承担将所有参数和梯度发送到单个中央服务器的开销 (参见附录中的伪代码).

在典型的 L-BFGS 并行化实现中, 数据被分发到多台机器上, 每台机器负责计算特定数据子集上的梯度. 梯度被发送回中央服务器 (或通过树形结构聚合). 许多此类方法等待速度最慢的机器, 因此无法很好地扩展到大型共享集群. 为了解决这个问题, 我们采用了以下负载均衡方案: 协调器为每个 N 个模型副本分配一小部分工作, 远小于批量总大小的 1/N, 并在副本空闲时分配新的部分. 通过这种方法, 速度更快的模型副本比速度较慢的副本承担更多的工作. 为了进一步管理批量结束时的速度较慢的模型副本, 协调器安排多个副本处理未完成的任务, 并使用第一个完成模型副本的结果. 该方案类似于 MapReduce 框架中使用的 “备份任务”. 数据预取, 以及通过分配连续数据来支持数据亲和性,

协调器安排多个副本处理未完成的任务, 并使用最先完成数据部分的模型副本结果, 将数据发送给同一工作节点, 使数据访问成为非问题. 与需要相对高频, 高带宽参数同步到参数服务器的 Downpour SGD 相比, Sandblaster 工作节点仅在每批数据的开始时 (由协调器更新后)获取参数, 并且每隔几个完成的任务部分才发送梯度 (以防止副本故障和重启).

#5. 实验

我们通过将优化算法应用于两个不同深度学习问题的训练模型来评估我们的优化算法: 静态图像中的目标识别和用于语音识别的声学处理.

语音识别任务是将短音频片段中的中心区域 (或帧) 分类为数千种声学状态之一. 我们使用了一个具有五层的深度网络: 四个具有 Sigmoid 激活函数的隐藏层, 每层有 2560 个节点, 以及一个具有 8192 个节点的 softmax 输出层. 输入表示是 11 个连续重叠的 25 毫秒语音帧, 每帧由 40 个对数能量值表示. 网络是逐层全连接的, 总共大约有 4200 万个模型参数. 我们在一个包含 11 亿个弱标签样本的数据集上训练, 并在一个保留的测试集上进行评估. 参见[27]了解类似的深度网络配置和训练过程.

在视觉物体识别方面, 我们在 ImageNet 数据集 (包含 1600 万张图像)上训练了一个具有局部连接感受野的大规模神经网络, 并将每张图像缩放为 100x100 像素. 该网络包含三个阶段, 每个阶段由滤波, 池化和局部对比度归一化组成, 其中滤波层中的每个节点都与下层的一个 10x10 图像块相连. 我们的基础设施允许多个节点连接到同一个输入图像块, 我们进行了实验, 改变了相同连接的节点数量, 从 8 到 36 不等. 输出层由 21001 个一对一逻辑分类器节点组成, 每个节点对应 ImageNet 中的一个物体类别. 有关类似的深度网络配置和训练过程, 请参见[29].

模型并行性基准测试: 为了探索 DistBelief 模型并行的扩展行为 (第 3 节), 我们测量了在单个模型实例中使用不同分区 (机器) 数量时, 对单个 mini-batch 进行简单 SGD 训练的平均处理时间. 在图 3 中, 我们通过报告平均训练加速比来量化跨 N 台机器并行化的影响: 使用单台机器所需时间与使用 N 台机器所需时间的比值. 这些模型中的推理步骤加速比相似, 此处未显示.

中等规模的语音模型在 8 台机器上运行速度最快, 比单台机器计算速度快 2.2 倍 (模型配置为每台机器最多使用 20 个核心). 在超过 8 台机器上分区运行模型实际上会减慢训练, 因为网络开销在完全连接的网络结构中开始占主导地位, 并且随着分区增多, 每台机器的工作量减少.

相比之下, 规模更大且本地连接的图像模型可以从每个模型副本使用更多机器中获益. 参数量最大的模型 (1.7 亿个参数) 获益最大, 使用 81 台机器时, 速度提升超过 12 倍. 对于这些大型模型, 使用更多机器可以继续提高速度, 但收益递减.

优化方法比较: 为了评估所提出的分布式优化程序, 我们以多种配置运行了上述语音模型. 我们考虑两种基准优化程序: 使用传统 (单副本)SGD 在 8 个分区上训练 DistBelief 模型, 以及使用 CUDA 在 GPU 上训练相同模型. 我们与这些基准方法进行比较的三种分布式优化方法是: 固定学习率的 Downpour SGD, Adagrad 学习率的 Downpour SGD 以及 Sandblaster L-BFGS.

图 4 展示了这些方法在训练集和测试集上, 分类性能随训练时间的变化情况. 我们的目标是在最短的训练时间内获得最大的测试集准确率, 而不管资源需求如何. 传统的单副本 SGD (黑色曲线)训练速度最慢. 带有 20 个模型副本的 Downpour SGD (蓝色曲线)显示出显著改进. 带有 20 个副本和 Adagrad 的 Downpour SGD (橙色曲线)速度稍快. 使用 2000 个模型副本的 Sandblaster L-BFGS (绿色曲线)则更快得多. 然而, 最快的是带有 200 个模型副本的 Downpour SGD 加 Adagrad (红色曲线). 如果能够获得充足的 CPU 资源, Sandblaster L-BFGS 和带有 Adagrad 的 Downpour SGD 训练模型的速度将显著快于高性能 GPU.

尽管我们没有将上述实验限制在固定的资源预算内, 但考虑各种方法如何在性能和资源消耗之间进行权衡是很有趣的. 我们通过任意选择一个固定的测试集准确率 (16%), 并测量每种方法达到该准确率所需的时间, 以机器数量和使用的 CPU 核心数为函数进行分析, 如图 5 所示. 每条轨迹上的四个点中, 有一个点对应于图 4 中所示的训练配置, 其余三个点是其他配置.

在这个图中, 越靠近原点的点越好, 因为它们在消耗更少资源的同时花费了更少的时间. 在这方面, 使用 Adagrad 的 Downpour SGD 似乎是最佳权衡: 对于任何固定的机器或核心预算, 使用 Adagrad 的 Downpour SGD 比使用固定学习率的 Downpour SGD 或 Sandblaster L-BFGS 更快地达到准确率目标. 对于任何分配的训练时间来达到准确率目标, 使用 Adagrad 的 Downpour SGD 使用的资源更少, 而且在许多情况下, 使用固定学习率的 Downpour SGD 甚至无法在截止日期前达到目标. Sandblaster L-BFGS 系统在方面确实显示出前景.

与固定学习率的 Downpour SGD 或 Sandblaster L-BFGS 相比, 带有 Adagrad 的 Downpour SGD 达到准确率目标所需时间更短.

由于其在增加核心数量时的扩展性, 这表明如果使用极其庞大的资源预算 (例如 30k 个核心), 它最终可能产生最快的训练时间.

应用于 ImageNet: 之前的实验表明, 我们的技术能够加速具有数百万参数的神经网络的训练. 然而, 我们基于集群的分布式优化方法更显著的优势在于其能够扩展到远超单台机器舒适容量的大型模型, 更不用说单块 GPU 了. 作为探索超大型神经网络能力的第一步, 我们使用 Downpour SGD 在 ImageNet 目标分类任务上训练了上述 1.7 亿参数的图像模型. 如[29]中详细所述, 该网络实现了超过 15%的交叉验证分类准确率, 相较于我们所知的 21k 类别 ImageNet 分类任务的最佳性能, 相对提升了 60%.

#6. 结论

在本文中, 我们介绍了 DistBelief, 一个用于深度网络并行分布式训练的框架. 在该框架内, 我们发现了多种有效的分布式优化策略. 我们发现, Downpour SGD 作为 SGD 的一种高度异步变体, 在训练非凸深度学习模型方面表现异常出色. Sandblaster L-BFGS 作为 L-BFGS 的分布式实现, 可以与 SGD 相媲美, 其更高效的网络带宽利用使其能够扩展到更多并发核心来训练单个模型. 综上所述, 当计算预算不超过 2000 个 CPU 核心时, Downpour SGD 与 Adagrad 自适应学习率过程的组合成为明显占优的方法.

Adagrad 原本并非设计用于与异步 SGD 一起使用, 而且这两种方法通常也不应用于非凸问题. 因此, 它们能如此出色地协同工作, 并在高度非线性的深度网络中表现良好, 这令人惊讶. 我们推测, Adagrad 在面对大量异步更新时能自动稳定波动参数, 并自然地根据深度网络中不同层的需求调整学习率.

我们的实验表明, 我们新的大规模训练方法可以利用一组机器显著快于 GPU 地训练规模适中的深度网络, 并且不受 GPU 对模型最大规模的限制. 为了展示能够训练更大模型的价值, 我们已经训练了一个超过 10 亿参数的模型, 在 ImageNet 目标识别挑战中取得了优于当前最佳性能的结果.