3.2.2 分布式机器学习的并行模式
如今,对于机器学习来说,计算量太大、训练数据太多、模型规模太大,我们必须利用分布式方式来解决由此带来的问题。因此,针对如何划分训练数据、分配训练任务、调配计算资源、整合分布式的训练结果,以期达到训练速度和训练精度完美平衡的问题,分布式机器学习通过不同的并行模式,提供了不同的解决方案,其并行模式可以分为以下三种类型。
(1)并行计算。针对计算量过大的问题,可以采用基于共享内存(或虚拟内存)的多线程或多机并行运算来提高计算的效率。
(2)数据并行。针对数据量过大的问题,可以对数据进行划分,并将划分好的数据分配到不同的节点进行训练。
(3)模型并行。针对模型规模过大的问题,可以将模型的不同部分分配到不同的节点进行训练,比如神经网络的不同网络层。
在并行计算模式中,多个处理器被用于协同求解同一问题。所需求解的问题尽可能被分解成若干个独立的部分,各个部分在不同的处理器上同时被执行,最终求解出原问题,并将结果返回给用户。根据计算资源的差异,并行计算可以被分为多机并行计算和多线程并行计算。根据研究的角度不同,并行算法被分为数值计算或非数值计算的并行算法,同步的、异步的或分布式的并行算法,共享存储或分布式存储的并行算法,确定或随机的并行算法等。并行计算的出现有效地解决了复杂的大型计算问题,它利用非本地资源,节约了计算成本,克服了单个计算机上存在的存储器限制。但与此同时,并行计算也带来了线程安全、内存管理等诸多问题。
在数据并行模式中,每个被分配了数据的工作节点都会根据局部数据训练出一个子模型,按照一定的规律和其他工作节点进行通信(通信的内容主要是子模型参数或者参数更新),以保证最终可以有效地整合来自各个工作节点的训练结果并得到全局的机器学习模型。数据划分的方式主要从以下两个角度进行考虑:一是对训练数据进行划分,二是对每个特征维度进行划分。其中,对训练数据进行划分主要有基于随机采样法和基于置乱切分的方法。随机采样法在不同的计算节点上进行放回的随机采样,这样可以做到子训练集是独立且同分布的。置乱切分的方法将数据进行乱序排列,然后按照工作节点进行切割,在训练的过程中会定期对所有数据进行打乱。
在模型并行模式中,主要考虑模型的结构特点。对于线性模型,可以直接对不同的特征维度进行划分,与基于维度的数据划分相互配合。在对深层神经网络进行划分的时候,则要考虑模型的层次结构以及模型之间的依赖关系,并且还要考虑模型之间的数据通信。模型的层次划分分为逐层的横向划分和跨层的纵向划分。这两种划分方式各有利弊。逐层的横向划分使得各个子模型之间的接口清晰、实现简单,但是受到层数限制,并行度可能并不高,而且还有可能一层的计算量就已经很多,单机已经无法承担。跨层的纵向划分把一层划分在多机上,但这样通信的要求就会很高。除了上述的横向和纵向划分,也有学者研究了模型的随机划分方式,在每个工作节点上都会运行一个小的骨干网络,在各个工作节点上进行相互通信的时候,会随机传输一些非骨干网络的神经元参数,这样可以起到探索原网络的全局拓扑结构的作用。
与并行计算和数据并行两种模式相比,模型并行的模式更加复杂,各个节点之间的依赖关系更强。因为某些节点的输出数据可能是其他节点的输入数据,所以对通信的要求比较高。目前,最常见的并行模式仍为数据并行,在联邦学习中也以数据并行的模式为主,因此我们主要对数据并行的模型进行介绍。数据并行模式的分布式机器学习架构如图3-4所示。
图3-4 数据并行模式的分布式机器学习架构
接下来,我们用简单的线性回归算法来介绍分布式机器学习的原理。在线性回归中,我们将用来训练的样本集合记作X={xi},其中xi∈Rd(d表示特征的维度),并通过训练获得了模型f(x)=xTw。在训练过程中,使用梯度下降法对参数进行更新,其中损失函数及一阶梯度定义为
式中,。
当数据量(即n)和参数的数量(即w的维度)较大时,迭代过程的计算量就会很大,其中大部分的计算开销集中在梯度的计算,如果能够将梯度的计算并行化,就可以有效地提高训练过程的效率。通过观察可知,,因此可将g的计算切分为n个部分,由n个节点分别计算,在计算完成后再进行聚合,便可得到最终的梯度。当然,在实际应用中分配给每个节点的数据量会有多条,因此节点的个数与数据量的大小并不相同,在此仅使用该示例对数据并行的思想进行介绍。
另外,分布式机器学习的并行化除了带来了计算量的分摊效果,也带来了一些新的开销,包括通信开销和同步开销。另外,结果同步的方式包括同步算法和异步算法两种,本章只对分布式机器学习进行简单的介绍,在此不再对这些概念进行展开介绍。