PARACEL:让分布式机器学习变得简单

标签: 技术和产品 产品与技术 算法 机器学习 | 发表时间:2015-03-30 08:57 | 作者:豆瓣
出处:http://blog.douban.com

在豆瓣,我们常通过机器学习的方式从各种数据中训练出模型,利用这些模型帮助我们理解用户并为大家挖掘出有价值的内容:豆瓣FM的个性化歌曲推荐、书影音的喜欢也喜欢、首页的豆瓣猜等等。

早期的时候,单机训练的程序基本就能满足需求。一方面数据量不大,另一方面有的模型算一次可以用很长时间,对性能要求就没有那么高。不过很快,随着豆瓣的壮大,我们有了分布式计算的需求。当时Spark还没有Python接口,豆瓣基于Spark的思路开发了 Dpark系统。Dpark非常成功,一下子把我们能解决问题的规模扩大了不少。

Dpark的出现解决了豆瓣大部分的数据需求和一部分机器学习模型的训练需求。然而,对于那些对性能要求较高的模型,Python并不能达到预期。同时,mapreduce的计算模式对于机器学习算法来说不够灵活。因此,对于较为复杂的模型的并行训练,我们仍然采用C++加MPI这样较为费时费力的方式来开发。

2013年初,我们从Jeff Dean发表在NIPS12上的论文《Large Scale Distributed Deep Networks》中了解到Google公司用来做深度学习的训练框架DistBelief。DistBelief将巨大的深度学习模型分布存储在全局的参数服务器中,计算节点通过参数服务器进行信息传递,很好地解决了随机梯度下降和L-BFGS算法的分布式训练问题。豆瓣当时并没有做深度学习的需求,但我们意识到机器学习问题可以转化成优化问题,而解优化问题的众多方法和随机梯度下降的过程是类似的:选定初始值,按某种方向,迭代直到收敛。

为了提高分布式算法的开发效率和增强代码被复用的能力,我们决定抽象出一个比mapreduce更适合机器学习模型训练的范式做成框架。Paracel项目就是在这样的背景下产生的,自从2014年3月在豆瓣内部发布最初版本至今已一年时间,我们决定将它开源。

Paracel是一个基于参数服务器通信模型的分布式训练框架。参数服务器可以被理解成一个全局分布式的key-value存储,用来存储待训练的模型。同时,参数服务器还能通过用户定义的update函数进行分布式计算,这时它与mapreduce系统中的reducer很类似。随着数据量的增长和模型的越来越复杂,单机的内存已经装载不下许多模型的参数了。Paracel不仅支持数据并行剖分,同时支持模型的并行剖分。开发者可以将训练数据划分到各个计算节点,并将对应的模型在参数服务器端进行划分,使得算法在计算性能和内存使用上都做到可扩展。

Paracel提供了简单又通用的通信接口,计算节点可以向参数服务器读取、写入、更新模型。在更新操作时,用户可以自定义的update函数。与琐碎的MPI通信方式相比,计算节点并不需要知道参数存放的具体信息,而是通过统一的接口与参数服务器进行交互,简化了开发的复杂度。值得强调的一点是,基于Paracel来开发分布式机器学习算法非常地直观,对于开发者而言,在Paracel中实现一个分布式机器学习算法和实现一个串行算法并没有太大区别。事实上,在开发Paracel中算法库的过程中,我们通常也是先实现一个单机的版本,然后在其基础上加少量的代码完成并行化的。

Paracel解决的另一问题是straggler问题:由于一些软硬件的原因,节点的计算能力往往不尽相同。对于迭代问题来说,每一轮结束时算得快的节点都需等待算得慢的节点算完,再进行下一轮迭代。这种等待在节点数增多时将变得尤为明显,从而拖慢整体的性能。Paracel放宽了“每个迭代步都等待”这个约束:当在一轮迭代结束时,算得快的节点可以继续下一轮迭代,但不能比最慢的节点领先参数s个迭代步。当领先超过s个迭代步,Paracel才会强制进行等待。这样异步的控制方式既从整体上省去了等待时间,也能间接地帮助慢的节点赶上。从优化问题的角度来看,虽然单迭代步收敛得慢了,然而每个迭代步的时间开销变少了,总体上收敛也就变快了。

此外,我们还在Paracel项目中开源了一个基于它实现的 算法工具集,用户在安装完Paracel后就可以用其中的算法工具进行数据处理。我们将会不断地在这个工具集中加入更多的算法。

最后,希望能有更多的人使用Paracel。如果你想贡献代码,不妨fork它在GitHub上的 代码仓库并给我们提交pull requests.

项目主页: paracel.io

20分钟教程: paracel.io/docs/quick_tutorial.html

API文档: paracel.io/docs/api_reference.html

相关 [paracel 分布 机器学习] 推荐:

PARACEL:让分布式机器学习变得简单

