經典分佈式論文閱讀:Parameter Server

本文是李沐大神的Parameter Server論文的學習筆記,李沐大神在OSDI和NIPS上都發過文章,其中OSDI版本偏向於系統設計,而NIPS版本偏向於算法層面,本文顯然是OSDI的文章。算法

本文提出了「參數服務器」的分佈式架構來支持分佈式機器學習。分佈式機器學習主要面臨如下挑戰:緩存

  • 訪問參數消耗大量的網絡帶寬
  • 不少機器學習算法都是串行的
  • 容錯能力很是重要

而本文中的框架給開發者帶來兩點優點:服務器

  1. 經過分解機器學習的組件,可讓業務代碼更加簡潔
  2. 可以實現魯棒、多功能、高性能的分佈式機器學習算法

本系統主要有如下五個特色:網絡

  • 高效的通訊:使用了異步非阻塞通訊模型
  • 靈活的一致性模型:能夠容許系統設計人員手動權衡收斂率和系統效率
  • 彈性的規模:可以在運行期間添加新節點
  • 容錯和耐久:能從故障中快速恢復,經過向量時鐘保證行爲的肯定性
  • 易用:參數表示爲向量和矩陣便於開發機器學習算法

系統的這些特性都是經過選擇正確的系統技術,運用在機器學習算法中,以及修改機器學習適應系統來實現。在系統實現過程當中,主要面臨如下挑戰:架構

  • 通訊:經過批量傳輸參數(向量片斷、矩陣的行列而不是單個參數值)來提升通訊效率
  • 容錯:經過實時備份和熱修復和實現

機器學習

機器學習須要從訓練數據中學習模型,主要包含三個要素:特徵提取目標函數學習。特徵提取將原始訓練數據轉換爲特徵向量,不在本文贅述。學習的過程就是最小化目標函數從而得到模型。另外,在分佈式機器學習任務中,訓練數據量也一般是很是巨大的。框架

風險最小化

監督學習就是風險最小化的過程,例如最小化預測偏差。若是有n個訓練樣本,每一個樣本的特徵向量爲x_i,對應的標籤爲y_i,模型的參數爲w,目標函數爲機器學習

F(w)=\sum_{i=1}^{n} \ell\left(x_{i}, y_{i}, w\right)+\Omega(w)

其中\ell\left(x_{i}, y_{i}, w\right)爲損失函數,定義了預測值和真實值之間的偏差,\Omega(w)爲正則化項,用來防止模型過擬合。在參數服務器框架中能夠採用分佈式子梯度降低對目標函數進行最小優化異步

在分佈式子梯度降低算法中,每一個工做節點只須要計算分配到的參數工做集w對應的梯度,而後由服務節點完成聚合。模型的完整參數w可能會十分巨大,工做節點在使用的時候會面臨很大的負擔,可是能夠經過只保存用到的參數值便可。分佈式

生成模型

另一種機器學習的形式爲無監督學習,一般用來學習數據的自身結構。比較典型的就是話題模型:給一些文檔,推斷出每一個文檔包含的話題。主題模型的挑戰就是:關於當前文檔如何生成的參數必須被共享。解決方法就是每一個工做節點只保存分配到的文檔出現的詞有關的參數便可。函數

架構

參數服務器系統由一個服務節點組和多個工做節點組構成。服務節點之間互相通訊來備份和遷移參數,服務管理節點負責維護服務節點元數據之間的一致性。一組工做節點運行一個應用程序,工做節點組中的調度節點負責任務的分配和監控。

參數服務器以命名空間的方式組織參數,模型的參數採用鍵值的形式保存。不一樣的應用程序可能會共享命名空間,例如一個應用程序負責模型訓練,另外一個應用程序負責模型推斷。

範圍推送和拉取

爲提升帶寬利用率,系統支持範圍推送和拉取。令\mathcal R爲鍵範圍,那麼

  • w.push(R,dest)w中鍵範圍在\mathcal R中的參數推送到dest
  • w.pull(R,dest)從dest拉去w中鍵範圍在\mathcal R中的參數

服務節點的用戶定義函數

服務節點除了從工做節點聚合數據以外,也能夠執行用戶定義函數。這樣一來,用戶能夠實現能夠實現一些更加高級的優化算法。

異步任務和依賴

