Press "Enter" to skip to content

分布式机器学习

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

 

文章作者:杨强 等

 

内容来源:《联邦学习》

 

导读: 之前给大家介绍过很多联邦学习的内容。而 联邦学习和分布式机器学习 (  Distributed Machine Learning, DML ) 有许多共同之处,例如,二者都使用分散化的数据集和分布式的模型训练。 很多研究者也把联邦学习看作分布式机器学习的一种特殊形式,或者把联邦学习看成是分布式机器学习的下一步发展。 为了让读者更深入地了解联邦学习,我们将在本文介绍DML的概况,包括面向扩展性的DML。

 

DML包括许多方面,例如,训练数据的分布式存储、计算任务的分布式操作和模型服务的分布式部署等。关于DML,有大量的研究论文、着作以及章节内容,因此,我们不打算再次就这一问题提供一个全面的介绍或综述,这里将重点放在DML中与联邦学习关系紧密的方面。

 

01

 

分布式机器学习介绍

 

1. 分布式机器学习的定义

 

分布式机器学习也称为分布式学习,是指利用多个计算节点 ( 也称为工作者,Worker ) 进行机器学习或者深度学习的算法和系统,旨在提高性能、保护隐私,并可扩展至更大规模的训练数据和更大的模型。

 

 

分布式机器学习系统示例

 

如图所示,一个由三个工作者 ( 即计算节点 ) 和一个参数服务器组成的分布式机器学习系统,训练数据被分为不相交的数据分片 ( Shard ) 并被发送给各个工作者,工作者将在本地执行随机梯度下降 ( Stochastic Gradient Descent,SGD )。工作者将梯度 ∇W i 或者模型参数 W i 发送至参数服务器。参数服务器对收到的梯度或者模型参数进行聚合 ( 例如,计算加权平均 ),从而得到全局梯度 ∇W 或全局模型参数W 。同步或者异步的分布式SGD 算法都适用于分布式机器学习 。

 

通常来说,DML可以分为两类:面向扩展性的DML ( Scalability-Motivated DML ) 和面向隐私保护的DML ( Privacy-Motivated DML )。面向扩展性的DML是指用来解决不断增长的扩展性和计算需求问题的机器学习 ( Machine Learning,ML ) 系统。例如,在过去的数十年中,人们需要处理的ML和深度学习 ( Deep Learning,DL ) 的规模以指数级增长。使用大量训练数据训练一个复杂DL模型的需求,将轻易超过使用单一计算单元的传统ML范式的能力范围。一个很好的例子是着名的BERT模型,它的预训练需要使用多个张量处理单元 ( Tensor Processing Unit,TPU ) 且耗时数天。为了应对这种现状,快速发展的DML被认为是解决ML模型不断增长的规模和计算复杂度问题的一种可行解决方法。

 

当内存限制和算法复杂度是主要障碍时,面向扩展性的DML方法便为大规模ML提供了可行的解决方案。除了克服训练数据的集中存储需求,DML系统还能够使用更弹性化和更廉价的计算资源,例如增加计算单元的数量。云计算在这方面提供了很大帮助。在云计算平台上,能够根据需求随时获取更多的计算资源,如CPU和图形处理器 ( Graphics Processing Unit,GPU ),甚至TPU和内存资源。鉴于这种特性,面向扩展性的DML被广泛应用于具有横向划分数据集的场景中。其中,训练数据的子集存储在不同的计算单元实体中。

 

与面向扩展性的DML不同,面向隐私保护的DML的主要目的是保护用户隐私和数据安全。随着用户隐私和数据安全逐渐成为人工智能领域中的主要关注点,面向隐私保护的DML逐渐成了机器学习社区中的新趋势。在面向隐私保护的DML系统中,有多个参与方且每一方都拥有一些训练数据。因此,需要使用DML技术来利用每个参与方的训练数据,从而协同地训练机器学习模型。由不同参与方拥有的数据集可能具有不同的数据特征,所以实际中经常遇到的是训练数据的纵向划分。也就是说,面向隐私保护的DML适用于具有纵向划分数据集的场景,不同参与方各自持有的训练数据具有相同的训练样本ID和不同的数据特征。

 

2. 分布式机器学习平台

 

