最近PMP学友会举办了个活动,就是阿里巴巴集团的大数据工程师介绍parameter server。github
只是攒3个PDU,可是一直想往大数据方向发展,这个不能不知。编程
百度了一下,有了点眉目,如下摘自几个网络文章。问候会给出地址。服务器
1、parameter server概念:网络
参数服务器是个编程框架,用于方便分布式并行程序的编写,其中重点是对大规模参数的分布式存储和协同的支持。架构
2、parameter server的发展背景:并发
工业界须要训练大型的机器学习模型,一些普遍使用的特定的模型在规模上的两个特色:
1. 参数很大,超过单个机器的容纳能力(好比大型Logistic Regression和神经网络)
2. 训练数据巨大,须要分布式并行提速(大数据)
这种需求下,当前相似MapReduce的框架并不能很好适合。
所以须要本身实现分布式并行程序,其实在Hadoop出来以前,对于大规模数据的处理,都须要本身写分布式的程序(MPI)。 以后这方面的工做流程被Google的工程师总结和抽象成MapReduce框架,大一统了。
参数服务器就相似于MapReduce,是大规模机器学习在不断使用过程当中,抽象出来的框架之一。重点支持的就是参数的分布式,毕竟巨大的模型其实就是巨大的参数。框架
3、parameter server架构:机器学习
Parameter Server(Mli)
----------------------------
架构:
集群中的节点能够分为计算节点和参数服务节点两种。其中,计算节点负责对分配到本身本地的训练数据(块)计算学习,并更新对应的参数;参数服务节点采用分布式存储的方式,各自存储全局参数的一部分,并做为服务方接受计算节点的参数查询和更新请求。
简而言之吧,计算节点负责干活和更新参数,参数服务节点则负责存储参数。
冗余和恢复:
相似MapReduce,每一个参数在参数服务器的集群中都在多个不一样节点上备份(3个也是极好的),这样当出现节点失效时,冗余的参数依旧可以保证服务的有效性。当有新的节点插入时,把原先失效节点的参数从冗余参数那边复制过来,失效节点的接班人就加入队伍了。
并行计算:
并行计算这部分主要在计算节点上进行。 相似于MapReduce,分配任务时,会将数据拆分给每一个worker节点。
参数服务器在开始学习前,也会把大规模的训练数据拆分到每一个计算节点上。单个计算节点就对本地数据进行学习就能够了。学习完毕再把参数的更新梯度上传给对应的参数服务节点进行更新。
详细的流程:
1.
分发训练数据 -> 节点1
节点2
节点3
...
节点i
...
节点N
2.
节点i 学习过程:
遍历本地的训练数据,统计全部须要的参数(key)
向分布式的参数服务器查询须要的参数(注意,本地数据对应到的参数只是全局参数的一小部分)
获得查询到的参数值,用于模型的本地训练
一轮训练完毕,获得全部对应参数的更新,将更新上传给参数服务器
3.
参数服务器更新参数过程:
参数服务器获得计算节点传过来的局部更新,汇总后更新本地数据
一些细节仍是看李沐的文章吧,这个模型相对其余的一些参数服务器的框架是最简单直观的。
4、Project Adam
------------------
微软研究院的一个专门用于deep learning的参数服务器,很厉害的样子。用了不少trick来提高性能和容纳更大的模型和数据,固然精度也随之上升了不少。
大致的架构和Parameter Server(Mli)的比较类似,但论文里面包含了比较丰富的细节,能够跟以前的内容互补一下。
类似点
分布式
一样拆分为计算节点(worker)和参数服务节点(parameter server),参数分布式存储
均采用冗余,每一个参数会保存3份,当某参数对应的服务节点失效,服务会转到该参数对应的部分节点上(2选1)
其余点
5、Parameter Server 构成:
参数服务器中,分布式存储参数的部分,包含两类节点:
Parameter Server(PS): 这类节点负责具体参数的分布式存储
Parameter Server Controller(PSC): 这类节点负责路由和冗余容灾和失效恢复等操做
换句话说,PSC是PS的管理者。 Adam中节点控制的灵活性全在PSC中。
路由机制
project Adam中使用了路由来肯定每一个参数的存储位置。
路由信息由PSC(实际上是多个一致的节点来支撑整个集群的工做)。
计算节点在每次访问和更新参数前,先向PSC询问最新的路由信息,而后将参数按目标位置拆分发送。
而当PS中出现节点变化(节点失效或者添加,相似MapReduce,PSC也会按期PING每一个PS来确认节点有效状态),PSC会修改路由,并提供最新的路由信息给计算节点。
冗余机制
前面说到,每一个参数会在PS集群中有三个副本,存储在不一样的节点上来实现冗余。
其中一个节点会被选为primary,来提供针对某个参数的服务。
当这个节点失效时,另外两个副本中会被挑选出一个做为新的primary,来继续此参数的服务。 这是容灾的第一步
恢复机制
前面说到,冗余机制是容灾第一步。
长久之计是将目前状态恢复到失效以前(目前该参数只有两个副本,须要恢复到3个),这就须要PSC的控制,将失效节点上的参数拆分到其余active的节点上备份(如此就恢复成了三个副本)
固然,若是有新节点的加入,也须要在PSC注册登记,以后PSC能够分配部分参数过去并修改路由。
有趣的trick
单机上,使用指针传递来避免内存复制
集群中通讯,单个机器在传递多个进程的信息传递请求前,会经过相同的发送目标节点来概括这些消息,以后一并发送请求。
无锁写入。这个也许会带来写冲突,可是几率比较低,并且深度神经网络天生能够忍受噪音
更多的信息能够搜索 project Adam,论文里面细节比较容易懂,还有一段录像讲解。
6、一个简单的实现:SwiftSnails
---------------------------------------------------
这是我写一个小的参数服务器,比较简单,代码也比较少。 没有用MPI,本身实现路由分发啥的,有种解放前小米加×××的感受。里面有个Word2Vec的分布式实现做为Demo,效率仍是不错的。 有兴趣的能够看看 。
项目地址: SwiftSnails by Superjom
做者:Superjom
连接:https://www.zhihu.com/question/26998075/answer/40577680
来源:知乎
著做权归做者全部,转载请联系做者得到受权。
7、参考资料:
一、李沐的论文 《Parameter Server for Distributed Machine Learning》http://www.cs.cmu.edu/~muli/file/ps.pdf
二、MapReduce的替代者-Parameter Server:http://blog.csdn.net/buptgshengod/article/details/46819051