parameter server是什麼?

parameter server是什麼?git


最近PMP學友會舉辦了個活動,就是阿里巴巴集團的大數據工程師介紹parameter servergithub


只是攢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 Learninghttp://www.cs.cmu.edu/~muli/file/ps.pdf

二、MapReduce的替代者-Parameter Serverhttp://blog.csdn.net/buptgshengod/article/details/46819051

三、https://www.zhihu.com/question/26998075/answer/40663986

相關文章
相關標籤/搜索