摘要: [導讀]近日紐約州立大學布法羅分校計算機科學與工程教授、Petuum Inc.顧問Murat Demirbas和他的兩位學生一起發表了一篇對比現有分佈式機器學習平台的論文,對Spark、PMLS和TensorFlow等平台的架構和性能進行了比較和介紹。


作者:Murat Demirbas

分佈式機器學習是機器學習領域的一大主要研究方向。Murat Demirbas教授在論文公佈後還發表了一篇解讀博客文章,本文就是對這篇文章的編譯介紹,論文原文可訪問:https://www.cse.buffalo.edu/~demirbas/publications/DistMLplat. pdf。

這篇論文調查了分佈式機器學習平台所用的設計方法,並提出了未來的研究方向。

機器學習(尤其是深度學習)最近已經在語音識別、圖像識別、自然語言處理和推薦/搜索引擎等方面取得了變革性的成功。這些技術在自動駕駛汽車、數字醫療系統、CRM、廣告、物聯網等方面的應用非常有前途。當然,資本帶領/推動著機器學習加速發展,我們看到近段時間以來已經誕生了很多機器學習平台。

因為訓練過程涉及到巨大的數據集的模型,機器學習平台往往是分佈式的,它們往往會使用並行的幾十個或幾百個工作器(worker)來訓練模型。據估計,在不久的將來,數據中心中運行的絕大多數任務都將會是機器學習任務。

我有分佈式系統的研究背景,所以我們決定從分佈式系統的角度研究這些機器學習平台並分析其通信和控制局限。我們也調查了這些平台的容錯能力和編程難度。

我們將這些分佈式機器學習平台歸類為了三大基本設計方法:

  1. 基本數據流(basic dataflow)
  2. 參數服務器模型(parameter-server model)
  3. 先進數據流(advanced dataflow)

我們對這三種方法進行了簡要介紹並舉例進行了說明,其中基本數據流方法使用了Apache Spark、參數服務器模型使用了PMLS(Petuum)、先進數據流模型使用了TensorFlow 和MXNet。我們提供了幾個比較性能的評估結果。論文裡還有更多評估結果。不幸的是,作為學術界的一個小團隊,我們無法進行大規模的評估。

在本文末尾,我給出了對分佈式機器學習平台未來研究工作的總結和建議。如果你已經了解這些分佈式機器學習平台,可以直接跳至末尾查看結論。

Spark

在Spark 中,計算被建模成有向無環圖(DAG:directed acyclic graph),其中每一個頂點都代表一個彈性分佈式數據集(RDD:Resilient Distributed Dataset),每一條邊都代表對RDD 的一個運算。RDD 是被分到了不同邏輯分區的對象的集合,這些邏輯分區是作為in-memory 存儲和處理的,帶有到磁盤的shuffle/overflow。

在一個DAG 中,從頂點A 到頂點B 的邊E 表示:RDD B 是在RDD A 上執行運算E 後得到的結果。運算有兩種:變換(transformation)和動作(action)。變換(比如:映射、過濾、連接)是指在一個RDD 上執行一種運算生成一個新的RDD。

大數據

Spark 用戶需要將計算建模為DAG,從而在RDD 上進行變換或運行動作。DAG 需要被編譯為stage。每個stage 作為一系列並行運行的任務執行(每個分區執行一個任務)。簡單狹窄的依賴關係有利於高效執行,而寬廣的依賴關係會引入瓶頸,因為它們會擾亂流程,而且需要通信密集的shuffle 運算。

大數據

Spark 中的分佈式執行是通過將這種DAG stage 分割到不同的機器上執行的。這張圖清晰地顯示了這種master-worker 架構。驅動器(driver)包含了任務和兩個調度器(scheduler)組件——DAG 調度器和任務調度器;並且還要將任務對應到工作器。

Spark 是為一般的數據處理設計的,並不特定於機器學習。但是使用MLlib for Spark,也可以在Spark 上進行機器學習。在基本的設置中,Spark 將模型參數存儲在驅動器節點,工作器與驅動器通信從而在每次迭代後更新這些參數。對於大規模部署而言,這些模型參數可能並不適合驅動器,並且會作為一個RDD 而進行維護更新。這會帶來大量額外開銷,因為每次迭代都需要創造一個新的RDD 來保存更新後的模型參數。更新模型涉及到在整個機器/磁盤上重排數據,這就限制了Spark 的擴展性。這是Spark 的基本數據流模型(DAG)的不足之處。Spark 並不能很好地支持機器學習所需的迭代。

PMLS

PMLS 是專為機器學習設計的,沒有其它雜亂的歷史。它引入了參數服務器(PS: parameter-server)的抽象概念,支持密集迭代的機器學習訓練過程。

大數據

其中PS(圖中綠色方框)被用作分佈式的內存鍵值存儲(distributed in-memory key-value store)。它會被複製和共享:每個節點都被用作這個模型(參數空間)一個分片的主節點以及其它分片的次要節點/副本。因此在節點數量方面,PS 可以很好地擴展。

PS 節點會存儲和更新模型參數以及響應來自工作器的請求。工作器會請求來自它們的局部PS 副本的最新模型參數,並在分配給它們的數據集部分上執行計算。

