(12)发明专利申请
(10)申请公布号 CN 108280522 A(43)申请公布日 2018.07.13
(21)申请号 201810004566.X(22)申请日 2018.01.03
(71)申请人 北京大学
地址 100871 北京市海淀区颐和园路5号北
京大学(72)发明人 郑培凯 马超 倪焱 肖臻 (74)专利代理机构 北京君尚知识产权代理事务
所(普通合伙) 11200
代理人 司立彬(51)Int.Cl.
G06N 99/00(2010.01)G06F 8/20(2018.01)H04L 29/08(2006.01)
权利要求书2页 说明书6页 附图2页
(54)发明名称
一种插件式分布式机器学习计算框架及其数据处理方法
(57)摘要
本发明公开了一种插件式分布式机器学习计算框架及其数据处理方法。本发明包括一个主控制节点、多个服务器节点和多个工作节点;每个服务器节点存储机器学习模型的一部分参数,各服务器节点存储的参数组成该机器学习模型的全部待训练的参数;每一工作节点存储一部分训练数据,工作节点根据存储的训练数据从对应服务器获取相关的参数,然后计算参数的更新量后将参数更新量回传给对应服务器;每一工作节点中设置一核心实例进程和一参数代理进程;核心实例进程通过参数代理进程与服务器节点进行通信,核心实例进程和参数代理进程之间通过一个与编程语言无关的通道进行数据传输和同步。本发明易于将任意语言编写的单机机器学习程序扩展成分布式程序。
CN 108280522 ACN 108280522 A
权 利 要 求 书
1/2页
1.一种插件式分布式机器学习计算框架,其特征在于,包括一个主控制节点、多个服务器节点和多个工作节点;其中,每一工作节点分别与主控制节点、各服务器节点通信连接,各服务器节点分别与主控制节点通信连接;每个服务器节点存储机器学习模型的一部分参数,各服务器节点存储的参数组成该机器学习模型的全部待训练的参数;每一工作节点存储一部分训练数据,工作节点根据本地存储的训练数据从对应服务器获取相关的参数,然后计算所获取参数的更新量后将参数更新量回传给对应服务器;主控制节点记录服务器节点和工作节点的节点信息;每一所述工作节点中设置一核心实例进程和一参数代理进程;所述核心实例进程通过所述参数代理进程与所述服务器节点进行通信,所述核心实例进程和所述参数代理进程之间通过一个与编程语言无关的通道进行数据传输和同步。
2.如权利要求1所述的插件式分布式机器学习计算框架,其特征在于,所述核心实例进程通过所述通道向所述参数代理进程请求参数,所述参数代理进程查询缓存中是否有所请求的参数,如果有,则将对应的缓存数据通过所述通道返回给所述核心实例进程,如果没有缓存则向对应服务器节点请求相关参数返回给所述核心实例进程,然后所述核心实例进程根据返回的数据训练更新参数并将更新参数结果和下一轮需计算参数的参数请求发送给所述参数代理进程,所述参数代理进程检查该参数请求是否满足一致性的要求,如果满足返回该参数请求对应的参数,否则参数代理进程向服务器节点请求参数。
3.如权利要求2所述的插件式分布式机器学习计算框架,其特征在于,所述通道包括一数据通道和两个信号通道;其中,所述数据通道负责核心实例进程和参数代理进程之间的参数数据传输,所述信号通道负责对数据进行同步;所述核心实例进程将更新结果、当前迭代轮次以及请求参数的下标写入数据通道,参数代理进程从数据通道获取更新结果异步与服务器节点同步然后将核心实例进程请求的参数写入通道。
4.如权利要求3所述的插件式分布式机器学习计算框架,其特征在于,使用内存文件方式来实现所述通道;使用工作节点的基于内存文件系统作为数据通道,使用工作节点的命名通道FIFO作为信号通道。
5.如权利要求1所述的插件式分布式机器学习计算框架,其特征在于,所述参数代理进程将若干条单条数据打包成一组消息的形式发送给所述服务器节点;所述参数代理进程使用(start-key,value-list)的消息形式与所述服务器节点进行通信;其中,start-key为更新参数的起始下标,value-list为参数更新列表。
6.如权利要求1所述的插件式分布式机器学习计算框架,其特征在于,所述服务器节点使用连续的空间存储参数,空缺的参数用零替代。
7.如权利要求1所述的插件式分布式机器学习计算框架,其特征在于,所述主控制节点设有多种等级的容错机制;所述主控制节点根据不同的容错等级选择不同的容错机制。
8.一种基于权利要求1所述插件式分布式机器学习计算框架的数据处理方法,其步骤包括:
1)初始迭代时,主控制节点将机器学习模型的待训练参数划分到各服务器节点,各服务器节点存储的参数组成该机器学习模型的全部待训练参数;主控制节点将该机器学习模型的机器学习任务和训练数据划分到各工作节点上;工作节点从对应服务器获取相关的参数,然后工作节点利用本地存储的训练数据计算所获取参数的更新量后将参数更新量回传给对应服务器节点;服务器节点根据收到的参数更新量更新该服务器节点上的参数;
2
CN 108280522 A
权 利 要 求 书
2/2页
2)后续每一次迭代过程中,工作节点的核心实例进程通过通道向参数代理进程请求训练所需参数,所述参数代理进程查询缓存中是否有所请求的数据,如果有,则将对应的缓存数据通过所述通道返回给所述核心实例进程,如果没有缓存则向对应服务器节点请求相关参数返回给所述核心实例进程,然后所述核心实例进程训练更新参数并将更新参数结果和下一轮需计算参数的参数请求发送给所述参数代理进程,所述参数代理进程检查该参数请求是否满足一致性的要求,如果满足返回该参数请求对应的数据,否则等待参数代理进程向服务器节点获取相关参数数据。
9.如权利要求8所述的方法,其特征在于,所述通道包括一数据通道和两个信号通道;其中,所述数据通道负责核心实例进程和参数代理进程之间的数据传输,所述信号通道负责对数据进行同步;所述核心实例进程将更新结果、当前迭代轮次以及请求参数的下标写入数据通道,参数代理进程从数据通道获取更新结果异步与服务器节点同步然后将核心实例进程请求的参数写入通道。
3
CN 108280522 A
说 明 书
1/6页
一种插件式分布式机器学习计算框架及其数据处理方法
技术领域
[0001]本发明涉及一种机器学习计算框架及其数据处理方法,尤其涉及一种插件式分布式跨编程语言机器学习计算框架及其数据处理方法。
背景技术
[0002]机器学习已经成为了处理大数据的有效工具。机器学习过程中经常通过增加模型的参数提高模型的精度。然而由于单机的计算能力和内存的限制,分布式系统成为解决超大数据量机器学习问题的手段。
[0003]Hadoop和Spark这些数据流框架已经极大的简化了大规模数据处理。基于这些框架的分布式机器学习库在工业界和学术界广泛使用,但是大多数框架都采用迭代式MapReduce流程,使用任务同步和比较粗粒度的计算和通信。在面对大规模稀疏逻辑回归问题,大规模主题模型以及深度学习问题的时候,这些衍生框架是低效而且不准确的。目前参数服务器模式已经成为高效解决机器学习超大模型的方法。参数服务器模式中,工作节点用来分担计算任务,服务器节点维护全局的模型参数。相对于迭代的MapReduce模型,参数服务器可以异步地细粒度地进行计算和通信,可以最大化CPU的使用率,减少通信。[0004]实验证明前面所述的这些框架能够有效的解决分布式机器学习的应用。但是几乎所有的框架都要求使用该框架重写原有的代码。例如:一方面很多的开发者已经熟悉了原有的工具比如Matlab,R,Numpy等,对于这些人来说学习一个新的框架需要花费很长的周期。另一方面,很多专业的机器学习开发者更喜欢用效率高的C++和GPGPU,对于这些开发者来说Spark等工具都不合适。
发明内容
[0005]针对现有技术中存在的技术问题,本发明的目的在于提供一种插件式分布式跨编程语言机器学习计算框架及其数据处理方法。本发明开发了一个新的框架Brook,这个框架通过服务器节点技术让用户容易地将单机的代码转化成分布式的,并且创新性地提出了参数代理模块使得该框架兼容所有编程语言。本发明的目标是让用户能够很容易的把单机机器学习程序扩展成分布式程序,并且兼容所有的编程语言以及GPGPU,同时保证容错机制,还能比现有的框架高效。
[0006]本发明的技术方案为:
[0007]一种插件式分布式机器学习计算框架,其特征在于,包括一个主控制节点、多个服务器节点和多个工作节点;其中,每一工作节点分别与主控制节点、各服务器节点通信连接,各服务器节点分别与主控制节点通信连接;每个服务器节点存储机器学习模型的一部分参数,各服务器节点存储的参数组成该机器学习模型的全部待训练的参数;每一工作节点存储一部分训练数据,工作节点根据本地存储的训练数据从对应服务器获取相关的参数,然后计算所获取参数的更新量后将参数更新量回传给对应服务器;主控制节点记录服务器节点和工作节点的节点信息;每一所述工作节点中设置一核心实例进程和一参数代理
4
CN 108280522 A
说 明 书
2/6页
进程;所述核心实例进程通过所述参数代理进程与所述服务器节点进行通信,所述核心实例进程和所述参数代理进程之间通过一个与编程语言无关的通道进行数据传输和同步。[0008]进一步的,所述核心实例进程通过所述通道向所述参数代理进程请求参数,所述参数代理进程查询缓存中是否有所请求的参数,如果有,则将对应的缓存数据通过所述通道返回给所述核心实例进程,如果没有缓存则向对应服务器节点请求相关参数返回给所述核心实例进程,然后所述核心实例进程根据返回的数据训练更新参数并将更新参数结果和下一轮需计算参数的参数请求发送给所述参数代理进程,所述参数代理进程检查该参数请求是否满足一致性的要求,如果满足返回该参数请求对应的参数,否则参数代理进程向服务器节点请求参数。[0009]进一步的,所述通道包括一数据通道和两个信号通道;其中,所述数据通道负责核心实例进程和参数代理进程之间的参数数据传输,所述信号通道负责对数据进行同步;所述核心实例进程将更新结果、当前迭代轮次以及请求参数的下标写入数据通道,参数代理进程从数据通道获取更新结果异步与服务器节点同步然后将核心实例进程请求的参数写入通道。
[0010]进一步的,使用文件方式来实现所述通道;使用工作节点的基于内存文件系统作为数据通道,使用工作节点的命名通道FIFO作为信号通道。[0011]进一步的,所述参数代理进程将若干条单条数据打包成一组消息的形式发送给所述服务器节点;所述参数代理进程使用(start-key,value-list)的消息形式与所述服务器节点进行通信;其中,start-key为更新参数的起始下标,value-list为参数更新列表。[0012]进一步的,所述服务器节点使用连续的空间存储参数,空缺的参数用零替代。[0013]进一步的,所述主控制节点设有多种等级的容错机制;所述主控制节点根据不同的容错等级选择不同的容错机制。
[0014]一种插件式分布式机器学习计算框架的数据处理方法,其步骤包括:[0015]1)初始迭代时,主控制节点将机器学习模型的待训练参数划分到各服务器节点,各服务器节点存储的参数组成该机器学习模型的全部待训练参数;主控制节点将该机器学习模型的机器学习任务和训练数据划分到各工作节点上;工作节点从对应服务器获取相关的参数,然后工作节点利用本地存储的训练数据计算所获取参数的更新量后将参数更新量回传给对应服务器节点;服务器节点根据收到的参数更新量更新该服务器节点上的参数;[0016]2)后续每一次迭代过程中,工作节点的核心实例进程通过通道向参数代理进程请求训练所需参数,所述参数代理进程查询缓存中是否有所请求的数据,如果有,则将对应的缓存数据通过所述通道返回给所述核心实例进程,如果没有缓存则向对应服务器节点请求相关参数返回给所述核心实例进程,然后所述核心实例进程训练更新参数并将更新参数结果和下一轮需计算参数的参数请求发送给所述参数代理进程,所述参数代理进程检查该参数请求是否满足一致性的要求,如果满足返回该参数请求对应的数据,[0017]否则等待参数代理进程向服务器节点获取相关参数数据。[0018]进一步的,所述通道包括一数据通道和两个信号通道;其中,所述数据通道负责核心实例进程和参数代理进程之间的数据传输,所述信号通道负责对数据进行同步;所述核心实例进程将更新结果、当前迭代轮次以及请求参数的下标写入数据通道,参数代理进程从数据通道获取更新结果异步与服务器节点同步然后将核心实例进程请求的参数写入通
5
CN 108280522 A
说 明 书
3/6页
道。
[0019]
与现有技术相比,本发明的积极效果为:
[0020]本发明提供一个新的分布式机器学习系统-Brook。Brook采用服务器节点的设计,这样可以简化分布式计算任务。本发明系统添加了一个新的组件参数代理。通过把服务器节点上的参数映射到本地的内存中,参数代理可以使得底层的数据通信对上层服务透明。通过上面这种方法,brook系统提供了一套非常简单的跨平台的接口-RWW。用户可以通过增加几行简单的代码就可以把任何编程语言的单机程序转换成分布式执行的程序。为了提高系统的高效性和可扩展性,本发明最小化网络信息传输开销,最大化CPU计算能力和内存使用效率。
附图说明
[0021]图1是传统的服务器工作原理图;[0022]图2是本发明提出的系统原理图;其中,代理、通道和实例都在工作节点上运行。[0023]图3是本发明中数据和信号的传输流程图。
具体实施方式
[0024]为了便于本领域技术人员理解本发明的技术内容,下面结合附图对本发明内容进一步阐释。
[0025]本发明的Brook包括一个主控制节点和多个服务器节点、多个工作节点,其中工作节点只和服务器节点、主控制节点通信,各服务器节点分别与主控制节点通信连接,工作节点之间不通信。每个服务器节点存储机器学习模型的一部分参数,并且在训练的时候只负责更新这一部分参数,所有的服务器节点的参数组成整体的机器学习模型的待训练参数。工作节点存储一部分训练数据,先从服务器节点获取相关的参数,然后计算本地的参数更新量比如梯度,最后将参数更新量回传给服务器节点,完成一轮参数的更新。主控制节点记录服务器节点和工作节点的节点信息,其中包括服务器节点上参数的分配信息、机器学习任务的分配信息以及训练过程中工作节点的日志,所以brook可以高效的执行断点恢复。和现有的系统一样,主控制节点极少失败,所以没有做主控制节点的容错。[0026]在图2中,机器学习模型的机器学习任务被划分到所有的工作节点上,每个工作节点获得一批训练数据,然后从服务器节点获得与这批训练数据相关的模型参数,然后计算这些参数的本地更新。通过哈希算法,每个工作节点将本地更新分别上传给相应的服务器节点。服务器节点将收到的参数更新,具体更新方式可以看作加法模型:A(t+1)=A(t)+Δ(A(t)
,D),其中A(t)是第t轮参数的状态,D是输入数据,Δ(A(t),D)是通过服务器节点收到的第t轮的更新。。这系列的操作和原始的参数服务器类似。
[0027]Brook和参数服务器最大的区别是核心实例进程不直接与服务器节点进行通信,而是每个工作节点启动两个进程,其中一个进程为核心实例进程,另一个进程是参数代理进程。核心实例进程通过参数代理进程与服务器节点进行通信,其中核心实例进程和参数代理进程之间通过一个和编程语言无关的通道进行数据传输和同步。[0028]虽然机器学习算法有很多的形式,但是几乎所有的模型都是寻找一组参数使得这些参数能够最好的表达输入数据D。通常使用迭代算法来解决这类问题,大部分问题可以抽
6
CN 108280522 A
说 明 书
4/6页
象成加法模型:A(t+1)=A(t)+Δ(A(t),D),其中A(t)是第t轮参数的状态,D是输入数据,Δ(A(t),D)是通过机器学习方法计算出来的第t轮的更新。
[0029]本发明中数据和信号的传输流程如图3所示,通过机器学习中逻辑回归的例子来阐述各个组件的工作过程。首先主控制节点初始化整个机器学习任务,包括模型参数初始化、将训练数据划分为数据块、参数与服务器节点对应关系。接着进行循环迭代,在每次迭代过程中主控制节点分配任务到各个工作节点,工作节点的核心实例进程通过通道向参数代理进程请求参数,两者之间通过键值对传递参数,参数代理进程接收到参数请求之后如果已经缓存对应数据,则通过通道返回给核心实例进程,如果没有缓存则向对应服务器节点发送请求获取相应的数据给核心实例进程,然后核心实例进程根据收到的数据计算更新对应参数并将参数更新信息传递给参数代理进程同时将下一轮计算所需参数的参数请求也发送给参数代理进程,参数代理进程根据当前迭代次数检查该参数请求(参数请求中包括迭代次数信息)是否满足一致性的要求,如果满足返回该数据请求所需的参数数据,否则等待,直到服务器节点和参数代理进程同步参数的迭代次数并且满足之后再返回数据。[0030]下面对本发明涉及的组件的设计细节进行详细介绍。[0031]核心实例进程,核心实例进程是由开发者提供的单机的程序。最开始的程序可以是任何语言的,通过修改少量数据交换的代码就可以转换成核心实例进程(核心实例进程一般是由使用者提供)。核心实例进程的主要作用是从通道里面读出参数,计算本地更新然后把更新和请求写入通道。这些细节将在下面讨论,参数代理进程向核心实例进程提供了通信透明的参数更新接口,让核心实例进程看起来像是在和本地的服务器节点进行更新。这样可以容易地将单机程序转换成分布式程序。[0032]参数代理进程,参数代理进程是核心实例进程和服务器节点的中间层。通过参数代理层,brook可以简化核心实例进程中的逻辑。一些复杂的系统任务比如网络通信,消息队列,序列化都由参数代理进程完成。参数代理进程与核心实例进程之间通过通道进行同步数据交换,其中核心实例进程将本地更新和参数请求发送给参数代理进程,参数代理进程将当前缓存的参数请求结果发送给核心实例进程,如果实例进程请求的参数不在参数代理进程的缓存,则参数代理进程会向服务器节点请求相应的参数;参数代理与服务器节点之间通过网络连接进行异步参数更新,参数代理进程将从核心实例中获取的本地更新序列化并压缩之后发送给相应服务器节点,服务器节点接收到参数代理进程的消息,通过解压缩反序列化得到该参数更新,然后更新服务器节点上的参数。通过使用参数代理进程,核心实例进程只需要做核心的机器学习算法,使用任意的编程语言然后和参数代理进程进行数据交互就可以了。[0033]通道,通道由一个数据通道和信号通道组成,其中数据通道负责核心实例进程和参数代理进程之间的参数传输,信号通道负责对数据进行同步,即同步实例进程和参数代理进程之间的数据,参数代理进程之间的参数同步是通过服务器节点进行同步的,服务器节点将参数代理进程发送的更新合并,就完成同步;核心实例进程将本地更新、当前迭代轮次以及请求参数的下标写入数据通道,参数代理进程从数据通道获取本地更新异步与服务器节点同步然后将核心实例进程请求的参数写入通道。使用文件方式来实现通道,因为所有的语言都可以访问文件。同样,通道包括两类文件。对于数据通道,brook中使用基于内存文件系统ramfs(RAM file system),通过使用这个技术,提高了两个数量级的实验效果。考
7
CN 108280522 A
说 明 书
5/6页
虑到并发性,brook中使用工作节点的命名通道FIFO作为信号通道,写入的信息包括请求信号和同步信号(机器学习中当前迭代轮次作为同步信号,也就是时间戳),核心实例进程将请求信号写入一个命名通道,参数代理进程将数据返回信号写入另一个命名通道。[0034]相比于brook,有两类通常用于跨语言的机器学习框架。第一类是通过使用语言转换器封装原有的API。比如通过转换器python可以调用C++的boost或者SWIG库。相对于brook这种解决方案有明显的缺点。首先,编写语言转换器是比较困难的,甚至需要修改原有的框架。在开源社区中,sparkR在2016年才被发布出来(spark在2010年发布)。所以为每种语言提供一个转换器是不现实的。但是brook中的RWW接口是完全的跨语言的。除了开发的耗费,语言转换器通常会降低执行效率而且降低灵活性。[0035]第二类方法是Hadoop Streaming。这种方法在Java开发者中广泛使用,能发挥Hadoop的优势。但是,从hadoop派生出来的子系统并不适合机器学习任务。这类系统在编程模型和系统性能方面表现比较差。Hadoop Streaming通过标准IO传输数据,这样造成了很大的系统开销。然而在brook系统中,数据仅通过通道进行传递。从而降低了很多输入输出的系统开销。[0036]系统优化
[0037]由于需要考虑到通信的数据量以及计算负载等系统问题,实现一个高效的可扩展的分布式计算框架不是一件容易的事情。Brook中主要存在三个优化。[0038]消息压缩,因为分布式机器学习问题中需要很高的带宽,所以必须在参数代理进程和服务器节点之间进行消息压缩。Brook中使用了多种压缩技术,尽可能的减少信息传输。首先,尽量避免发送单条数据,因为TCP/IP包头和序列化都会造成很大的开销。所以将单个条目打包成一组消息的形式。其次,使用(start-key,value-list)的消息形式而不是key-value对的形式,其中,start-key为更新参数的起始下标,value-list为参数更新列表,value-list是一串连续的更新量。假如把所有的参数放到数组中,那么每个参数有一个下标,由于工作节点计算一次之后,不是所有的参数都被更新,所以在传输的时候只传输被更新的参数;原来的做法是传输(下标key,更新量value),但是对于连续的参数更新是低效的,因为要多传输很多key,所以本发明系统将连续的参数更新合并,改用(起始下标start-key,更新列表value-list)。这个优化可以极大的减少消息大小,尤其是在稠密的数据上。另外,由于很多机器学习算法会在不同的迭代的轮次中使用相同的数据,所以接收节点会缓存接收到的key列表。这样在使用相同的数据的时候,发送者只需要发送value的列表就可以了。最后,使用Snappy压缩库压缩序列化之后的消息。[0039]连续存储,很多之前的系统在执行的时候都是使用key-value对存储参数。但是使用这种方法不能充分的使用存储并且也会降低计算效率。在服务器上的操作主要是线性计算。因此在服务器节点使用连续的空间存储参数,空缺的参数用零替代。通过使用这个优化,brook系统可以节省近一半的空间并且可以通过多线程线性代数库(比如OpenBLAS)提升性能。这样做同时也简化了在服务器端用户自定义的更新机制。[0040]灵活的容错机制,在大规模的情景下,容错机制是非常重要的。然而,很多现存的系统只能支持一种容错策略。当这些系统部署在较小的并且较为稳定的集群上时经常会造成很多不必要的开销。Brook提供了多种等级的容错机制。容错等级从L0-L3覆盖了从小型平台比如台式机到实验室集群直到生产集群比如数据中心和云服务。Brook会根据不同的
8
CN 108280522 A
说 明 书
6/6页
容错等级选择不同的容错机制。
[0041]以上包含了本发明优选实施例的说明,这是为了详细说明本发明的技术特征,并不是想要将发明内容限制在实施例所描述的具体形式中,依据本发明内容主旨进行的其他修改和变型也受本专利保护。本发明内容的主旨是由权利要求书所界定,而非有实施例的具体描述所界定。
9
CN 108280522 A
说 明 书 附 图
1/2页
图1
图2
10
CN 108280522 A
说 明 书 附 图
图3
11
2/2页
因篇幅问题不能全部显示,请点此查看更多更全内容