1. 程式人生 > >分散式機器學習平臺大比拼:Spark、PMLS、TensorFlow、MXNet

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

  本論文從分散式系統的角度開展針對當前一些機器學習平臺的研究,綜述了這些平臺所使用的架構設計,對這些平臺在通訊和控制上的瓶頸、容錯性和開發難度進行分析和對比,並對分散式機器學習平臺的未來研究工作提出了一些建議。文中的工作由 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 的電腦科學與技術系