由于DML具有分布式与并行计算架构,我们需要专门的ML平台才能充分发挥 DML的优势。 现在有许多的商业和开源DML平台,下面介绍一些有代表性的框架。 使用最广的DML数据处理系统之一便是Apache Spark MLlib。 MLlib是 Apache Spark的扩展ML库,是一个基于内存的DML框架,并且使得ML系统易 于扩展和部署。 MLlib提供了传统ML ( 相对于DL而言 ) 算法的分布式实现,例如分类、回归和聚类等。 Apache DeepSpark提供了DL的分布式训练框架的实现。

 

基于图的并行处理算法是 DML最近一个比较新的方法,也称为DML环境下的图并行方法。 GraphLab平台提供了可扩展的ML工具包,并实现了一些基础算法如随机梯度下降和高性能梯度下降。 另一个图并行计算平台是Apache Spark GraphX,是Spark中的一个新组件,实现了Pregel-like的块同步消息传递,其中Pregel是来自谷歌的基于块同步处理模型的并行图计算库。

 

由微软发布的 DML工具包 ( Distributed ML Toolkit,DMTK ) 具有算法上和系统上的创新。 DMTK支持数据并行化的统一接口、大型模型存储的混合数据结构、大型模型训练的模型调度,以及实现高训练效率的自动化流水线。

 

DL需要在大量数据上训练具有众多参数的深度神经网络 ( DNN )。分布式计算和并行计算是一个能将现代硬件利用到极致的完美工具。对于分布式深度学习 (  Distributed Deep Learning, DDL ),除了Apache DeepSpark,其他着名的DL框架,例如TensorFlow和PyTorch,也都支持DNN的分布式训练和部署。

 

TensorFlow通过tf.distribute支持DNN的分布式训练,允许数据在不同进程上甚至不同服务器上进行计算,并且可以使用多处理器或者服务器,在数据集的不同分片上训练相同的模型。TensorFlow使大型模型分割到许多设备上成为可能,即如果模型过大,单一设备的内存容量已不足容纳,则可以将模型分割到多台设备上进行并行训练。此外,这也可以将计算分配给具有强大性能的GPU集群的服务器,并在拥有更多内存的服务器上进行其他计算。使用分布式TensorFlow,我们能够将分布式模型的训练规模扩展至数以百计的GPU中。通过并行地在许多GPU和服务器上进行模型训练,我们还能够将模型调试耗时 ( 如超参数调整 ) 大幅降低。

 

PyTorch中的分布式包 ( 即torch.distributed ) 让研究人员和使用者能够轻松地 将他们的DNN训练分布部署到集群上。与TensorFlow类似,分布式PyTorch允许一个模型依逻辑分割为若干部分 ( 即一些层在一个部分,另一些层在另一部分 ),然后置于不同的计算设备中。PyTorch利用消息传递技术,允许每个进程和其他进程 进行通信,与多进程包 ( 如 torch.multiprocessing ) 相反,进程能够使用不同的通信后端,且不必在同一台机器上执行。

 

02

 

面向扩展性的 DML

 

本节将对现有的面向扩展性的DML研究成果进行回顾。

 

1. 大规模机器学习

 

随着通信设备和传感设备的广泛出现,例如智能手机、掌上电脑、物联网传感器和无线相机,数据以各种各样的形式存在。在大数据时代,ML方法面临的主要问题已经从训练样本过小转移到了如何处理大规模的高维度数据集上。随着大趋势的变化,ML社区正面临着计算性能和耗时与数据规模不匹配的挑战,这使得从大规模的训练样本中耗费合理的计算代价和时间进行学习变得愈加不可能。在这里,我们总结了传统ML方法在处理大规模数据集和ML模型时所面临的主要挑战。

 

① 内存短缺

 

传统ML方法只在一块独立内存中对训练样本进行所有的操作。因此,如果训练样本的规模超过了单块内存的容量,将可能出现以下问题:训练模型可能不能收敛或者性能低下 ( 例如,低准确率和召回率 );在最糟糕的情况下,ML模型将因为内存短缺而不能被成功训练。

 

② 不合理的训练时间

 

ML算法中的一些优化过程可能不能匹配训练样本的规模,例如高斯混合模型 (  Gaussian Mixture Model,GMM ) 和多项式回归。 因此,当处理大规模训练样本时,在训练处理中耗费的时间可能过长。 在模型训练过程中,如果需要尝试多种不同的参数设置,ML模型的超参调校也将耗费大量时间。 因此,如果训练过程耗时过长,就会导致没有充足的时间试验较多的超参数,最终很难获得性能优越的模型。

 