- - 豆瓣blog
在豆瓣,我们常通过机器学习的方式从各种数据中训练出模型,利用这些模型帮助我们理解用户并为大家挖掘出有价值的内容:豆瓣FM的个性化歌曲推荐、书影音的喜欢也喜欢、首页的豆瓣猜等等. 早期的时候,单机训练的程序基本就能满足需求. 一方面数据量不大,另一方面有的模型算一次可以用很长时间,对性能要求就没有那么高.

机器学习五步走

- - 我爱机器学习
经常会有人问“我该如何在机器学习方面更进一步,我不知道我接下来要学什么了. 一般我都会给出继续钻研教科书的答案. 每当这时候我都会收到一种大惑不解的表情. 但是进步确实就是持续的练习,保持较强的求知欲,并尽你可能的完成具有挑战性的工作. 因为他是为数不多的几种可以让你真真让你获取坚实知识的媒介. 是的,你可以选择选一门课,注册MOOC,参加一些讨论班.

机器学习之路

- - 我爱机器学习
自从答应简二毛博士将自己的机器学习历程和心得分享给大家至今,转眼间半年已经过去了,感谢简博士分享和开源精神的鼓舞,这也正是本系列关于机器学习介绍博客的动力来源. 之前有些网友,师弟们问我,学习机器学习怎么入手,从看什么书开始. 如果你只愿意看一本书,那么推荐Bishop的PRML,全名Pattern Recognition and Machine Learning. 这本书是机器学习的圣经之作,尤其对于贝叶斯方法,介绍非常完善.

Mahout实现的机器学习算法

- - ITeye博客
使用命令:mahout -h.   在Mahout实现的机器学习算法见下表:. EM聚类(期望最大化聚类). 并行FP Growth算法. 并行化了Watchmaker框架. 非Map-Reduce算法. 扩展了java的Collections类. Mahout最大的优点就是基于hadoop实现,把很多以前运行于单机上的算法,转化为了MapReduce模式,这样大大提升了算法可处理的数据量和处理性能.

国内的机器学习几个人

- - 丕子
转: http://blog.csdn.net/playoffs/article/details/7588597. 推荐几个机器学习和数据挖掘领域相关的中国大牛:. 李航:http://research.microsoft.com/en-us/people/hangli/,是MSRA Web Search and Mining Group高级研究员和主管,主要研究领域是信息检索,自然语言处理和统计学习.

Apache Mahout 0.8 发布,机器学习库

- - 开源中国社区最新新闻
Apache Mahout 0.8 发布了,Apache Mahout 是 Apache Software Foundation (ASF) 开发的一个全新的开源项目,其主要目标是创建一些可伸缩的机器学习算法,供开发人员在 Apache 在许可下免费使用. 该项目已经发展到了它的最二个年头,目前只有一个公共发行版.

Ruby的机器学习项目

- - 阳志平的网志-技术类
作者是辉瑞公司的小牛,可惜烂尾了. 我在改啊改啊,可惜现在是商业项目,暂时不能放出改掉的部分. 对了,顺便做个小广告,去年组织翻译的一本小书:社会网络分析:方法与实践. 已经上市了,感兴趣的可以翻翻:. 社会网络分析:探索关系背后的科学与技术. treat:自然语言处理. 类似于igraph,也是桥接处理nlp.

机器学习该如何入门

- - CSDN博客综合推荐文章
  对于这个问题的解释,说实话我很有压力,因为在分享篇文章之前就有朋友告诉我,这个百度上一搜一大片,还需要你讲吗. 正如同一千个读者眼里有一千个林黛玉一样,我解释的当然是我个人自从读研到工作这么多年对机器学习的学习到应用过程的独特见解.   首先我们看下图了解一下机器学习在AI(Artificial Intelligence 人工智能)领域的地位.

[译] 理解机器学习技术

- - IT瘾-dev
第1讲 理解机器学习技术. 学完本模块的内容,读者将能够:. 讨论机器学习的技术和商业应用. 学完本讲的内容,读者将能够:. 解释各类机器学习方法和算法. “机器学习领域的突破,其价值10倍于微软. 你是否曾经为计算机能够下象棋或者机器人能够完成复杂任务而感到惊奇. 一旦你理解了机器如何学习和适应各种问题、提供合适的解决方案时,这些看上去很复杂的问题实际上相当简单.

Mllib机器学习工具包在Hadoop上的使用

- 小丑鱼 - 搜索技术博客-淘宝
         Hadoop是基于Java的数据计算平台,在我们公司得到了广泛应用. 同样mllib也是我们算法组同学经常使用的一个机器学习工具包. 但目前mllib工具包只提供了供C++程序调用的so链接库,没有可供java程序调用的jar包. 由于这个需求有一定的普遍性,笔者将mllib做了进一步封装,并通过jni的方式把其封装成了可供java程序调用的接口.