PARACEL:让分布式机器学习变得简单
suiw9 2024-11-13 14:41 25 浏览 0 评论
在豆瓣,我们常通过机器学习的方式从各种数据中训练出模型,利用这些模型帮助我们理解用户并为大家挖掘出有价值的内容:豆瓣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
Tags: 产品与技术, 算法, 机器学习
相关推荐
- 看完这一篇数据仓库干货,终于搞懂什么是hive了
-
一、Hive定义Hive最早来源于FaceBook,因为FaceBook网站每天产生海量的结构化日志数据,为了对这些数据进行管理,并且因为机器学习的需求,产生了Hive这们技术,并继续发展成为一个成...
- 真正让你明白Hive参数调优系列1:控制map个数与性能调优参数
-
本系列几章系统地介绍了开发中Hive常见的用户配置属性(有时称为参数,变量或选项),并说明了哪些版本引入了哪些属性,常见有哪些属性的使用,哪些属性可以进行Hive调优,以及如何使用的问题。以及日常Hi...
- HIVE SQL基础语法(hive sql是什么)
-
引言与关系型数据库的SQL略有不同,但支持了绝大多数的语句如DDL、DML以及常见的聚合函数、连接查询、条件查询。HIVE不适合用于联机事务处理,也不提供实时查询功能。它最适合应用在基于大量不可变数据...
- [干货]Hive与Spark sql整合并测试效率
-
在目前的大数据架构中hive是用来做离线数据分析的,而在Spark1.4版本中spark加入了sparksql,我们知道spark的优势是速度快,那么到底sparksql会比hive...
- Hive 常用的函数(hive 数学函数)
-
一、Hive函数概述及分类标准概述Hive内建了不少函数,用于满足用户不同使用需求,提高SQL编写效率:...
- 数仓/数开面试题真题总结(二)(数仓面试时应该讲些什么)
-
二.Hive...
- Tomcat处理HTTP请求流程解析(tomcat 处理请求过程)
-
1、一个简单的HTTP服务器在Web应用中,浏览器请求一个URL,服务器就把生成的HTML网页发送给浏览器,而浏览器和服务器之间的传输协议是HTTP,那么接下来我们看下如何用Java来实现一个简单...
- Python 高级编程之网络编程 Socket(六)
-
一、概述Python网络编程是指使用Python语言编写的网络应用程序。这种编程涉及到网络通信、套接字编程、协议解析等多种方面的知识。...
- [904]ScalersTalk成长会Python小组第20周学习笔记
-
Scalers点评:在2015年,ScalersTalk成长会Python小组完成了《Python核心编程》第1轮的学习。到2016年,我们开始第二轮的学习,并且将重点放在章节的习题上。Python小...
- 「web开发」几款http请求测试工具
-
curl命令CURL(CommandLineUniformResourceLocator),是一个利用URL语法,在命令行终端下使用的网络请求工具,支持HTTP、HTTPS、FTP等协议...
- Mac 基于HTTP方式访问下载共享文件,配置共享服务器
-
方法一:使用Python的SimpleHTTPServer进行局域网文件共享Mac自带Python,所以不需要安装其他软件,一条命令即可...
- 使用curl进行http高并发访问(php curl 大量并发获得结果)
-
本文主要介绍curl异步接口的使用方式,以及获取高性能的一些思路和实践。同时假设读者已经熟悉并且使用过同步接口。1.curl接口基本介绍curl一共有三种接口:EasyInterface...
- Django 中的 HttpResponse理解和用法-基础篇1
-
思路是方向,代码是时间,知识需积累,经验需摸索。希望对大家有用,有错误还望指出。...
你 发表评论:
欢迎- 一周热门
-
-
Linux:Ubuntu22.04上安装python3.11,简单易上手
-
宝马阿布达比分公司推出独特M4升级套件,整套升级约在20万
-
MATLAB中图片保存的五种方法(一)(matlab中保存图片命令)
-
别再傻傻搞不清楚Workstation Player和Workstation Pro的区别了
-
Linux上使用tinyproxy快速搭建HTTP/HTTPS代理器
-
如何提取、修改、强刷A卡bios a卡刷bios工具
-
Element Plus 的 Dialog 组件实现点击遮罩层不关闭对话框
-
日本组合“岚”将于2020年12月31日停止团体活动
-
SpringCloud OpenFeign 使用 okhttp 发送 HTTP 请求与 HTTP/2 探索
-
MacOS + AList + 访达,让各种云盘挂载到本地(建议收藏)
-
- 最近发表
- 标签列表
-
- dialog.js (57)
- importnew (44)
- windows93网页版 (44)
- yii2框架的优缺点 (45)
- tinyeditor (45)
- qt5.5 (60)
- windowsserver2016镜像下载 (52)
- okhttputils (51)
- android-gif-drawable (53)
- 时间轴插件 (56)
- docker systemd (65)
- slider.js (47)
- android webview缓存 (46)
- pagination.js (59)
- loadjs (62)
- openssl1.0.2 (48)
- velocity模板引擎 (48)
- pcre library (47)
- zabbix微信报警脚本 (63)
- jnetpcap (49)
- pdfrenderer (43)
- fastutil (48)
- uinavigationcontroller (53)
- bitbucket.org (44)
- python websocket-client (47)