• 异步控制(Sync Controller)
    • 概述
    • 协议介绍
      • 1. BSP
      • 2. SSP
      • 3. ASP
    • 实现原理——向量时钟
      • 步骤如下:

    异步控制(Sync Controller)


    概述

    众所周知,在分布式计算系统中,由于多个计算节点计算进度不可能完全一致,会导致了在汇总结果时需要等待那些计算速度较慢的节点,即慢节点会拖慢整个计算任务的进度,浪费计算资源。

    考虑到机器学习的特殊性,系统其实可以适当放宽同步限制,没有必要每一轮都等待所有的计算节点完成计算,部分跑得快的Worker,其实完全可以先把训练好的增量Push上去,然后进行下一轮的训练运行。这样可以减少等待时间,让整个计算任务更快。

    因此,异步控制在分布式机器学习系统中,是非常重要的功能之一。Angel提供了三个级别的异步控制协议: BSP(Bulk Synchronous Parallel)SSP(Stalness Synchronous Parallel)ASP(Asynchronous Parallel), 它们的同步限制依次放宽。为了追求更快的计算速度,算法可以选择更宽松的同步协议。

    异步控制(syncController) - 图1

    协议介绍

    1. BSP

    默认的同步协议。也是一般的分布式计算采用的同步协议,在每一轮迭代中都需要等待所有的Task计算完成。

    • 优点:适用范围广;每一轮迭代收敛质量高
    • 缺点:但是每一轮迭代都需要等待最慢的Task,整体任务计算时间长
    • 使用方式:默认的同步协议

    2. SSP

    允许一定程度的Task进度不一致,但这个不一致有一个上限,我们称之为 staleness 值,即最快的Task最多领先最慢的Task staleness 轮迭代。

    • 优点:一定程度减少了Task之间的等待时间,计算速度较快
    • 缺点:每一轮迭代的收敛质量不如BSP,达到同样的收敛效果可能需要更多轮的迭代;适用性也不如BSP,部分算法不适用
    • 使用方式:配置参数angel.staleness=N,其中N为正整数

    3. ASP

    Task之间完全不用相互等待,先完成的Task,继续下一轮的训练。

    • 优点:消除了等待慢Task的时间,计算速度快
    • 缺点:适用性差,在一些情况下并不能保证收敛性
    • 使用方式:配置参数angel.staleness=-1

    设置方式非常简单,如上图所示,只要设置不同的staleness,就能以不同的异步模型运行。但是,同步限制放宽之后可能导致收敛质量下降甚至任务不收敛的情况,这需要在实际算法中,需要指标的变化情况,调整同步协议以及相关的参数,以达到收敛性和计算速度的平衡。

    实现原理——向量时钟

    在Angel中,我们是通过向量时钟的方式,来实现异步模型控制。

    异步控制(syncController) - 图2

    步骤如下:

    1. 在Server端为每个分区维护一个向量时钟,记录每个worker在该分区的时钟信息
    2. 在Worker端维护一个后台同步线程,用于同步所有分区的时钟信息
    3. Task在对PSModel进行Get或其他读取操作时,根据本地时钟信息和staleness进行判断,选择是否进行等待操作
    4. 每次迭代完,算法调用PSModel的Clock方法,更新向量时钟

    对于用户来说,其实默认的调用方法很简单:

    1. psModel.increment(update)
    2. ……
    3. psModel.clock().get()
    4. ctx.incIteration()

    通过这样的方式,Angel实现了灵活多变的异步控制模式,为用户的算法,提供了最大化的便利,也解决了在大规模机器学习中,由于个别机器故障,引起严重的性能问题。