分布式機器學習平臺大比拼:Spark、PMLS、TensorFlow、MXNet

2020-12-11 中國機器人網

  本論文從分布式系統的角度開展針對當前一些機器學習平臺的研究,綜述了這些平臺所使用的架構設計,對這些平臺在通信和控制上的瓶頸、容錯性和開發難度進行分析和對比,並對分布式機器學習平臺的未來研究工作提出了一些建議。文中的工作由 Murat Demirbas 教授與他的研究生 Kuo Zhang 和 Salem Alqahtani 共同完成。

 

  機器學習,特別是深度學習,已在語音識別、圖像識別和自然語言處理以及近期在推薦及搜尋引擎等領域上取得了革命性的成功。這些技術在無人駕駛、數字醫療系統、CRM、廣告、物聯網等領域具有很好的應用前景。當然,是資金引領和驅動了技術的加速推進,使得我們在近期看到了一些機器學習平臺的推出。

 

  考慮到訓練中所涉及的數據集和模型的規模十分龐大,機器學習平臺通常是分布式平臺,部署了數十個乃至數百個並行運行的計算節點對模型做訓練。據估計在不遠的將來,數據中心的大多數任務都會是機器學習任務。

 

  我來自於分布式系統研究領域,因此我們考慮從分布式系統的角度開展針對這些機器學習平臺的研究,分析這些平臺在通信和控制上的瓶頸。我們還考慮了這些平臺的容錯性和易編程性。

 

  我們從設計方法上將機器學習平臺劃分為三個基本類別,分別是:基本數據流、參數 - 伺服器模型和高級數據流。

 

  下面我們將對每類方法做簡要介紹,以 Apache Spark 為例介紹基本數據流,以 PMLS(Petuum)為例介紹參數伺服器模型,而高級數據流則使用 TensorFlow 和 MXNet 為例。我們對比了上述各平臺的性能並給出了一系列的評估結果。要了解詳細的評估結果,可參考我們的論文。遺憾的是,作為一個小型研究團隊,我們無法開展大規模的評估。

 

  在本篇博文的最後,我給出了一些結論性要點,並對分布式機器學習平臺的未來研究工作提出了一些建議。對這些分布式機器學習平臺已有一定了解的讀者,可以直接跳到本文結尾。

 

  Spark

 

  在 Spark 中,計算被建模為一種有向無環圖(DAG),圖中的每個頂點表示一個 RDD,每條邊表示了 RDD 上的一個操作。RDD 由一系列被切分的對象(Partition)組成,這些被切分的對象在內存中存儲並完成計算,也會在 Shuffle 過程中溢出(Overflow)到磁碟上

 

  在 DAG 中,一條從頂點 A 到 B 的有向邊 E,表示了 RDD B 是在 RDD A 上執行操作 E 的結果。操作分為「轉換」(Transformation)和「動作(Action)」兩類。轉換操作(例如 map、filter 和 join)應用於某個 RDD 上,轉換操作的輸出是一個新的 RDD。

 

  Spark 用戶將計算建模為 DAG,該 DAG 表示了在 RDD 上執行的轉換和動作。DAG 進而被編譯為多個 Stage。每個 Stage 執行為一系列並行運行的任務(Task),每個分區(Partition)對應於一個任務。這裡,有限(Narrow)的依賴關係將有利於計算的高效執行,而寬泛(Wide)的依賴關係則會引入瓶頸,因為這樣的依賴關係引入了通信密集的 Shuffle 操作,這打斷了操作流 。

 

  Spark 的分布式執行是通過將 DAG Stage 劃分到不同的計算節點實現的。上圖清晰地展示了這種「主機(master)- 工作者(worker)」架構。驅動器(Driver)包含有兩個調度器(Scheduler)組件,即 DAG 調度器和任務調度器。調度器對工作者分配任務,並協調工作者。

 

  Spark 是為通用數據處理而設計的,並非專用於機器學習任務。要在 Spark 上運行機器學習任務,可以使用 MLlib for Spark。如果採用基本設置的 Spark,那麼模型參數存儲在驅動器節點上,在每次迭代後通過工作者和驅動器間的通信更新參數。如果是大規模部署機器學習任務,那麼驅動器可能無法存儲所有的模型參數,這時就需要使用 RDD 去容納所有的參數。這將引入大量的額外開銷,因為為了容納更新的模型參數,需要在每次迭代中創建新的 RDD。更新模型會涉及在機器和磁碟間的數據 Shuffle,進而限制了 Spark 的擴展性。這正是基本數據流模型(即 DAG)的短板所在。Spark 並不能很好地支持機器學習中的迭代運算。

 

  PMLS

 

  PMLS 是專門為機器學習任務而設計的。它引入了稱為「參數 - 伺服器」(Parameter-Server,PS)的抽象,這種抽象是為了支持迭代密集的訓練過程。

 

  PS(在圖中以綠色方框所示)以分布式 key-value 數據表形式存在於內存中,它是可複製和分片的。每個節點(node)都是模型中某個分片的主節點(參數空間),並作為其它分片的二級節點或複製節點。這樣 PS 在節點數量上的擴展性很好。

 

  PS 節點存儲並更新模型參數,並響應來自於工作者的請求。工作者從自己的本地 PS 拷貝上請求最新的模型參數,並在分配給它們的數據集分區上執行計算。

 

  PMLS 也採用了 SSP(Stale Synchronous Parallelism)模型。相比於 BSP(Bulk Synchronous Parellelism)模型 ,SSP 放寬了每一次迭代結束時各個機器需做同步的要求。為實現同步,SSP 允許工作者間存在一定程度上的不同步,並確保了最快的工作者不會領先最慢的工作者 s 輪迭代以上。由於處理過程處於誤差所允許的範圍內,這種非嚴格的一致性模型依然適用於機器學習。我曾經發表過一篇博文專門介紹這一機制。

 

  TensorFlow

 

  Google 給出了一個基於分布式機器學習平臺的參數伺服器模型,稱為「DistBelief」(此處是我對 DistBelief 論文的綜述)。就我所知,大家對 DistBelief 的不滿意之處主要在於,它在編寫機器學習應用時需要混合一些底層代碼。Google 想使其任一僱員都可以在無需精通分布式執行的情況下編寫機器學習代碼。正是出於同一原因,Google 對大數據處理編寫了 MapReduce 框架。

 

  TensorFlow 是一種設計用於實現這一目標的平臺。它採用了一種更高級的數據流處理範式,其中表示計算的圖不再需要是 DAG,圖中可以包括環,並支持可變狀態。我認為 TensorFlow 的設計在一定程度上受到了 Naiad 設計理念的影響。

 

  TensorFlow 將計算表示為一個由節點和邊組成的有向圖。節點表示計算操作或可變狀態(例如 Variable),邊表示節點間通信的多維數組,這種多維數據稱為「Tensor」。TensorFlow 需要用戶靜態地聲明邏輯計算圖,並通過將圖重寫和劃分到機器上實現分布式計算。需說明的是,MXNet,特別是 DyNet,使用了一種動態定義的圖。這簡化了編程,並提高了編程的靈活性。

 

  如上圖所示,在 TensorFlow 中,分布式機器學習訓練使用了參數 - 伺服器方法。當在 TensorFlow 中使用 PS 抽象時,就使用了參數 - 伺服器和數據並行。TensorFlow 聲稱可以完成更複雜的任務,但是這需要用戶編寫代碼以通向那些未探索的領域。

 

  MXNet

 

  MXNet 是一個協同開源項目,源自於在 2015 年出現的 CXXNet、Minverva 和 Purines 等深度學習項目。類似於 TensorFlow,MXNet 也是一種數據流系統,支持具有可變狀態的有環計算圖,並支持使用參數 - 伺服器模型的訓練計算。同樣,MXNet 也對多個 CPU/GPU 上的數據並行提供了很好的支持,並可實現模型並行。MXNet 支持同步的和異步的訓練計算。下圖顯示了 MXNet 的主要組件。其中,運行時依賴引擎分析計算過程中的依賴關係,對不存在相互依賴關係的計算做並行處理。MXNet 在運行時依賴引擎之上提供了一個中間層,用於計算圖和內存的優化。

 

  MXNet 使用檢查點機制支持基本的容錯,提供了對模型的 save 和 load 操作。save 操作將模型參數寫入到檢查點文件,load 操作從檢查點文件中讀取模型參數。

 

  MXNet 使用描述式程式語言表述計算為一個有向圖,也支持使用一些指令式編程去定義 tensor 的計算和控制流。MXNet 提供了多種語言(例如 C++、Python、R 和 Scala 等)編寫的客戶端 API。與 TensorFlow 一樣,MXNet 的後臺核心引擎庫同樣是使用 C++ 編寫的。

 

  部分評估結果

 

  在我們的實驗中,使用了 Amazon EC2 m4.xlarge 實例。每個實例具有 4 個由 Intel Xeon E5-2676 v3 實現的 vCPU,及 16GB 的內存,EBS 帶寬是 750Mbps。我們對兩種常見的機器學習任務進行了實驗,它們分別是二分類邏輯斯蒂回歸和使用多層神經網絡的圖像分類。本文中只給出了部分結果圖,更多的實驗結果可參見我們的論文。需指出的是,我們的實驗具有一些局限性。首先,我們使用機器數量不大,不能測試擴展性。其次,我們也只使用了 CPU 計算,並未測試 GPU 的使用情況。

 

  該圖展示了各個平臺對邏輯斯蒂回歸的計算速度。PMLS 和 MXNet 是最快的兩個系統,TensorFlow 速度最慢,而 Spark 介於兩者之間。對此,我們分析認為是由多個原因導致的。首先,相比於 Spark 和 TensorFlow,PMLS 是一個輕量級系統,它是採用高性能 C++ 程式語言實現的,而 Spark 是使用運行在 JVM 上的 Scala 語言編寫的。其次,PMLS 中包含的抽象較少,而 TensorFlow 中則具有過多的抽象。抽象增加了系統的複雜度,並導致運行時開銷。

 

  該圖展示了 DNN 在各個平臺上的速度。相比於單層神經網絡,當發展到兩層神經網絡時,由於需要更多的迭代計算,Spark 的性能下降。我們將模型參數存儲在 Spark 的驅動器中,因為驅動器可以容納這些參數。但是如果我們使用 RDD 保持參數,並在每次迭代後做更新,結果可能會更差。

 

  該圖展示了平臺的 CPU 佔用率。Spark 應用看上去具有偏高的 CPU 佔用率,這主要來自於序列化的開銷。有些前期工作也指出了同一問題。

 

  結論及未來的研究方向

 

  機器學習和深度學習應用是高度可並行的,但是從並發算法角度看,要做到並不那麼容易。可以說,參數 - 伺服器方法最適合於分布式機器學習平臺的訓練任務。

 

  考慮到瓶頸,網絡依然是分布式機器學習應用的瓶頸。相比於更高級的通用數據流平臺,更重要的是要提出對數據和模型的更好組織和參與機制。應將數據和模型視作一等公民。

 

  此外,還有其它一些因素對平臺具有微妙的影響。對於 Spark,CPU 開銷成為比網絡局限更嚴重的瓶頸問題。Spark 使用的程式語言是 Scala 等 JVM 語言,這對 Spark 的性能具有顯著的影響。因此存在著對更好的監控工具以及對分布式機器學習平臺性能預測的需求。近期已經出現了一些工具,例如 Ernest 和 CherryPick,它們解決了一些 Spark 數據處理應用上的問題。

 

  對於支持機器學習的運行時分布式系統,依然存在著一些開放問題,例如資源調度和運行時性能改進。考慮到應用的運行時監控和性能分析,下一代的分布式機器學習平臺應提供對運行於平臺上任務的計算、內存、網絡資源的運行時彈性配置和調度等能力。

 

  在編程和軟體工程的支持上,也同樣有一些開放問題。什麼是適合機器學習應用的分布式編程抽象?這些問題還需要做進一步的研究,並對分布式機器學習應用進行檢驗和驗證,例如使用特定問題輸入測試 DNN。

 

  參考文獻

 

  論文原文:https://www.cse.buffalo.edu/~demirbas/publications/DistMLplat.pdf

 

  Learning Machine Learning: A beginner's journey,https://muratbuffalo.blogspot.com/2016/12/learning-machine-learning-beginners.html

 

  Paper Review. Petuum: A new platform for distributed machine learning on big data,https://muratbuffalo.blogspot.com/2016/04/petuum-new-platform-for-distributed.html

 

  Google DistBelief paper: Large Scale Distributed Deep Networks,https://muratbuffalo.blogspot.com/2017/01/google-distbelief-paper-large-scale.html

 

  Paper summary: Making sense of Performance in Data Analytics Frameworks (NSDI 15),https://muratbuffalo.blogspot.com/2017/05/paper-summary-making-sense-of.html

 

  Naiad: A timely dataflow system,http://muratbuffalo.blogspot.hk/2014/03/naiad-timely-dataflow-system.html

 

  Paper summary: Making sense of Performance in Data Analytics Frameworks (NSDI 15),http://muratbuffalo.blogspot.hk/2017/05/paper-summary-making-sense-of.html

 

  https://spark-summit.org/east-2017/events/ernest-efficient-performance-prediction-for-advanced-analytics-on-apache-spark/

 

  https://blog.acolyer.org/2017/05/04/cherrypick-adaptively-unearthing-the-best-cloud-configurations-for-big-data-analytics/

 

  作者介紹

 

  Murat Demirbas教授供職於 University at Buffalo,SUNY 的計算機科學與技術系。

