Spark on Angel:Spark機器學習的核心加速器

Spark的核心概念是RDD,而RDD的關鍵特性之一是其不可變性,來規避分佈式環境下複雜的各類並行問題。這個抽象,在數據分析的領域是沒有問題的,它能最大化的解決分佈式問題,簡化各類算子的複雜度,並提供高性能的分佈式數據處理運算能力。
然而在機器學習領域,RDD的弱點很快也暴露了。機器學習的核心是迭代和參數更新。RDD憑藉着邏輯上不落地的內存計算特性,能夠很好的解決迭代的問題,然而RDD的不可變性,卻很是不適合參數反覆屢次更新的需求。這本質上的不匹配性,致使了Spark的MLlib庫,發展一直很是緩慢,從2015年開始就沒有實質性的創新,性能也很差。
爲此,Angel在設計生態圈的時候,優先考慮了Spark。在V1.0.0推出的時候,就已經具有了Spark on Angel的功能,基於Angel爲Spark加上了PS功能,在不變中加入了變化的因素,可謂如虎添翼。
咱們將以L-BFGS爲例,來分析Spark在機器學習算法的實現上的問題,以及Spark on Angel是如何解決Spark在機器學習任務中的遇到的瓶頸,讓Spark的機器學習更增強大。算法

  1. L-BFGS算法說明
    圖片描述

圖片描述

2.L-BFGS的Spark實現
圖片描述編程

圖片描述

3.L-BFGS的Spark on Angel實現
3.1 實現框架
Spark on Angel藉助Angel PS-Service的功能爲Spark引入PS的角色,減輕整個算法流程對driver的依賴。two-loop recursion算法的運算交給PS,而driver只負責任務的調度,大大減輕的對driver性能的依賴。
Angel PS由一組分佈式節點組成,每一個vector、matrix被切分紅多個partition保存到不一樣的節點上,同時支持vector和matrix之間的運算;
圖片描述網絡

3.2 性能分析
整個算法過程,driver只負責任務調度,而複雜的two-loop recursion運算在PS上運行,梯度的Aggregate和模型的同步是executor和PS之間進行,全部運算都變成分佈式。在網絡傳輸中,高維度的PSVector會被切成小的數據塊再發送到目標節點,這種節點之間多對多的傳輸大大提升了梯度聚合和模型同步的速度。 這樣Spark on Angel徹底避開了Spark中driver單點的瓶頸,以及網絡傳輸高維度向量的問題。框架

4.「輕易強快」的Spark on Angel
Spark on Angel是Angel爲解決Spark在機器學習模型訓練中的缺陷而設計的「插件」,沒有對Spark作「侵入式」的修改,是一個獨立的框架。能夠用 「輕」、「易」、「強」、「快」 來歸納Spark on Angel的特色。
4.1 輕 — 「插件式」的框架
Spark on Angel是Angel爲解決Spark在機器學習模型訓練中的缺陷而設計的「插件」。Spark on Angel沒有對Spark中的RDD作侵入式的修改,Spark on Angel是依賴於Spark和Angel的框架,同時其邏輯又獨立於Spark和Angel。 所以,Spark用戶使用Spark on Angel很是簡單,只需在Spark的提交腳本里作三處改動便可,詳情可見Angel的Github Spark on Angel Quick Start文檔
能夠看到提交的Spark on Angel任務,其本質上依然是一個Spark任務,整個任務的執行過程與Spark同樣的。
source ${Angel_HOME}/bin/spark-on-angel-env.sh
$SPARK_HOME/bin/spark-submit \機器學習

--master yarn-cluster \
--conf spark.ps.jars=$SONA_ANGEL_JARS \
--conf spark.ps.instances=20 \
--conf spark.ps.cores=4 \
--conf spark.ps.memory=10g \
--jars $SONA_SPARK_JARS \
....

Spark on Angel可以成爲如此輕量級的框架,得益於Angel對PS-Service的封裝,使Spark的driver和executor能夠經過PsAgent、PSClient與Angel PS作數據交互。
圖片描述分佈式

4.2 強 — 功能強大,支持breeze庫
breeze庫是scala實現的面向機器學習的數值運算庫。Spark MLlib的大部分數值優化算法都是經過調用breeze來完成的。以下所示,Spark和Spark on Angel兩種實現都是經過調用breeze.optimize.LBFGS實現的。Spark的實現是BreezePSVector。
BreezePSVector是指Angel PS上的Vector,該Vector實現了breeze NumericOps下的方法,如經常使用的 dot,scale,axpy,add等運算,所以在LBFGS[BreezePSVector] two-loop recursion算法中的高維度向量運算是BreezePSVector之間的運算,而BreezePSVector之間所有在Angel PS上分佈式完成。
Spark的L-BFGS實現
圖片描述oop

4.3 易 — 編程接口簡單
Spark可以在大數據領域這麼流行的另一個緣由是:其編程方式簡單、容易理解,Spark on Angel一樣繼承了這個特性。 Spark on Angel本質是一個Spark任務,整個代碼實現邏輯跟Spark是一致的;當須要與PSVector作運算時,調用相應的接口便可。
以下代碼所示,LBFGS在Spark和Spark on Angel上的實現,兩者代碼的總體思路是同樣的,主要的區別是梯度向量的Aggregate和模型 的pull/push。 所以,若是將Spark的算法改形成Spark on Angel的任務,只須要修改少許的代碼便可。
L-BFGS須要用戶實現DiffFunction,DiffFunction的calculte接口輸入參數是 ,遍歷訓練數據並返回 loss 和 gradient。
其完整代碼,請前往Github SparseLogistic
Spark的DiffFunction實現
圖片描述性能

4.4 快 — 性能強勁
咱們分別實現了SGD、LBFGS、OWLQN三種優化方法的LR,並在Spark和Spark on Angel上作了實驗對比。 該實驗代碼請前往Github SparseLRWithX.scala .
數據集:騰訊內部某業務的一份數據集,2.3億樣本,5千萬維度
實驗設置:
說明1:三組對比實驗的資源配置以下,咱們儘量保證全部任務在資源充足的狀況下執行,所以配置的資源比實際須要的偏多;
說明2:執行Spark任務時,須要加大spark.driver.maxResultSize參數;而Spark on Angel就不用配置此參數。
圖片描述學習

如上數據所示,Spark on Angel相較於Spark在訓練LR模型時有50%以上的加速;對於越複雜的模型,其加速的比例越大。
5.結語
Spark on Angel的出現能夠高效、低成本地克服Spark在機器學習領域遇到的瓶頸;咱們將繼續優化Spark on Angel,並提升其性能。也歡迎你們在Github上一塊兒參與咱們的改進。
Angel項目Github:Angel。喜歡的話到Github上給咱們Star。大數據

相關文章
相關標籤/搜索