任務都是異步執行的:調用者發起一個任務以後,能夠立刻執行其餘運算。爲了提升模型收斂率,能夠設置某個任務執行完成後運行的依賴關係,設置任務依賴關係能夠保證算法的邏輯。

靈活的一致性

工做節點能夠並行執行分配的任務,可是可能會對學習算法的收率產生影響。系統效率和一致性之間的權衡關係取決於算法對於不一致的敏感程程度以及系統硬件能力,本框架提供了三種模式供設計者選擇:

  • 順序一致:下一個任務必須在前一個任務完成以後才能執行
  • 最終一致:全部任務一塊兒開始
  • 有界延遲:在\tau時間以前開始的任務所有完成以後纔開始任務

用戶定義的過濾器

用戶能夠定義用戶定義過濾器選擇性地同步部分參數,例如用戶能夠之推送那些對模型參數有影響的梯度。

實現

向量時鐘

爲了支持任務依賴圖和快速恢復,每一個鍵值對須要一個時鐘。若是每一個m個參數每一個參數都保存一個時間,若是有n個節點,那麼一共須要O(nm)空間,更合理的方式是保存範圍的時間。

消息

系統中傳遞的消息有多個在鍵範圍\mathcal R內的鍵值對以及對應的向量時鐘:

\left[\operatorname{vc}(\mathcal{R}),\left(k_{1}, v_{1}\right), \ldots,\left(k_{p}, v_{p}\right)\right] k_{j} \in \mathcal{R} \text { and } j \in\{1, \ldots p\}

消息可能並無包含範圍內所有的鍵值對,可是那些缺失的鍵值對的時鐘照常更新。

若是每次迭代,工做節點的訓練數據沒有變化,那麼鍵應該是不變的,那麼可讓接收放保存鍵緩存,而工做節點只須要發送值和鍵列表的哈希便可。另外,使用用戶自定義過濾器能夠進一步減小須要發送的鍵值對數量。

一致哈希

服務節點組中的節點使用分佈式哈希表來保存模型參數。爲了簡化設計,系統使用直接映射,由服務管理節點統一管理。

副本和一致

每一個服務節點保存了逆時針方向k個鄰居鍵範圍內的參數的副本,做爲這些副本的從節點。副本更新的方式能夠是

  • 在更新參數的時候,更新消息也會推送給保存副本的從節點
  • 在完成參數參數聚合後推送給從節點

服務節點管理

當一個服務節點加入服務節點組以後:

  1. 服務管理節點分配給新節點一個鍵範圍,新節點將做爲這個範圍的參數的主節點
  2. 節點獲取這個範圍內的參數併成爲主節點,以及獲取k個額外範圍的參數做爲從節點
  3. 服務管理節點廣播更改。其餘節點會釋放再也不須要本身管理的參數,而且叫沒完成的任務交給新節點

新節點從某節點\mathcal S拉取範圍\mathcal R內的參數的過程能夠分爲兩步:

  1. \mathcal S預先拷貝一份原先的所有鍵值對數據以及對應的時鐘,當新節點下線時能夠用來恢復;
  2. \mathcal S再也不處理範圍\mathcal R內的消息,而且把預拷貝階段的更改發送給新節點。

當節點N收到節點添加消息後,須要:

  • 刪除再也不須要本身管理的參數
  • 從新發送未確認的消息,去掉不屬於本身管理的內容

在某個服務節點下線後,服務管理節點須要把該節點管理的參數分配給其餘節點。

工做節點管理

當一個新的工做節點W被加入工做節點組後:

  1. 任務調度節點分配給W一部分數據
  2. 節點從網絡文件系統或者其餘工做節點加載分配的訓練數據,而後從服務節點拉取的參數
  3. 任務調度節點廣播更改,其餘工做結果可能須要釋放一些重複的訓練數據

當一個工做節點離線以後,能夠選擇從新分配或者無視,系統將這個選項交給設計者,由於:

  1. 當訓練數據量很是大的時候,恢復一個工做節點的代價比恢復服務節點的代價大不少
  2. 丟失一小部分訓練數據不會對最終模型形成太大影響

參考文獻

  1. Li, Mu, et al. "Scaling distributed machine learning with the parameter server." 11th {USENIX} Symposium on Operating Systems Design and Implementation ({OSDI} 14). 2014.
  2. Li, Mu, et al. "Parameter server for distributed machine learning." Big Learning NIPS Workshop. Vol. 6. 2013.
相關文章
相關標籤/搜索