&3_分布式机器学习框架

分布式机器学习基本流程

使用分布式机器学习,有三种情形:

  1. 计算量太大:可采用基于共享内存(或虚拟内存)的多线程或多机并行运算。
  2. 训练数据太多:需要将数据进行划分,并分配到多个工作节点上进行训练,这样每个工作节点的局部数据都在容限之内。每个工作节点会根据局部数据训练出一个子模型,并且会按照一定的规律和其他工作节点进行通信(通信的内容主要是子模型参数或者参数更新),以保证最终可以有效整合来自各个工作节点的训练结果并得到全局的机器学习模型。
  3. 模型规模太大:需要对模型进行划分,并分配到不同的工作节点上进行训练。模型并行的框架下各个子模型之间的依赖关系非常强,因为某个子模型的输出可能是另外一个子模型的输入,如果不进行中间计算结果的通信,则无法完成整个模型训练。因此,模型并行对通信的要求较高。

这三种分布式机器学习的情形在实际中是掺杂在一起发生的。

数据与模型划分模块

拥有当量训练数据或大规模机器学习模型,无法由单机完成存储和计算,需要将数据或模型进行划分并将其分配到各个工作节点。

数据划分

两个操作角度:
对训练样本进行划分
对每个训练样本的特征维度进行划分

随机采样(样本划分)

把原训训练集作为采样的数据源,通过有放回的方式进行随机采样,然后按照每个工作节点的容量为其分配相应数目的训练样本。
优点:保证每台机器上的局部训练数据与原训练数据是独立同分布的,因此在训练效果上有理论保证;
缺点:训练数据量大时,全局采样代价较高;通过采样方式会使低频的训练样本难以被选到,训练样本无法得到充分利用。

置乱切分(样本划分)

将训练数据进行乱序排列,然后按照工作节点的个数将打乱后的数据顺序划分成相应的小份,将这些小份数据分配到各个工作节点上。
每个工作节点训练时只使用自己分配到的数据,并定期将这些数据再打乱;到一定阶段,全局数据进行打乱并重新分配。
优点:让各个工作节点上的训练样本更加独立并具有更加一致的分布,以满足机器学习算法对训练数据独立同分布的假设。
缺点:定期进行了局部和全局的乱序操作,不一定完全满足独立同分布的条件,数据打乱等价或者接近于无放回的随机采样,而独立同分布的假设则暗示着有放回的随机采样。

特征维度划分

假设训练数据是以d维向量的方式给出的(每一维对应一种对输入样本刻画的特征),将这d维特征顺序切分成K份,然后把每份特征对应的子数据集分配到K个工作节点上。
维度划分需要与特定的优化方法(如坐标下降法)配合使用,否则如果优化算法需要同时利用分配到不同工作节点的多个维度,就会带来很大的通信代价,可能得不偿失。

模型划分

常见做法是将机器学习模型切分成若干子模块(一部分模型参数对应于一个子模型),然后把子模型放在一个工作节点上进行计算。
不同的子模型之间会有一定的依赖关系(一个模型的输出是一个模型的输入)。
子模型之间的依赖关系可以从机器学习模型对应的计算图上得到很好的反映。
各个工作节点需要等待其输入所依赖的其他子模型计算完毕后,才能开展自己的计算。
不同的子模型划分方法会影响各个工作节点之间的依赖关系通信强度,好的划分可以降低通信强度,提高并行计算的加速比。

单机优化模块

完成数据划分或模型划分后,每个工作节点只需要根据分配给自己的局部训练数据和子模型来进行训练。

意味着:除去各工作节点之间相互的通信外,每个节点自身基本就是一个传统的单机机器学习任务:根据属于自己的训练数据,计算经验风险(所有训练样本上的损失函数之和),然后利用某种优化算法(如梯度下降)通过最小化经验风险来学习模型的参数。

通信模块

当单机优化模块利用局部数据求得本地模型的更新以后,就会涉及多机、多线程协作的问题(信息共享即通信,才能把各个工作节点有机组合在一起)。

通信的内容

在数据并行框架下:每个工作节点学到基于数据的子模型。因此需要把子模型或子模型的更新(梯度)作为通信内容。并行度可以通过调节本地学习的轮数来控制。
在模型并行框架下:各个工作节点之间有着很强依存关系。需要按照机器学习模型对应的数据流,把每个子模型完成自身设计所需要的数据通过网络传输过去即可。此类方法在算法逻辑上等价于把多个工作节点虚拟化维一个巨大的工作节点,模型划分越细,跨节点交互也越多,通信代价越高。因此在实战中需要考虑对传输的信息进行压缩。

通信的拓扑结构

拓扑结构——哪些工作节点之间需要进行通信。
有一下几种主流的通信拓扑结构:

基于迭代式MapReduce/AllReduce的通信拓扑

迭代式MapReduce源于大数据处理的MapReduce方法,Map操作完成数据分发和并行处理,Reduce操作完成数据的全局同步和聚合。

基于参数服务器的通信拓扑

参数服务器(parameter server)的架构把工作节点和模型存储节点在逻辑上区分开,因此可以更加灵活地支持各种不同的通信模式。各个工作节点负责处理本地的训练数据,通过参数服务器的客户端API与参数服务通信,从而从参数服务器获取最新的模型参数,或将本地训练产生的模型更新发送到参数服务器上。

基于数据流的通信拓扑

基于模型并行时,需要把不同子模型的更新放置在不同的工作节点上。
在数据流系统中,计算被描述成为一个有向无环图。图中每个节点进行数据处理或者计算,图中的每条边代表数据的流动。
当两个节点位于两台不同机器上,它们之间会进行通信。
经典数据流系统,每个节点有两个通信通道:
控制消息流(决定工作节点应该接受什么数据,接收的数据是否完整,集资所要做的计算是否完成,是否可以让下游节点继续计算)
计算数据流(负责接收模型训练时所需要的数据、模型参数,经过工作节点内部计算单元,产生输出数据提供给下游节点)

通信的步调

  1. 同步的通信方式:每个工作节点要等地啊收齐来自其他所有工作节点的模型更新后,才继续集资的本地模型训练。
  2. 异步的通信方式:各个工作节点不相互等待,而是通过一定的机制把本地模型训练和与其他节点的通信隔离开来。

同步通信的缺点

  1. 当各个工作节点的计算性能显著不同时,全局的计算速度会被比较慢的节点拖累;
  2. 有些工作节点不能正常工作时(系统死机),整个集群的计算将无法完成,导致最终分布式学习任务失败

异步通信特点

每个工作节点完成一定量本地训练后,将自己阶段性训练结果推送到参数服务器上,随机立刻进行本地的模型训练(在需要时,会从服务器上拿回最新的全局模型,作为本地寻来呢起点)。
参数服务器在逻辑上隔离了各个工作节点,使得即便个别工作节点速度慢或故障也不会对整体学习过程产生太大影响。

异步通信分为:有锁无锁
有锁:当各个节点把局部信息写入全局模型时,会通过加锁来保证数据写入的完整性,但可能会限制系统在参数更新方面的吞吐量;
无锁:局部信息写入全局模型时,不保证数据完整性,以换取更高的吞吐量。

通信的频率

直观上,通信越频繁,各个工作节点相互协调越好,训练效果应该越有保障;
然而另一面,通信的代价会更高,可能拖累整体训练的速度。

数据与模型聚合模块

无论是采用哪种通信的拓扑结构,总会涉及如何将来自不同工作节点的数据、模型(或其更新)进行聚合的问题。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值