專訪 | Angel團隊負責人黃明:歷時半年,騰訊Angel為了開源都經歷了些什麼?...

weixin_33840661發表於2017-07-01

機器之心原創

作者:高靜宜

2017 年 6 月 16 日,騰訊新一代高效能運算平臺 Angel 在 Github 上低調開源。開源兩週,這個專案在 Github 上持續得到關注,截至目前為止,已收穫 183 Watch,1693 Star,389 Fork,也吸引了許多業界工程師對分散式機器學習平臺架構的優化與演算法效能的提升展開了深入的討論與交流。

clipboard.png

Github 上,其他團隊的研發人員與 Angel 開發團隊就問題進行探討

這並不是 Angel 的首次亮相,去年 5 月,面向高維度機器學習的分散式計算框架 Angel 進入大眾視野;12 月 18 日,在深圳舉辦的騰訊大資料技術峰會暨 KDD China 技術峰會上,騰訊大資料宣佈推出了面向機器學習的第三代高效能運算平臺 Angel,主打易用性,不僅提供機器學習演算法庫以及友好的程式設計介面,還內建資料自動切分、資料計算和模型劃分的自動方案及非同步控制等功能並支援多種高維度機器學習場景。(詳見《騰訊大資料將開源高效能運算平臺 Angel,機器之心專訪開發團隊》)

當時,騰訊曾表示將於 2017 年一季度開放其原始碼,為什麼超出預期一個季度才開源 Angel 平臺?歷時半年,Angel 平臺在技術方面有哪些更新與優化?是否有重大升級?為此,機器之心專訪騰訊資料平臺部智慧學習平臺技術負責人黃明,深入瞭解新一代 Angel 平臺的背後的故事以及技術方面的亮點。

新一代 Angel 平臺由騰訊和北京大學聯合開發,黃明介紹,這半年來,團隊做了大量的重構工作,包括相關自動化單元測試以及中文詳細文件準備。在重構過程中,團隊還做了兩個大動作:一是引入 Spark on Angel,二是把效能優化到比 XGBoost 還快。「這其中的工作量是非常大的,超出了最初的預期,很多事情就這樣連帶著做了,還好老大們沒給太大的壓力。一直到 6 月中旬我們覺得專案挺完善了,各個效能比對都充分了,才正式開源了這個平臺。一開始,我們並沒有想宣傳這件事,只在騰訊內部發表了相關文章,沒想到機器之心很快就發現了我們的動作,幫助我們把 Github 上的相關資訊分享給大家了。」黃明笑著解釋道。(詳見《騰訊 Angel 1.0 正式版釋出:基於 Java 與 Scala 的機器學習高效能運算平臺》)

在談及新一代 Angel 平臺時,黃明表示,Spark on Angel 是此次平臺升級的一大亮點,而 Spark 只是 Angel 生態圈的第一個成員。「之前業界有過不少關於 Spark on PS 的討論,Yahoo 也有相關的研究,但是並沒開源。有一個小的開源專案 Glint,也是做 Spark on PS 的,但是在效能和功能上都有所欠缺,比如不支援 psFunc,而且也沒有人維護。這次騰訊開源 Angel 的時候,直接將 Spark on Angel 也開源了,希望能夠帶動更多的 Spark 工程師投入到機器學習的領域中,利用 Spark 和 Angel 配合來做機器學習。另外,透露一下,在下一個小版本中,會推出 Spark Streaming on Angel,Angel 也將可以支援線上學習。」

經過反覆的改進與迭代,Angel 在效能、功能以及開發者易用性都有了顯著的提升,開源前夕,Angel 就已經具備超越 XGBoost 和 Spark 的效能表現。此次升級主要表現在三個方面:

clipboard.png

生態性: 引入 PSAgent,支援 PS-Service,便於接入其它機器學習框架

函式性: 融合函數語言程式設計特性,自定義 psFunc,利於開發複雜演算法

靈活性: 支援 Spark-on-Angel,Spark 無需修改核心,執行於 PS 模式之上

以下為新一代 Angel 開源平臺架構升級以及效能優勢方面的具體介紹。

clipboard.png

三大架構升級

1.PSService

據 Andy 介紹,在新一代的 Angel 開發中,研發團隊對系統進行了一次重要升級,引入了 PSAgent,對 PSServer 的服務端進行隔離,從而提供了 PSService 的功能。升級後,系統的架構設計如下:

新加入的中間層 PSAnget 有以下特性:

對外遮蔽 PSServer 中的模型分片,路由以及模型重組等複雜細節,提供封裝好的模型操作介面

內建 Hogwild! 機制,包含模型快取和模型預取等效能優化

提供模型快取(Cache)的更新和合並的功能,大大降低網路通訊開銷

PSAgent 的引入使 PSClient 不再直接和 PSServer 打交道,而是通過 PSAgent 進行溝通。這樣的調整解耦了 PSServer 和 Worker,使 Angel 具備了 PSService 的能力。同時,Angel 的 PSServer 也不再只服務於 Angel 的 Client,只要能夠實現 AngelPSClient 介面,其它機器學習框架也能可以接入 Angel。

PSService 不僅為新一代 Angel 打下了堅實的基礎,也從架構的層面上,為接入 Spark 和深度學習計算框架提供了可能。

2.psFunc

提供 Model 的拉取(pull/get)和推送(push/update)是標準 Parameter Server 的一個功能。很多早期的 PS 是在 HBase,Redis 等分散式儲存系統的基礎上,進行簡單的模型更新和獲取而搭建的。

但在實際應用中,演算法對 PSServer 上引數的獲取和更新,卻並非這樣簡單。尤其是在複雜的演算法需要實施一些特定的優化時,簡單的 PS 系統就無法應對這些需求了。以求取矩陣模型中某一行的最大值為例,如果 PS 系統只有基本的 Pull 介面,那麼 PSClient 只能先將該行的所有列都從引數伺服器上拉取回來,然後再在 Worker 上計算得到最大值。這個過程會產生許多網路通訊開銷,對效能造成影響。同樣的情況下,如果可以設定一個自定義函式,那麼每個 PSServer 就可以先遠端計算出 n 個區域性最大值,再交換確認全域性最大值,只需返回 1 個數值就可以完成任務。這樣的方式算產生的計算開銷接近,但通訊開銷卻將大大降低。

為了解決類似的問題,Angel 引入並實現 psFunc 的概念,對遠端模型的獲取和更新的流程進行了封裝和抽象。這也是一種使用者自定義函式(UDF),因與 PS 操作密切相關,也被成為 psFunc,簡稱 psf,其整體架構如下:

clipboard.png

psFunc 的引入促使 PSServer 端也會發生模型計算,相應地,PSServer 也會承擔一定的模型計算職責,而不是單純的實現模型儲存功能。「使用者可以靈活地自定義自己的運算元,合理設計 psFunc 能夠大幅度加速演算法執行。」黃明解釋道。

3.Spark on Angel

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 和 Spark 的做了效能對比測試,結果如下:

顯而易見,Spark on Angel 能輕鬆獲得 30% 甚至更多的加速比,而且越複雜的演算法和模型,效能提高的比例越大。雖然 PSServer 會耗費了額外的資源,但是考慮演算法編寫的便捷以及效能的提升方面,這仍是一個划算、合適的選擇。對於 Spark 的老使用者,這是低成本切入 Angel 的一個途徑,也是演算法工程師基於 Spark 實現高難度演算法的有效方式。

三大效能提升

新版本 Angel 新增諸多新功能的最終目的,就是讓演算法工程師能更加從容地進行演算法優化,進而讓演算法的效能可以得到了一個飛躍的提升。

1.GBDT

眾所周知,近年來 XGBoost 在眾多演算法比賽中大放異彩。GBDT 演算法正是 XGBoost 的強項之一,不過,Angel 的 GBDT 演算法仍在效能上實現了超越。