DML算法是大规模ML的一部分,由于其具有将训练过程分配到若干计算节点和分布式计算的能力,近年来受到了广泛关注。最近在DML的研究成果使得在大数据上的ML任务变得更加可行、可扩展、更灵活和更有效。

 

2. 面向扩展性的DML方法

 

大量的研究工作着眼于提出有效的DML框架和算法,以处理大规模的数据集和DL模型。训练大规模的ML和DL模型是非常耗时的,训练周期从数小时甚至到数周不等。最近,很多研究工作正在致力于提升DML的能力上限,以减少处理大规模的ML和DL模型所需的训练时间。我们在这里回顾了一些着名的面向扩展性的DML方案,包括数据并行、模型并行、图并行、任务并行、混合并行和交叉并行。

 

① 数据并行

 

DML的第一种方法便是先将训练数据划分为多个子集 ( 也称为分片或者切片 ),然后将各子集置于多个计算实体中,之后并行地训练同一个模型。这种方法被称为数据并行 ( Data Parallelism ) 方法,也被称为以数据为中心的方法 ( Data-Centric Approach )。换言之,数据并行是指利用不同的计算设备,通过使用同一个模型的多个副本,对多个训练数据分块 ( 也称为分片或者切片 ) 进行处理,并定期通信交换最新的模型训练结果。这种方法能够很好地适配快速增长的训练数据规模。然而,由于模型的一个副本 ( 例如,一个完整的DNN ) 必须位于单一设备上,因此,这种方法不能用来处理具有高内存占用特性的DNN模型。

 

目前,主要有两种基于数据并行的分布式训练方法,即同步训练和异步训练。在同步训练中,所有的计算节点在训练数据的不同分片上同步地训练同一个模型的副本,在各计算节点每执行完一个模型更新步骤后,每个计算节点产生的梯度 ( 或者模型参数 ) 就会被发送给服务器,服务器在收到所有计算节点的结果后再进行聚合操作。而在异步训练中,所有计算节点独立地使用其本地的训练数据集来训练同一个模型的副本,并将本地获得的模型梯度及时地推送给服务器,以便服务器更新全局模型。同步训练一般由AllReduce架构支持,异步训练则通常由参数服务器架构实现。

 

数据并行能用于解决训练数据过大以至于不能存于单一计算节点中的问题,或者用于满足使用并行计算节点实现更快速的计算的要求。关于在分布式数据上训练DL模型,目前已有非常多的研究成果。例如分布式框架,包括谷歌的DistBelief (  DistBelief已经被合入TensorFlow ) 和Microsoft Project Adams,能够利用数据和模型并行,在数以千计的处理器上训练大规模模型。

 

② 模型并行

 

随着DNN模型变得越来越大,如BERT模型,我们可能会面临一个DNN模型不能加载到单一计算节点内存中的问题。对于这种情况,我们需要分割模型,并将各部分置于不同的计算节点中。这种方法被称为模型并行 ( Model Parallelism ) 方法,也叫作以模型为中心的方法 ( Model-Centric Approach )。模型并行指的是一个模型 ( 如DNN模型 ) 被分割为若干部分 ( 如DNN中的一些层在一个部分,另一些层在其他部分 ),然后将它们置于不同的计算节点中。尽管将各个部分置于不同计算设备中确实能够改善执行时间 ( 例如,使用数据的异步处理 ),但模型并行的主要目的是避免内存容量限制。拥有大量参数的模型由于对内存有很高的要求,所以不能放于单一计算设备中,但通过使用这种模型并行策略,内存容量限制也就不复存在了。例如,DNN模型的一个层可以被放入单一设备的内存中,且前向和后向传播意味着一台计算设备的输出以串行方式传输至另一台计算设备。只有当模型不能放入单一设备中,且不需要将训练过程加速很多时,才会采用模型并行方法。

 

在科研领域中,有许多种基于分布式训练的模型并行方法。一个有代表性的例子是AMPNet。AMPNet由多核CPU集群实现,具有与传统同部训练算法一样的准确度和迭代次数,但其所需的全局训练时间大大缩短。另一个例子是OptCNN,在卷积神经网络上使用了分层 ( Layer-Wise ) 并行技术。OptCNN允许CNN中的每一层使用各不相同的并行策略。分层并行 ( Layer-Wise Parallelism ) 通过提高训练吞吐量、降低通信成本和使用更大规模的GPU集群,在保持原始模型精度水平的前提下,达到了领先的性能水平。

 

