這篇文章調查分析了多個分布式機器學習平台所使用的設計方法,並提出了未來的研究方向。這是我與我的學生kuo zhang、salem alqahtani通力合作的成果。我們在2023年的秋天寫了這篇**,並且將在icccn'17(international conference on computer communications and networks,計算機通訊與網路國際會議)上介紹這篇文章。
機器學習,特別是深度學習(dl),最近已經在語音識別、影象識別、自然語言處理、推薦/搜尋引擎等領域獲得了成功。這些技術在自主駕駛汽車、數字衛生系統、crm、廣告、物聯網等方面都存在著非常有前景的應用。當然,資金驅動著這些技術以極快的速度向前發展,而且,最近我們已經看到了有很多機器學習平台正在建立起來。
由於在訓練過程中要涉及到龐大的資料集和模型的大小,因此機器學習平台通常是分布式平台,而且並行執行了10到100個作業來訓練模型。據估計,在不久的將來,資料中心的絕大多數任務將是機器學習任務。
我的知識背景是分布式系統,因此,我們決定從分布式系統的角度來研究這些機器學習平台,分析這些平台的通訊和控制瓶頸。我們還研究了這些平台的容錯性和程式設計的難易性。
我們根據三種基本的設計方法對分布式機器學習平台進行了分類,分別是:
基本資料流
引數伺服器模型
高階資料流
我們將對每一種方法進行簡單的介紹,我們使用apache spark作為基本資料流方法的示例,使用pmls(petuum)作為引數伺服器模型的示例,使用tensorflow和mxnet作為高階資料流模型的示例。 我們將提供它們之間的效能比較評估結果。有關更多的評估結果,請參閱本文最開始提到的那篇**。不幸的是,我們無法作為乙個來自學術界的小團隊進行規模上的評估。
在這篇文章的末尾,我對分布式機器學習平台的未來工作提出了總結性意見和建議。如果你已經有這些分布式機器學習平台的使用經驗,可以直接跳到文章的末尾。
在spark中,計算被建模為有向無環圖(dag, directed acyclic graph),其中的每個頂點表示彈性分布式資料集(rdd, resilient distributed dataset),每個邊表示rdd上的操作。 rdd是以邏輯分塊進行劃分的物件集合,它快取在記憶體中,當記憶體不夠時,會儲存到磁碟上。
在dag上,從頂點a到頂點b的邊e表示rdd b是在rdd a上執行操作e的結果。有兩種型別的操作:轉換和動作。轉換(例如,對映、過濾、連線)就是對rdd執行操作並產生新的rdd。
spark使用者將計算作為dag進行建模,該dag會轉換並執行rdd上的動作。dag會分階段進行編譯。每個階段將作為一系列的任務並行執行(每個分割槽乙個任務)。窄的依賴關係有利於高效的執行,而廣泛的依賴關係會帶來瓶頸,因為它們會破壞流水線,而且需要通訊密集的隨機操作。
spark中的分布式執行是通過對機器上的dag階段進行分塊來實現的。這個圖清晰地展示了master-worker架構。driver包含了兩個排程元件,dag排程器和任務排程器,用於給workers分配任務,以及協調workers。
spark是為一般資料處理而不是為機器學習設計的。然而,利用專用於spark的mllib,使得在spark上進行機器學習成為可能。在基本的設定中,spark將模型引數儲存在driver節點中,而workers與driver進行通訊,以便在每次迭代後更新引數。對於大規模的部署來說,模型引數可能不適合儲存在driver中,而應該將其作為rdd進行維護。這引入了很大的開銷,因為需要在每次迭代中建立新的rdd以儲存更新過的模型引數。更新模型包括在機器/磁碟之間混洗資料,這限制了spark的可擴充套件性。這是spark中基本資料流模型(dag)不足的地方。 spark不支援機器學習所需的迭代。
pmls從誕生的那一天起就是專門為機器學習設計的。它引入了引數伺服器(parameter-server,簡寫為ps)抽象用於迭代密集型機器學習訓練過程。
ps(在圖中用綠色的框表示)用於分布式記憶體鍵值的儲存。它複製和分片的方式是這樣的:每個節點既是模型中某個分片的主節點,又是其他分片的輔節點(或副本)。因此,ps可以通過增加節點數量的方法很容易地進行擴充套件。
ps節點用於儲存和更新模型引數,並響應workers的請求。workers從本地ps副本中請求最新的模型引數,並對分配給自己的資料集分割槽進行計算。
pmls還採用了ssp(stale synchronous parallelism,變味的同步並行)模型,它放寬了bsp(bulk synchronous parellelism,批量同步並行)模型中workers在每次迭代最後要進行同步操作的要求。 ssp減少了workers同步的難度,確保最快的worker不能在最慢的worker之前迭代。由於對過程中產生的雜訊具有一定的容錯能力,這個寬鬆的一致性模型仍可適用於機器學習訓練。 我已經在2023年4月的一篇部落格文章裡介紹了這一點。
所以,tensorflow正是為了實現這一目標而設計的。tensorflow採用了資料流範例,但在它的高階版本中,計算圖不需要是dag,但可以包括迴圈和支援可變狀態。我想,可能是naiad的設計對tensorflow產生了一些影響吧。
tensorflow中的計算可以表示為乙個帶有節點和邊的有向圖。節點表示具有可變狀態的計算。邊表示在節點之間傳遞的多維資料矩陣(張量)。 tensorflow要求使用者靜態地宣告這個符號計算圖,並且使用圖形的重寫和分割槽來讓機器進行分布式的執行。
如上圖所示,這個tensorflow中的分布式機器學習訓練使用了引數伺服器的方法。在tensorflow中使用ps抽象的時候,可以使用引數伺服器和資料並行機制。對於tensorflow來說,你可以做更為複雜的事情,但這需要編寫自定義**並走入未知的領域。
為了對這些平台進行評估,我們使用了amazon ec2 m4.xlarge例項。每個例項包含由intel xeon e5-2676 v3處理器和16gb ram組成的4個vcpu。ebs頻寬為750mbps。我們使用兩種常見的機器學習任務進行評估:使用多層神經網路的二級邏輯回歸和影象分類。我只是在這裡提供幾張圖,請檢視我們的**以進行更多的實驗。我們的實驗有幾個限制:我們使用的機器比較少,不能進行規模上的測試。我們的測試僅限於cpu計算,並沒有進行gpu計算測試。
該圖顯示了邏輯回歸平台的速度。spark比pmls和mxnet慢,但表現得還算可以。
該圖顯示了dnn平台的速度。與單層邏輯回歸相比,spark的效能損失比兩層nn更大,這是因為需要更多的迭代計算。這裡,我們將driver的引數儲存在spark中。如果我們將引數儲存在rdd中並且在每次迭代之後進行更新,情況會更糟。
該圖顯示了平台的cpu利用率。 spark應用程式的cpu利用率明顯比較高,主要是因為存在序列化的開銷。以前的工作已經指出了這個問題。
機器學習/深度學習應用程式有著令人尷尬的並行機制,而且從併發演算法角度來看也並不是很有趣。可以肯定的是,引數伺服器方法贏得了分布式機器學習平台訓練的青睞。
至於瓶頸問題,網路仍然是分布式機器學習應用程式的瓶頸。更好的資料或模型分級比更先進的通用資料流平台更有用,請重視資料和模型。
然而,也存在著一些令人驚訝和微妙的地方。 在spark中,cpu開銷正在成為比網路限制更為重要的瓶頸。 spark中使用的程式語言(例如scala/jvm)會顯著影響它的效能。因此,特別需要乙個更好的工具來進行分布式機器學習平台的監控和效能**。近來,已經出現了一些能夠解決spark資料處理程式問題的工具,例如ernest和cherrypick。
支援機器學習執行時的分布式系統存在著許多懸而未決的問題,例如資源排程和執行時效能提公升。通過對應用程式執行時的監控和分析,下一代分布式機器學習平台應該要為正在執行的任務提供計算、記憶體、網路資源的通用執行時彈性配置和排程。
最後,還有程式設計和軟體工程支援方面的問題有待解決。適用於機器學習應用程式的分布式程式設計抽象是什麼?還需要更多的研究來檢驗和確認分布式機器學習應用程式。
文章為簡譯,更為詳細的內容,請檢視原文
分布式機器學習第3章 分布式機器學習框架
q 需要使用到分布式機器學習有哪三種情形?q 對於計算量太大時的分布式機器學習解決辦法 q 對於訓練資料太多時的分布式機器學習解決辦法 q 對於模型規模太大時的分布式機器學習解決辦法 q 目前分布式機器學習領域的主要矛盾是?q 分布式機器學習的主要組成模組有哪四個?q 分布式機器學習的資料劃分中,對...
分布式機器學習dask
分布式機器學習 dask是乙個資料分析的平行計算的框架。pip安裝 pip install dask compete install everything pip install dask install only core cluster 部署 安裝dask 1.2.2 conda install...
分布式機器學習主要筆記
mahout是hadoop的乙個機器學習庫,主要的程式設計模型是mapreduce 每個企業的資料都是多樣的和特別針對他們需求的。然而,在對那些資料的分析種類上卻沒多少多樣性。mahout專案是實施普通分析計算的乙個hadoop庫。用例包括使用者協同過濾 使用者建議 聚類和分類。mllib 執行在s...