
經過漫長的準備和打磨,新一代的Angel終于開源了!新一代的Angel由騰訊和北京大學聯合開發,兼顧業界的高可用性和學術界的創新性,歡迎分布式架構師,算法工程師和資料科學家一起深入使用和協同開發,激發機器學習領域更多的創新應用和良好生态。
Github:https://github.com/tencent/angel 歡迎大家Star,Fork和提PR。
作為一個高次元的分布式機器學習架構,Angel的第一次對外亮相是在去年的五月(面向高次元的機器學習計算架構-Angel),并在去年12月份KDDChina大會上(騰訊大資料第三代高性能計算平台-Angel),宣布将全面進行開源。
為了迎接對外開源,團隊成員對Angel進行了多次重構和更新,可謂是淬火重煉。在此期間,Angel的架構反複改進,性能持續提升。開源前夕,它的性能已經超越了XGBoost和Spark。新一代的Angel,性能更快,功能更強,開發更友善。其改進主要集中在三方面:
生态性
引入PSAgent,支援PS-Service,便于接入其它機器學習架構。
函數性
融合函數式程式設計特性,自定義psFunc,利于開發複雜算法。
靈活性
支援Spark-on-Angel,Spark無需修改核心,運作于PS模式之上。
本文将從架構和性能兩方面,對新一代Angel,做一個初步的介紹,讓大家了解它的改進。關于更加具體和深入的介紹,還請點選文末“閱讀原文”移步GitHub。
在新一代的Angel開發中,我們對系統進行了一次重要的更新,引入了PSAgent,對PSServer的服務端進行隔離,進而提供了PS-Service的功能。更新後,系統的架構設計如下:
引入PSAgent後,PSClient不再直接和PSServer打交道了,而是通過PSAgent來溝通。作為新加的中間層PSAnget,有如下幾個特性:
對外屏蔽了PSServer中的模型分片,路由以及模型重組等複雜細節,提供了封裝好的模型操作接口
内置了Hogwild!機制,包含模型緩存和模型預取等性能優化
提供了模型緩存(Cache)的更新和合并的功能,大大降低網絡通信開銷
PSAgent的引入,解耦了PSServer和Worker,使得Angel具備了PSService的能力。Angel的PSServer,不再隻服務于Angel的Client,其它機器學習架構,隻要實作AngelPSClient接口了,都能可以接入Angel。
PSService的抽象,為Angel接入Spark和深度學習架構,從架構的層面上提供了便利
标準Parameter Server功能之一,就是要提供Model的拉取(pull/get)和推送(push/update)。 很多早期PS,拿HBase,Redis等分布式存儲系統,簡單改改,進行模型的更新和擷取,就搭建了一個簡單的PS系統。
但實際應用中,算法對PSServer上的參數擷取和更新,卻遠遠不隻這麼簡單,尤其是當複雜的算法需要實施一些特定的優化的時候,簡單的PS系統,就完全不能應對這些需求了。
舉個例子,有時候某些算法,要得到矩陣模型中某一行的最大值,如果PS系統,隻有基本的Pull接口,那麼PSClient,就隻能先将該行的所有列,都從參數伺服器上拉取回來,然後在Worker上計算得到最大值,這樣會産生很多的網絡通信開銷,對性能會有影響。 而如果我們有一個自定義函數,每個PSServer在遠端先計算出n個局部最大值,再交換确認全局最大值,這時隻要傳回1個數值就可以了,這樣的方式,計算開銷接近,但通信開銷将大大降低。
為了解決類似的問題,Angel引入和實作psFunc的概念,對遠端模型的擷取和更新的流程進行了封裝和抽象。它也是一種使用者自定義函數(UDF),但都和PS操作密切相關的,是以被成為psFunc,簡稱psf,整體架構如下:
随着psFunc的引入,模型的計算,也會發生在PSServer端。PSServer也将有一定的模型計算職責,而不是單純的模型存儲功能。合理的設計psFunc,将大大的加速算法的運作。
作為目前非常流行的分布式記憶體計算架構,Spark 的核心概念是RDD,而RDD的關鍵特性之一,是其不可變性,它可以規避分布式環境下複雜的各種奇奇怪怪的并行問題,快速開發各種分布式資料處理算法。然而在機器學習的時代,這個設計反而制約了Spark的發展。因為機器學習的核心是疊代和參數更新,而RDD的不可變性,不适合參數反複多次更新的需求,是以諸多Spark機器學習算法的實作,非常的曲折和不直覺。
現在,基于Angel提供的PSService和psFunc,Spark可以充分利用Angel的PS,用最小的修改代價,具備高速訓練大模型的能力,寫出更加優雅的機器學習算法代碼。
Spark on Angel實作的基本架構設計如下:
可以看出,該實作非常靈活,它對Spark沒有任何侵入式的修改,是一種插件式設計,是以完全相容社群Spark,對原生Spark的程式不會有任何影響。它的基本執行流程如下
啟動SparkSession
初始化PSContext,啟動Angel的PSServer
建立PSModelPool, 申請到PSVector
核心調用:在RDD的運算中,直接調用PSVector,進行模型更新。這将使得真正運作的Task,調用AngelPSClient,對遠端PSServer進行操作。
終止PSContext
停止SparkSession
關于Spark on Angel的具體開發,可參考:Github《Spark on Angel程式設計手冊》。線上上,基于真實的資料,我們對Spark on Angel和Spark的做了性能對比測試,結果如下:
顯而易見,Spark on Angel能輕松獲得30%或更多的加速比,越複雜的算法和模型,性能提高的比例越大。雖然PSServer會耗費了額外的資源,但是比起算法編寫的便捷和性能的提升,這是劃算的。對于Spark的老使用者,這是低成本切入Angel的一個途徑,也是算法工程師基于Spark實作高難度算法的優雅姿勢。
Spark on Angel是Angel生态圈的第一個成員,後續會有更多基于PS-Service的架構接入,包括深度學習。
新版本的Angel,添加了諸多新功能,最終的目的,就是讓算法工程師能更加從容地進行算法優化,融入更多的算法的Trick,讓算法的性能,得到了一個飛躍的提升。
衆所周知,XGBoost的強項之一,就是GBDT算法,性能飛快,使用簡單,在衆多算法比賽中,是選手們的最愛。盡管如此,Angel的GBDT算法,卻還是超越了它,這是一個非常不錯的性能背書。
性能比較
資料:騰訊内部某性别預測資料集,3.3×10^5 特征,1.2×10^8 樣本
詳細文檔:GBDT on Angel
衆所周知,LDA是一個非常消耗資源的主題模型算法,新一代的Angel,在LDA上的性能,不但超越了Spark,也已經超越了之前開源過的Petuum。(由于Petuum已經不開源多時,是以比對資料,這裡就不再貼出了)
資料:PubMED
詳細文檔: LDA on Angel
LR是廣告推薦中廣泛應用的一個算法,Angel分别提供了利用Gradient Descent、ADMM兩種優化方法計算的LR算法。這兩種算法,無論是耗費的資源,還是性能、收斂速度,都遠比原生的Spark實作優越。
GD-LR
資料: 騰訊内部某推薦資料,5×10^7 特征,8×10^7 樣本
詳細文檔: LR on Angel
ADMM-LR
資料:騰訊内部某推薦資料,5千萬特征,1億樣本
一把好的寶劍,經過千錘百煉,講究的是剛柔并濟,不但削鐵如泥,也要有極好的韌性,百折不斷。同樣的,一個好的開源項目,也是如此。它不但需要有強大的功能和性能,也需要有良好的适配性,能形成好的生态。
超大樣本和超高次元的機器學習,在騰訊的多個真實生産環境中,有着非常普遍的應用場景,這是Angel的切入點,但不是終點和限制,在未來,Angel還将深入到圖計算和深度學習領域,借助開源的力量,做出更多的探索,無論是Wider還是Deeper的模型,Angel都希望能像天使一樣,在多個機器學習架構上為它們提速,幫助各個業務提升效果,為騰訊AI的發展插上翅膀。
文章來源:【騰訊大資料】微信号:tencentbigdata