众所周知,在分布式计算系统中,由于多个计算节点计算进度不可能完全一致,会导致了在汇总结果时需要等待那些计算速度较慢的节点,即慢节点会拖慢整个计算任务的进度,浪费计算资源。
考虑到机器学习的特殊性,系统其实可以适当放宽同步限制,没有必要每一轮都等待所有的计算节点完成计算,部分跑得快的Worker,其实完全可以先把训练好的增量Push上去,然后进行下一轮的训练运行。这样可以减少等待时间,让整个计算任务更快。
因此,异步控制在分布式机器学习系统中,是非常重要的功能之一。Angel提供了三个级别的异步控制协议: BSP(Bulk Synchronous Parallel),SSP(Stalness Synchronous Parallel) 和 ASP(Asynchronous Parallel), 它们的同步限制依次放宽。为了追求更快的计算速度,算法可以选择更宽松的同步协议。
默认的同步协议。也是一般的分布式计算采用的同步协议,在每一轮迭代中都需要等待所有的Task计算完成。
允许一定程度的Task进度不一致,但这个不一致有一个上限,我们称之为 staleness 值,即最快的Task最多领先最慢的Task staleness 轮迭代。
angel.staleness=N
,其中N为正整数Task之间完全不用相互等待,先完成的Task,继续下一轮的训练。
angel.staleness=-1
设置方式非常简单,如上图所示,只要设置不同的staleness,就能以不同的异步模型运行。但是,同步限制放宽之后可能导致收敛质量下降甚至任务不收敛的情况,这需要在实际算法中,需要指标的变化情况,调整同步协议以及相关的参数,以达到收敛性和计算速度的平衡。
在Angel中,我们是通过向量时钟的方式,来实现异步模型控制。
对于用户来说,其实默认的调用方法很简单:
psModel.increment(update)
……
psModel.clock().get()
ctx.incIteration()
通过这样的方式,Angel实现了灵活多变的异步控制模式,为用户的算法,提供了最大化的便利,也解决了在大规模机器学习中,由于个别机器故障,引起严重的性能问题。