1.6 从训练并发角度看如何并行
接下来我们从训练并发角度对并行解决方案进行分析。我们从最常见的数据并行入手,目前已经把数据和计算进行了分发,虽然有多个实例在并行计算,但是仍存在以下几个难点。
• 机器学习有一个共享的需要不断被更新的中间状态——模型参数。为了保证在数学上与单卡训练等价,需要确保所有Worker的模型参数在迭代过程中始终保持一致。因为每个Worker在训练过程中会不断读写模型参数,这就要求对模型参数的访问进行一致性控制。
• 虽然我们可以通过对神经网络进行各种切分来实现分布式训练,但模型训练是一个整体任务,需要针对此切分加入一个聚集操作以恢复此整体任务,因此必须修改整个算法,让各个实例彼此配合。比如,模型并行会沿某个维度对张量进行切分,后续就需要一个组合操作来把多个分区合并为一;数据并行会把模型在多个节点上进行复制,后续就需要一个归约操作进行聚集;流水线并行会把张量进行流水线划分(Pipeline),后续就需要一个批处理操作(Batch)对多个张量进行聚集。
以数据并行为例,分布式环境中存在多个独立运行的训练代理实例,所有实例都有本地梯度,需要把集群中分散的梯度聚集起来(如累积求均值)得到一个全局聚集梯度,用此全局梯度更新模型权重,这可以分成几个问题:模型权重放在哪里?何时做梯度聚集?如何高效聚集?
针对这三个问题,深度学习的并行实现方案可以定义在三个轴上:参数分布(Parameter Distribution)、模型一致性(Model Consistency)和训练分布(Training Distribution)。这三个轴涉及的问题和难度具体如下。
• 模型权重放在哪里?这涉及参数分布和通信拓扑。
• 何时做梯度聚集?如何高效聚集?这涉及模型一致性和通信模式。
• 训练分布则把通信模式和通信拓扑交叉组合起来。
1.6.1 参数分布和通信拓扑
为了支持分布式数据并行训练,需要在参数存储区读写数据,此读写方式可以是中心化的(Centralized)或者去中心化的(Decentralized)。深度学习训练选择中心化还是去中心化的网络架构是一个系统性问题,取决于多种因素,包括网络拓扑、带宽、通信延迟、同步时间、参数更新频率、扩展性和容错性。架构选型对提高大规模机器学习系统的性能至关重要,目前主要有以下典型架构,如图1-7(梯度聚集架构)所示(见彩插)。
图1-7
图片来源:论文Communication-Efficient Distributed Deep Learning:A Comprehensive Survey
• 中心化网络架构:目前已经被主流的分布式机器学习系统广泛支持的参数服务器(Parameter Server)就是中心化网络架构,参数服务器模式把参与计算的机器划分为Server(服务器/在参数服务器架构之中为参数服务器)和Worker两种角色。Server和Worker之间通过push(用于累积梯度)和pull(用于取得聚集梯度)的数据交互方式进行通信,二者功能并不互斥,即同一个节点可以同时承担Server和Worker的职能。基于参数服务器的架构有很多优势,比如部署简单、弹性扩展好、鲁棒性强等。这种架构的问题在于,由于在一般情况下Worker的数量远多于Server,因此Server往往会成为网络瓶颈,需要结合具体项目来调整Server和Worker的数量,这样会给系统管理带来不便。
• 去中心化网络架构:
■ 为了避免参数服务器中出现通信瓶颈,人们倾向于使用没有中央服务器的All-Reduce架构来实现梯度聚集。这种方法只有Worker一种角色,所有Worker在没有中心节点的情况下进行通信。在通信之后,每个Worker获取其他Worker的所有梯度,然后更新此Worker的本地模型。因此,All-Reduce架构是去中心化通信拓扑,也是模型中心化拓扑(通过同步获得一致的全局模型)。这种体系结构不适合异步通信,却适合应用到SSP(Stale Synchronous Parallel)的同步部分。人们又提出了基于环的Ring All-Reduce,在这种模式下,节点以环形连接,每个节点只与其邻居节点进行通信,可以实现快速数据同步,而没有中心化通信瓶颈,每个节点的物理资源要求更低,扩展性较好,但系统鲁棒性差,一个节点损坏会导致整个系统无法工作。
■ Gossip架构是另一种去中心化的架构设计。Gossip架构不仅没有参数服务器,而且没有全局模型(由图1-7上不同颜色的局部模型表示)。在Gossip架构中,每个Worker在承担计算任务的同时也与它们的邻居Worker(也称为对等者)进行数据同步,进而提升通信效率。Gossip算法是一个最终一致性算法,对于所有Worker上的参数,Gossip算法无法保证在某个时刻的一致性,但可以确保在算法结束时的最终一致性。Gossip架构可以认为是参数服务器架构的一种特例,如果令参数服务器架构中的每个节点都同时承担Server和Worker角色,则参数服务器架构就可以转换为Gossip架构。Gossip架构消除了中心化的通信瓶颈,这样工作负载会更加均衡。
■ 去中心化网络的并行方式可以采用异步或者同步方式,收敛情况取决于网络连接状态,连接越紧密,收敛性越好。当网络处于强连接的时候,模型可以很快收敛,否则模型可能不收敛。
1.6.2 模型一致性和通信模式
无论是参数服务器还是All-Reduce架构,每个设备都有自己的模型本地副本。当每个设备拿到属于自己的数据后会通过前向/反向传播得到梯度,这些梯度都是根据本地数据计算出来的本地梯度,每个设备得到的本地梯度都不相同,而且由于网络、配置、软件等原因,每个设备的计算能力往往不尽相同,因此它们训练进度也各不相同。
在All-Reduce架构下,如果不同设备使用自己的本地梯度进行本地模型更新,则模型权重会各不相同,这将导致后续训练结果出现问题。如果是参数服务器,则每个设备需要把这些本地梯度传给服务器,服务器将综合这些梯度先将服务器上的全局模型进行更新再把模型分发给各个设备。
如果在训练过程中每个分布式计算设备都能获得最新模型参数,那么这种训练算法叫作模型一致性方法(Consistent Model Method)。如果放松同步的限制条件,则训练得到的是一个不一致的模型。
如何做到保持各个设备本地模型副本的一致性(Model Consistency)?比如各个设备之间如何做到梯度同步?用什么方式来控制设备的同步才能让训练收敛达到最优点?这涉及分布式机器学习的核心问题之一:梯度同步机制。如何设计同步机制对分布式训练的性能有很大影响,我们接下来就要看看集群内梯度更新方式(时机),即通信模式。
1.通信模式
通信模式分为异步通信和同步通信,与之对应的就是梯度更新的两种方式——同步更新和异步更新。
• 同步更新(Synchronous)。去中心化同步训练如图1-8所示,所有Worker都在同一时间点做梯度更新,或者说需要等待所有Worker结束当前迭代计算之后统一进行更新,其特点如下。
■ 收敛稳定,通信效率低,训练速度慢。
■ 要求设备的计算能力均衡,通信也要均衡,否则容易产生掉队者问题从而降低训练速度。
图1-8
图片来源:论文Pipe-SGD:A Decentralized Pipelined SGD Framework for Distributed Deep Net Training
■ 掉队者问题:节点的计算能力往往不尽相同,如果是同步通信,则对于每一轮迭代来说,计算快的节点需要停下来等待计算慢的节点,只有所有节点都完成计算才能进行下一轮迭代。这类似于木桶效应,一块短板会严重拖慢整体的训练进度,此块短板就叫作掉队者,所以同步训练相对速度会慢一些,如果集群有很多节点,则最慢的节点会拖慢总体性能。
• 异步更新(Asynchronous)。参数服务器异步训练如图1-9所示,某一个Worker计算完自己小批量的梯度就可以发起更新请求,当Server收到新梯度之后不需要等待其他Worker,而是立即对模型参数进行更新,其特点如下。
图1-9
图片来源:论文Pipe-SGD:A Decentralized Pipelined SGD Framework for Distributed Deep Net Training
■ 因为Worker之间不需要等待,所以整体训练速度更快。
■ 虽然通信效率高,但是收敛性不佳。
■ 容易陷入次优解:设备A计算完梯度之后,如果此时服务器上的参数已经被其他设备的梯度更新过,那么设备A的梯度就过期,因为A目前的梯度计算所依赖的模型参数是旧的,A就是使用旧模型参数生成的梯度去更新已经更新过的模型参数。这样,计算速度慢的节点提供的梯度就是过期的,错误的方向会导致整体梯度方向有偏差,这也被称为梯度失效问题(Stale Gradient)。
我们再看次优解问题。如图1-10所示(见彩插),假设有三个Worker,其中Worker 0和Worker 1以正常速度更新,经过三次更新之后,Server上的权重变成了“权重4”。Worker 2更新速度很慢,导致一直在使用“权重1”计算,当它更新的时候,其梯度是基于“权重1”计算出来的,这会导致Server上的“权重3”和“权重4”这两个更新操作在某种程度上失效,导致“权重5”和“权重2”类似,从而丢失了中间两次更新效果。
2.通信控制协议
了解了通信模式之后,我们再来看看如何控制通信。许多机器学习问题都可以转化为迭代任务。一般来说对于迭代控制有三个级别的通信控制协议:BSP(Bulk Synchronous Parallel)协议、SSP(Staleness Synchronous Parallel)协议和ASP(Asynchronous Parallel),其同步限制按照顺序依次放宽。三个协议具体如下。
图1-10
• BSP协议:BSP协议如图1-11所示,是一般分布式计算采用的同步协议,程序通过同步每个计算和通信阶段来确保一致性。BSP协议的特点如下。
图1-11
图片来源:论文Strategies and Principles of Distributed Machine Learning on Big Data
■ 每个Worker必须在同一个迭代任务中运行,只有当一个迭代任务中所有的Worker都完成了计算,系统才会进行一次Worker和Server之间的同步和分片更新。
■ BSP协议在模型收敛性上和单机串行完全相同,区别仅仅是批量大小增加了。因为每个Worker可以并行计算,所以系统也具备了并行能力。
■ BSP协议的优点是适用范围广,每一轮迭代收敛质量高。
■ BSP协议的缺点是在每一轮迭代中,BSP协议要求每个Worker都暂停以等待来自其他Worker的梯度,这就显著降低了硬件的整体效率,导致整个任务计算时间拉长,整个Worker组的性能由其中最慢的Worker决定。
• ASP协议:ASP协议如图1-12所示,考虑到机器学习的特殊性,系统可以放宽同步限制,不必等待所有Worker都完成计算。在ASP协议中,Worker之间既不用相互等待又不需要考虑顺序,每个Worker按照自己的节奏,跑完一个迭代就进行更新,先完成的Worker会开始进行下一轮迭代。ASP协议的优缺点如下。
图1-12
图片来源:论文Strategies and Principles of Distributed Machine Learning on Big Data
■ ASP协议的优点:消除了等待最慢Worker的时间,减少GPU空闲时间,与BSP协议相比,ASP协议提高了硬件效率,计算速度快,可以最大限度提高集群的计算能力。
■ ASP协议的缺点:可能导致模型权重被“依据过时权重计算出来的梯度”更新,从而降低统计效率;适用性差,在一些情况下并不能保证系统的收敛性。
• SSP协议:SSP协议如图1-13所示,允许同步过程中采用旧参数,即允许一定程度的Worker进度不一致,但此不一致有一个上限(就是旧参数究竟旧到什么程度由一个阈值限制),称为Staleness值,即最快的Worker领先最慢的Worker最多Staleness轮迭代。SSP协议的特点如下。
■ SSP协议将ASP协议和BSP协议做了折中,既然ASP协议允许不同Worker之间的迭代次数间隔任意大,而BSP则只允许迭代次数间隔为0,于是SSP协议把此迭代次数间隔取一个常数s,即最快的节点需要等待最慢节点直到更新轮数的差值小于s才能再次更新。
■ BSP协议和ASP协议可以通过SSP协议转换,比如BSP协议就可以通过指定s=0来转换,而ASP协议可以通过指定s=∞来转换。
■ SSP协议的优点:兼顾了迭代质量(算法效果)和迭代速度。与BSP协议相比在一定程度减少了Worker之间的等待时间,计算速度较快;与ASP协议相比在收敛性上有更好的保证。
■ SSP协议的缺点:SSP协议迭代的收敛质量不如BSP协议,往往需要更多轮次的迭代才能达到同样的收敛效果,其适用性也不如BSP协议。如果s变得太高(如当大量机器的计算速度减慢时)会导致收敛速度迅速恶化,在实际应用的时候需要针对Staleness进行精细调节。
图1-13
图片来源:论文Strategies and Principles of Distributed Machine Learning on Big Data
1.6.3 训练分布
通信模式和通信拓扑可以交叉使用,比如图1-14就是从模型一致性和中心化角度来区分深度学习训练的。
图1-14
图片来源:论文Demystifying Parallel and Distributed Deep Learning:An In-Depth Concurrency Analysis