相關焦點

  • 橫向對比三大分布式機器學習平臺:Spark、PMLS、TensorFlow
    | 全文共4905字,建議閱讀時長5分鐘 | 內容來源:muratbuffalo轉載公眾號:機器之心微信號:almosthuman2014作者:Murat Demirbas參與:Panda分布式機器學習是機器學習領域的一大主要研究方向。
  • 基於TensorFlow的深度學習實戰
    圖像、視頻、文本、音頻等領域的問題,都可以通過深度學習解決。TensorFlow可以用於實現前述所有應用。TensorFlow很快成為GitHub上用戶最多的深度學習框架。這個庫之所以如此流行,是因為開發人員可以輕鬆的用其來搭建、測試和部署機器學習應用。上面是一個TensorFlow的示意圖。
  • TensorFlow這麼玩:在Spark上試跑谷歌的深度學習圖書館
    介紹Arimo的日益增長的數據科學團隊包括研究和開發機器學習和深入學習新的方法和應用。我們正在調查的一個主題是分布式的深度學習。當數據集和模型非常大時,我們就會發現與深度學習相融合的模式和預測值的價值和品種。然而,如果數據或模型不適合機器的內存,培養大型模型可能就會很慢或很難。
  • TensorFlow分布式訓練MNIST分類器
    本節以分布式方式訓練完整的 MNIST 分類器。
  • 某小夥0基礎入門深度學習,代碼演示Tensorflow 計算圖基礎
    1、計算圖講到計算圖,就能和分布式的計算流程扯上關係,下面講講計算圖的區別tensorflow和Spark的圖計算流程差不多1.1 最基礎的單元a、Spark的計算圖最基礎的單元是rdd(彈性分布式數據集
  • 淺顯易懂的分布式TensorFlow入門教程
    本文是一篇淺顯易懂的分布式TensorFlow入門教程,可以讓你對分布式TensorFlow的原理和使用有一定的了解。1.https://github.com/tensorflow/tensorflow/blob/r1.3/tensorflow/python/training/monitored_session.py作者 | Tutorials by Malo Marrec 編譯 | 專知整理 | HujunHow
  • TensorFlow和Caffe、MXNet、Keras等其他深度學習框架的對比
    Julia: http://github.com/malmaud/TensorFlow.jlNode.js: http://github.com/node-tensorflow/node-tensorflowR: http://github.com/rstudio/tensorflowTensorFlow 也有內置的 TF.Learn 和 TF.Slim
  • TensorFlow和Caffe、CNTK、MXNet等其他7種深度學習框架的對比
    Julia:github.com/malmaud/TensorFlow.jlNode.js:github.com/node-tensorflow/node-tensorflowR:github.com/rstudio/tensorflowTensorFlow
  • 帶你入門機器學習與TensorFlow2.x
    準備硬體環境由於本專欄中代碼所使用的模型很多都比較大,所以建議讀者準備一個帶有 GPU 的機器,並使用和GPU 相配套的主板及電源。如果不想自己準備訓練模型的機器,則可以用雲服務的方式訓練模型。雲服務是需要單獨購買的,且按使用時間收費。如果不需要頻繁訓練模型,則推薦使用這種方式。讀者在學習本書的過程中,需要頻繁訓練模型。如果使用雲服務,則會花費較高的成本。
  • 大數據下基於Tensorflow框架的深度學習示例教程
    當數據膨脹到一定規模時,基於機器學習對海量複雜數據的分析更能產生較好的價值,而深度學習在大數據場景下更能揭示數據內部的邏輯關係。本文就以大數據作為場景,通過自底向上的教程詳述在大數據架構體系中如何應用深度學習這一技術。
  • 對比深度學習十大框架:TensorFlow 並非最好?
    TensorFlow連結:https://www.tensorflow.org/對於那些聽說過深度學習但還沒有太過專門深入的人來說,TensorFlow 是他們最喜歡的深度學習框架,但在這裡我要澄清一些事實。
  • 業界 | 詳解Horovod:Uber開源的TensorFlow分布式深度學習框架
    在大部分情況下,模型是可以在單個或多 GPU 平臺的伺服器上運行的,但隨著數據集的增大和訓練時間的增長,有些時候訓練需要一周甚至更長時間。因此,Uber 的工程師們不得不尋求分布式訓練的方法。/tensorflow-allreduce)。
  • TensorFlow與PyTorch之爭,哪個框架最適合深度學習
    選自builtin作者:Vihar Kurama機器之心編譯參與:吳攀、杜偉谷歌的 Tensorflow 與 Facebook 的 PyTorch 一直是頗受社區歡迎的兩種深度學習框架。論文地址:http://download.tensorflow.org/paper/whitepaper2015.pdfTensorFlow 現已被公司、企業與創業公司廣泛用於自動化工作任務和開發新系統,其在分布式訓練支持、可擴展的生產和部署選項、多種設備(比如安卓)支持方面備受好評。
  • Tensorflow 2.0 到底好在哪裡?
    TensorFlow 現在已經不僅是一個單純的工具包了,而是發展成為了一個平臺,在易用性、分布式訓練和部署等方面都取得了長足的進步。 如今已經沒有人質疑機器學習和深度學習的重要性了。數十年來這一行業讓人們見識過無數承諾、騙局和失望,時至今日兩大技術終於帶來了眾多實際應用。機器學習或深度學習應用離充分完善還有很長的路要走,但現有的成果已經非常喜人了。
  • 簡化TensorFlow和Spark互操作性:LinkedIn開源Spark-TFRecord
    TensorFlow 是市場上最流行的深度學習框架,而 Apache Spark 仍然是被廣泛採用的數據計算平臺之一,從大型企業到初創公司都能見到它們的身影。很自然會有公司嘗試將這兩者結合起來。雖然有一些框架能夠讓 TensorFlow 適應 Spark,但互操作性挑戰的根源性往往在於數據級別上。
  • 分布式深度學習最佳入門(踩坑)指南
    2.TensorFlowTensorFlow是谷歌開源的深度學習框架,它包含各種工具、庫和社區資源,是一個比較全面而複雜的深度學習平臺,在pytorch之前的很長一段時間,tensorflow不過即便如此,tensorflow由於其性能和易於部署的優勢,還是在深度學習框架領域佔據了半壁江山。接口在Tensorflow中,需要通過tf.distribute.Strategy接口來定義分布式策略,並通過這些不同的策略,來進行模型的分布式訓練。
  • 獨家 | 一文讀懂TensorFlow(附代碼、學習資料)
    使用TF之前,首先導入它:import tensorflow as tfx = tf.placeholder("float", [None, 784])y_ = tf.placeholder("float", [None, 10])
  • 深度| 對比深度學習十大框架:TensorFlow最流行但並不是最好
    在 BEEVA Labs,我們常常需要應對許多不同的深度學習庫,所以我希望能夠將我們的發現和感想分享出來,幫助那些剛剛進入深度學習這一美麗世界的人。」TensorFlow連結:https://www.tensorflow.org/對於那些聽說過深度學習但還沒有太過專門深入的人來說,TensorFlow 是他們最喜歡的深度學習框架,但在這裡我要澄清一些事實。
  • 對比深度學習十大框架:TensorFlow最流行但並不是最好
    TensorFlow連結:https://www.tensorflow.org/對於那些聽說過深度學習但還沒有太過專門深入的人來說,TensorFlow 是他們最喜歡的深度學習框架,但在這裡我要澄清一些事實。
  • 深度 對比深度學習十大框架:TensorFlow最流行但並不是最好
    TensorFlow連結:https://www.tensorflow.org/對於那些聽說過深度學習但還沒有太過專門深入的人來說,TensorFlow 是他們最喜歡的深度學習框架,但在這裡我要澄清一些事實。