PMLS 還採用了SSP(Stale Synchronous Parallelism)模型,這比BSP(Bulk Synchronous Parellelism)模型更寬鬆——其中工作器在每次迭代結束時同步。SSP 為工作器的同步減少了麻煩,確保最快的工作器不能超過最慢的工作器s 次迭代。寬鬆的一致性模型仍然可以用於機器學習訓練,因為這個過程有一定的噪聲容錯能力,我在2016 年4 月的這篇文章中談過這個問題:https://muratbuffalo.blogspot.com/2016 /04/petuum-new-platform-for-distributed.html

TensorFlow

谷歌有一個基於參數服務器模型的分佈式機器學習平台DistBelief。參閱我對DistBelief 論文的評論:https://muratbuffalo.blogspot.com/2017/01/google-distbelief-paper-large-scale.html。在我看來,DistBelief 的主要缺陷是:為了編寫機器學習應用,需要操作低級代碼。谷歌想要自己的所有員工無需精通分佈式執行就能編寫機器學習代碼——基於同樣的理由,谷歌為大數據處理編寫了MapReduce 框架。

所以為了實現這一目標,谷歌設計了TensorFlow。TensorFlow 採用了數據流範式,但是是一種更高級的版本——其中計算圖無需是DAG,而且包含循環且支持可變狀態。我認為Naiad 設計可能對TensorFlow 設計有所影響。

TensorFlow 使用節點和邊的有向圖來表示計算。節點表示計算,狀態可變。而邊則表示多維數據數組(張量),在節點之間傳輸。TensorFlow 需要用戶靜態聲明這種符號計算圖,並對該圖使用複寫和分區(rewrite & partitioning)將其分配到機器上進行分佈式執行。(MXNet,尤其是DyNet 使用了圖的動態聲明,這改善了編程的難度和靈活性。)

大數據

TensorFlow 中的分佈式機器學習訓練使用瞭如圖所示的參數服務器方法。當你在TensorFlow 中使用PS 抽象時,你就用到了參數服務器和數據並行。TensorFlow 讓你還能做更複雜的事情,但那需要編寫自定義代碼並進入全新的疆域。

一些評估結果

我們的評估使用了Amazon EC2 m4.xlarge 實例。每個實例包含4 個由Intel Xeon E5-2676 v3 驅動的vCPU 和16 GiB RAM。EBS 帶寬為750Mbps。我們使用了兩個常見的機器學習任務進行評估:二分類logistic 回歸和使用多層神經網絡的圖像分類。我在這裡僅給出了幾張圖,查看我們的論文可以了解更多實驗。但我們的實驗還有一些局限性:我們使用了少量機器,不能大規模測試。我們也限制了CPU 計算,沒有測試GPU。

大數據

這幅圖展示了各平台的logistic 回歸執行速度。Spark 表現不錯,但落後於PMLS 和MXNet。

大數據

這幅圖展示了各平台的深度神經網絡(DNN)執行速度。相比於單層的logistic 回歸,Spark 在兩層神經網絡上有更大的性能損失。這是因為兩層網絡需要更多迭代計算。在Spark 中我們將參數保存在驅動器中,這樣它們可以擬合;如果我們將參數保存在一個RDD 中並且在每次迭代後更新,情況還會變得更加糟糕。

大數據

這幅圖給出了各平台的CPU 利用率。Spark 應用似乎有明顯很高的CPU 利用率,這主要是因為序列化(serialization)的額外開銷。我們更早期的工作已經指出了這一問題:https://muratbuffalo.blogspot.com/2017/05/paper-summary-making-sense-of.html

總結與未來方向

機器學習/深度學習應用的並行處理讓人為難,而且從並發算法(concurrent algorithms)的角度看並不非常有趣。可以相當肯定地說參數服務器方法在分佈式機器學習平台的訓練上更好。

至於局限性方面,網絡仍然是分佈式機器學習應用的一個瓶頸。提供更好的數據/模型分級比更先進的通用數據數據流平台更有用;應該將數據/模型看作頭等公民。

但是,可能會有一些讓人驚奇和微妙的地方。在Spark 中,CPU 開銷會先於網絡限制變成瓶頸。Spark 使用的編程語言Scala/JVM 顯著影響了其性能表現。因此分佈式機器學習平台尤其需要更好的監控和/或性能預測工具。最近已經有人提出了一些解決Spark 數據處理應用的問題的工具,比如Ernest 和CherryPick。

在機器學習運行時的分佈式系統支持上還有很多懸而未決的問題,比如資源調度和運行時的性能提升。對應用使用運行時監控/性能分析,下一代分佈式機器學習平台應該會提供任務運行的計算、內存、網絡資源的詳細的運行時彈性配置/調度。

最後,在編程和軟件工程支持方面也有一些待解決的問題。什麼樣的(分佈式)編程抽象思想適用於機器學習應用?另外在分佈式機器學習應用的檢驗和驗證(尤其是使用有問題的輸入來測試DNN)上也還需要更多研究。

 

轉貼自: 36大數據


留下你的回應

以訪客張貼回應

0

在此對話中的人們

熱門標籤雲

每月文章