本文是李沐大神的Parameter Server論文的學習筆記,李沐大神在OSDI和NIPS上都發過文章,其中OSDI版本偏向於系統設計,而NIPS版本偏向於算法層面,本文顯然是OSDI的文章。算法
本文提出了「參數服務器」的分佈式架構來支持分佈式機器學習。分佈式機器學習主要面臨如下挑戰:緩存
而本文中的框架給開發者帶來兩點優點:服務器
本系統主要有如下五個特色:網絡
系統的這些特性都是經過選擇正確的系統技術,運用在機器學習算法中,以及修改機器學習適應系統來實現。在系統實現過程當中,主要面臨如下挑戰:架構
機器學習須要從訓練數據中學習模型,主要包含三個要素:特徵提取、目標函數和學習。特徵提取將原始訓練數據轉換爲特徵向量,不在本文贅述。學習的過程就是最小化目標函數從而得到模型。另外,在分佈式機器學習任務中,訓練數據量也一般是很是巨大的。框架
監督學習就是風險最小化的過程,例如最小化預測偏差。若是有個訓練樣本,每一個樣本的特徵向量爲
,對應的標籤爲
,模型的參數爲
,目標函數爲機器學習
其中爲損失函數,定義了預測值和真實值之間的偏差,
爲正則化項,用來防止模型過擬合。在參數服務器框架中能夠採用分佈式子梯度降低對目標函數進行最小優化異步
在分佈式子梯度降低算法中,每一個工做節點只須要計算分配到的參數工做集對應的梯度,而後由服務節點完成聚合。模型的完整參數
可能會十分巨大,工做節點在使用的時候會面臨很大的負擔,可是能夠經過只保存用到的參數值便可。分佈式
另一種機器學習的形式爲無監督學習,一般用來學習數據的自身結構。比較典型的就是話題模型:給一些文檔,推斷出每一個文檔包含的話題。主題模型的挑戰就是:關於當前文檔如何生成的參數必須被共享。解決方法就是每一個工做節點只保存分配到的文檔出現的詞有關的參數便可。函數
參數服務器系統由一個服務節點組和多個工做節點組構成。服務節點之間互相通訊來備份和遷移參數,服務管理節點負責維護服務節點元數據之間的一致性。一組工做節點運行一個應用程序,工做節點組中的調度節點負責任務的分配和監控。
參數服務器以命名空間的方式組織參數,模型的參數採用鍵值的形式保存。不一樣的應用程序可能會共享命名空間,例如一個應用程序負責模型訓練,另外一個應用程序負責模型推斷。
爲提升帶寬利用率,系統支持範圍推送和拉取。令爲鍵範圍,那麼
w.push(R,dest)
將w.pull(R,dest)
從dest拉去服務節點除了從工做節點聚合數據以外,也能夠執行用戶定義函數。這樣一來,用戶能夠實現能夠實現一些更加高級的優化算法。
任務都是異步執行的:調用者發起一個任務以後,能夠立刻執行其餘運算。爲了提升模型收斂率,能夠設置某個任務執行完成後運行的依賴關係,設置任務依賴關係能夠保證算法的邏輯。
工做節點能夠並行執行分配的任務,可是可能會對學習算法的收率產生影響。系統效率和一致性之間的權衡關係取決於算法對於不一致的敏感程程度以及系統硬件能力,本框架提供了三種模式供設計者選擇:
用戶能夠定義用戶定義過濾器選擇性地同步部分參數,例如用戶能夠之推送那些對模型參數有影響的梯度。
爲了支持任務依賴圖和快速恢復,每一個鍵值對須要一個時鐘。若是每一個個參數每一個參數都保存一個時間,若是有
個節點,那麼一共須要
空間,更合理的方式是保存範圍的時間。
系統中傳遞的消息有多個在鍵範圍內的鍵值對以及對應的向量時鐘:
消息可能並無包含範圍內所有的鍵值對,可是那些缺失的鍵值對的時鐘照常更新。
若是每次迭代,工做節點的訓練數據沒有變化,那麼鍵應該是不變的,那麼可讓接收放保存鍵緩存,而工做節點只須要發送值和鍵列表的哈希便可。另外,使用用戶自定義過濾器能夠進一步減小須要發送的鍵值對數量。
服務節點組中的節點使用分佈式哈希表來保存模型參數。爲了簡化設計,系統使用直接映射,由服務管理節點統一管理。
每一個服務節點保存了逆時針方向k個鄰居鍵範圍內的參數的副本,做爲這些副本的從節點。副本更新的方式能夠是
當一個服務節點加入服務節點組以後:
新節點從某節點拉取範圍
內的參數的過程能夠分爲兩步:
當節點N收到節點添加消息後,須要:
在某個服務節點下線後,服務管理節點須要把該節點管理的參數分配給其餘節點。
當一個新的工做節點被加入工做節點組後:
當一個工做節點離線以後,能夠選擇從新分配或者無視,系統將這個選項交給設計者,由於: