天天看點

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

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

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

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 的性能表現。此次更新主要表現在三個方面:

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

  • 生态性: 引入 PSAgent,支援 PS-Service,便于接入其它機器學習架構
  • 函數性: 融合函數式程式設計特性,自定義 psFunc,利于開發複雜算法
  • 靈活性: 支援 Spark-on-Angel,Spark 無需修改核心,運作于 PS 模式之上

以下為新一代 Angel 開源平台架構更新以及性能優勢方面的具體介紹。

三大架構更新

1.PSService

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

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

新加入的中間層 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,其整體架構如下:

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

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

3.Spark on Angel

Spark 是目前非常流行的分布式記憶體計算架構,其核心概念是 RDD。不可變性是 RDD 的關鍵特性之一,它可以規避分布式環境下各種奇怪的複雜并行問題,進而快速開發各種分布式資料處理算法。然而在機器學習的時代,這個設計反而制約了 Spark 的發展。這源于機器學習核心——疊代和參數更新,RDD 的不可變性并不适合參數反複多次更新的需求,是以許多 Spark 機器學習算法的實作都非常的曲折而且不直覺。

在 Angel 提供的 PSService 和 psFunc 基礎上,Spark 可以充分利用 Angel 的 PS,可以以最小的修改代價,實作高速訓練大模型的能力。

Spark on Angel 實作的基本架構設計如下:

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

這個實作過程較為靈活,利用插件式設計,對 Spark 沒有任何侵入式修改,完全相容社群 Spark,對原生 Spark 程式不會産生任何影響。它的基本執行流程如下:

  • 啟動 SparkSession
  • 初始化 PSContext,啟動 Angel 的 PSServer
  • 建立 PSModelPool, 申請到 PSVector
  • 核心實作

在 RDD 運算中,直接調用 PSVector 進行模型更新,讓真正運作的 Task 調用 AngelPSClient 對遠端 PSServer 進行操作。

  • 終止 PSContext
  • 停止 SparkSession

線上上,基于真實的資料,研發團隊對 Spark on Angel 和 Spark 的做了性能對比測試,結果如下:

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

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

三大性能提升

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

1.GBDT

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

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

(資料:騰訊内部某性别預測資料集,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 相比可以快五倍左右。」

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

(資料:PubMED)

3.GD-LR

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

(1). GD-LR

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

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

(2).ADMM-LR

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

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

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

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

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

繼續閱讀