科研人员在模型并行领域的研究成果已有很多,特别地,谷歌发布了Downpour SGD框架,提供了SGD的异步和分布式实现方法。Downpour SGD结合了数据并行和模型并行,将训练样本分置于不同的机器中,且每台机器都有整个或者部分DNN模型的单一副本。DeepSpark允许Caffe和TensorFlow的深度学习任务在Apache Spark机器集群上进行分布式深度学习训练。DeepSpark使得部署大规模并行分布式深度学习对用户来说变得简单和直观。

 

③ 图并行

 

随着基于图的ML方法的迅速发展,基于图的DML方法也在逐渐受到更多 关注。 图并行 (  Graph Parallelism ) 方法,也称为以图为中心的方法 ( Graph-Centric Approach ),是一种用于划分和分配训练数据和执行ML算法的新技术,其执行速度比基于数据并行的方法要快几个数量级。

 

GraphLab作为类似于MapReduce的一种抽象化优化方法发表。GraphLab在保证数据一致性的前提下,实现了稀疏计算依赖的异步迭代算法,拥有高度的并行性能。GraphLab能够在真实世界的大规模ML任务上达到优良的并行性能。

 

TUX2一种新型分布式图机器学习引擎。TUX2特别为DML进行了优化,以支持其异构性,包含一个传统的同步并行模型和一个新型MEGA ( Mini-batch、Exchange、GlobalSync和Apply ) 。TUX2提出了图计算和DML算法的收敛性,给出了一种有效地表达ML算法的图模型。随着图计算和DML技术的进一步发展,更多的ML和DL算法和优化能够在规模上更容易、更专业地表达和实现。

 

④ 任务并行

 

任务并行 ( Task Parallelism ) 也叫作以任务为中心的方法 ( Task-Centric Ap-proach ),指的是计算机程序在同一台或多台机器上的多个处理器上执行。它着力并行执行不同的操作以最大化利用处理器或内存等计算资源。任务并行的一个例子是一个应用程序创建多个线程进行并行处理,每个线程负责不同的操作。使用了任务并行的大数据计算框架有Apache Storm和Apache YARN。

 

将DML的任务并行和数据并行结合起来是很常见的。其中有一种是在MapReduce 的顶层为大规模ML结合任务并行和数据并行的系统化方法。该框架支持通过高层原语,以简单可行的方式说明任务并行和数据并行ML算法。由于MapReduce调度程序提供了全局调度,因此在MapReduce的顶层结合任务并行和数据并行方式,为其他基于MapReduce的系统共享集群资源开辟了道路。

 

⑤ 混合并行和交叉并行

 

在DML系统的实践中,我们经常需要结合不同类型的并行方法,从而形成混合并行 ( Hybrid Parallelism ) 的方案,例如使用了数据并行和任务并行的Apache YARN和SystemML。事实上,在实践中,将数据并行和模型并行结合起 来使用也是很常见的,例如谷歌的 Downpour SGD中提出的分布式深度学习 (  DDL ) 框架。 通过张量覆盖方法,将数据并行、模型并行和混合并行结合起来,提出了混合数据并行和模型并行的SOYBEAN系统,并能够实现自动并行。 混合并行的覆盖范围可以进一步扩展,形成更加灵活的交叉并行 ( Mixed Parallelism ),例如按层选择并行方式。 这种交叉并行方法有时适用于训练大规模DNN模型,例如对一些层使用数据并行,对另外一些层使用模型并行方法。

 

03

 

挑战与展望

 

本章简要介绍了DML,包括面向扩展性的DML 。面向扩展性的DML被广泛用于解决大规模机器学习问题中的计算资源和内存空间限制。并行技术 ( 例如数据并行、模型并行和混合并行 ) 是实现面向扩展性的DML系统的主要选择。

 

虽然DML在过去的几年中受到了广泛的关注,并且已经快速发展为开源和商业产品,但仍然存在现有DML系统无法解决的实际挑战。联邦学习是DML的一种特殊类型,它可以进一步解决传统DML系统面临的问题,如数据孤岛难题,并使我们能够构建面向隐私保护的人工智能系统和产品。

 

Be First to Comment

发表评论

电子邮件地址不会被公开。 必填项已用*标注