clipboard.png

(資料:騰訊內部某性別預測資料集,3.3×105 特徵,1.2×108 樣本)

可以看到,這次釋出的效能比對版本相較之前有所不同,其中加入了 XGBoost 的比較。對此,黃明表示,「在 Angel 的開發過程中,我們一直都是在同 Petuum 和 Spark 對標效能。但是在我們進行開源工作時,Petuum 已經接受風投不再開源了(2016 年 12 月)。而且,我們在開源的過程中,其實是不斷地對 Angel 做架構升級和程式碼優化的,如果只針對 Spark 進行對標的話,是很沒挑戰的事。當時有個同事覺得,XGBoost 的 GBDT 演算法是業界的標杆之一,因為做 Kaggle 比賽的人基本都會考慮使用,那麼我們是不是可以超越它?於是我們頭腦風暴了一下,就把這個定為重構目標之一了。一開始,差距還是比較大的,後來我們進行了優化,也做了很多工作,包括在基於 psFunc 重構完成後,把一些最佳分裂點的計算和合並,移到 psServer 上做,才超越了 XGBoost。」

2.LDA

LDA 是一個非常消耗資源的主題模型演算法,新一代的 Angel 在 LDA 上的效能不但超越了 Spark,而且已經超越了之前開源過的 Petuum。Andy 解釋稱:「本來我們計劃對標 Petuum,不過 Petuum 早已不再開源了,所以很多方面也不再具備可比性,不過我們的效能與 Pettum 相比可以快五倍左右。」

(資料:PubMED)

3.GD-LR

LR 是廣告推薦中廣泛應用的一個演算法,Angel 分別提供了利用 Gradient Descent、ADMM 兩種優化方法計算的 LR 演算法。這兩種演算法,無論是耗費的資源,還是效能、收斂速度,都遠比原生的 Spark 實現優越。

(1). GD-LR

clipboard.png

(資料: 騰訊內部某推薦資料,5×107 特徵,8×107 樣本)

(2).ADMM-LR

clipboard.png

(資料:騰訊內部某推薦資料,5 千萬特徵,1 億樣本)

關於這個 ADMM-LR 演算法的比較,黃明笑談,「其實開源版本的 Spark 是沒有這個演算法的,也是我們之前為了支援騰訊內部業務而開發的。而原來開發 Spark 版本的時候,我們持續優化了很久,基本把 Spark 效能壓榨到了極致。以至於 Spark on Angel 版本的演算法,比它快不了多少,所以這裡就被列出來了。不過還好,就是這樣子,Angel 版本的演算法還是比 Spark 版本的,快了很多的。」

在談到這次開源的效能比對時,黃明提到,他們的原則是基於生產資料以及現網環境,儘量保證公平。首先,資料集是相同的,都以騰訊正式的資料集為主。由於資料量都非常大,因此跑起來很耗費資源,需要在現網叢集上執行。在做運維的同學的協助之下,才能有相對合適的環境來比對。黃明解釋道,「比如有些資料集,Spark 跑起來的話,需要分配 50G 記憶體給 Driver 才可能跑得過去,其實不是所有現網叢集都具備執行這個作業能力的。我們也需要反覆嘗試和調優各種引數,才能讓 PK 雙方儘可能公平地在同樣的 Worker,Core,記憶體,網路條件下執行。這個過程其實又把開源延遲了 1 個月。不過從整體上來看,我們覺得這個花費還是值得的。」

最後黃明表示:「在此之前,Angel 平臺一直只在騰訊內部使用,而今的開源仍處於初級階段,後續會基於 PS-Service,接入更多深度學習的框架,例如 TensorFlow,來切入深度學習領域。希望 Angel 可以吸引更多的開發者使用者加入我們的生態中來,藉助開源的力量讓大家共同探索未來機器學習領域的各種可能性。」

相關文章