Parameter Server架构
现在的机器学习系统,但凡是大一点的公司,恐怕都在用分布式了。而在分布式机器学习领域,最出名的恐怕就是少帅的PS框架了。在本博文里,PS框架特指第三代PS框架,即少帅的PS框架,PS框架在本文里有和分布式机器学习框架等同的意义。
本片博客是论文笔记性质,特此声明。
现在的大数据机器学习系统,通常数据在1TB到1PB之间,参数范围在109和1012左右。再这样的量级下,如果想进行分布式,那么很多算法的参数只能采用分布式存储。从而,产生了三个挑战。
访问这些参数需要很大的网络带宽
很多算法是序列性的,同步会影响性能
在大规模分布式下,错误容忍是很重要的。
从而,就诞生了各种各样的分布式机器学习系统,
笑傲江湖
世界上本没有路,走的人多了,路也渐渐开阔起来。分布式机器学习系统的第一代架构,恐怕可以追溯到[2],但那个时候,有一种先帝创业未半的感觉,那个系统使用memcached,一个分布式的kv数据库,来做同步机制,因而很缺乏扩展性,性能也不强。
于是YahooLDA,作为第二代的分布式架构,就出现了。它使用一个更规范的负载分布算法和一个专有的服务器,该服务器有自定义好的一些基础单元,get/set/update等。同样的设计在Distbelief也可以见到。
对第二代分布式架构做改进的初步尝试是Petuun,他使用一个有限制的延迟模型,同时在工作线程模型上添加更多限制。
PS框架属于第三代框架,它基于之前的基础做了更多的优化,同时也采用了各家之长。
比如基于Hadoop的Mahout,基于Spark的MLI,这俩都是迭代式的Map-Reduce框架,而Spark和MLI的模式是保存算法运行的中间状态,这也正是PS框架要做的。
分布式GraphLab使用基于图抽象的异步通信,使得通信效率大大增强。但相对于Map-Reduce框架来说,它缺少弹性,同时依赖于粗粒度的快照来做恢复,这两点使得它的可扩展性很差。
Piccolo,使用同PS框架类似的机制来操作的。工作节点在本地预先聚合一些状态,然后将其上传到服务器节点。但是相对于PS框架来说缺少了一些针对机器学习的优化,比如,消息压缩、备份和通过图依赖达到的变量一致性模型。
所有的设计都有一个渐变的过程,不是一开始就能看到最好的设计,一定是根据事态的发展,一步一步走到今天的程度。我第一次看到PS的设计的时候,觉得这是很自然的设计,就如它本该是这样一样,但看的多了,才知道之前已经有那么多了。
就跟我们看到的这个社会,我们生活的这个年代是这样子的,有很多事情我们认为是理所当然的,但它也是一步一步发展成这样的。再比如我们的父母同学朋友,他们经常和我们有不一样的看法,是怎样的环境和生活体验才能让他们有这样的看法,我觉得挺好奇。
我觉得生活就是不停的好奇和探索,包括上时间上的,追寻过往和未来;包括人格上的,追寻外在和内在;又包括空间上的,追寻不同的风土人情。
扯远了!
Parameter-Server
说了那么久的PS,仍然有一种PS是啥的疑惑,请看下图。
PS架构包括内功和外功两个部分,所谓的外功,就是把计算资源分为两个部分,参数服务器节点和工作节点:
参数服务器节点用来存储参数,
工作节点部分用来做算法的训练。
内功就是对应的,把机器学习算法也分成两个方面,即参数和训练。
参数部分即模型本身,有一致性的要求,参数服务器也可以是一个集群,对于大型的算法,比如DNN,CNN,参数上亿的时候,自然需要一个集群来存储这么多的参数,因而,参数服务器也是需要调度的。
训练部分自然是并行的,不然无法体现分布式机器学习的优势。因为参数服务器的存在,每个计算节点在