519
京東網上商城
Arimo利用Alluxio的內存能力提升深度學習模型的結果效率(Time-to-Result)
深度學習算法通常被一些具體應用所采用,其中比較顯著的應用領域包括計算機視覺、機器翻譯、文本挖掘、欺詐檢測等。深度學習的方法在大模型加大數據的場景下效果顯著。與此同時,被設計用來處理大數據的分布式計算平台(如Spark)也日益應用廣泛。因此,通過在Spark平台上開發深度學習計算框架,深度學習的應用領域可以變得更加廣泛,企業完全可以在已有的Spark基礎設施上使用深度學習。
1.利用Alluxio協處理器進行基於Spark的分布式深度學習
在2015 Strata + Hadoop World NYC上,我們發布了有史以來第一個可擴展的、基於Spark和Alluxio的分布式深度學習框架,我們把它稱為Alluxio協處理器(Co-Processor on Alluxio(“Co-Proccessor”))。它包含了前饋神經網絡,卷積神經網絡(CNN)以及循環神經網絡(RNN)的實現。協處理器為Alluxio增加了一定的計算功能。具體來說,其運行一個本地進程監控衍生的目錄並且收集它們。該設計思路是不僅將Alluxio用作Spark的workers之間的常用存儲層,還將其用作一個模型更新者以支持大模型的訓練。通過Alluxio的分布式內存執行模型,該協處理器框架為單機無法處理的巨大模型提供了一種可擴展的處理方式。
圖1. Alluxio架構上的協處理器
進程A(計算梯度):Spark的workers計算梯度,處理數據的並行劃分
進程B(更新參數):Alluxio執行(梯度)下降操作,更新主模型
每個Spark的worker都隻處理一批訓練數據中的一部分,計算梯度,並發送回協處理器上的參數服務器。參數服務器不僅僅收集梯度信息,同時會作為一個協處理器執行(梯度)下降操作,然後更新存儲在Alluxio上的模型(進程B)。值得注意的是,進程A和B基本上是異步發生的。
這樣的設計讓我們避免了:
- 將聚合梯度發送回Spark的workers
-
將更新過的模型發送給wokers,因為Spark workers現在能夠直接訪問Alluxio上的更新過的模型了。
這種方案的結果是,通過減少Spark workers和參數服務器的通信開銷,能夠將模型訓練過程顯著地加速60%。
2.持續開發
火熱的開源深度學習框架如Tensorflow自身具有一套分布式模型訓練體係架構,通常使用一個GPU集群來對訓練數據的不同部分同時計算梯度。然而,這些訓練框架對大規模數據集做ETL的能力還非常有限。
一個方法是使用Spark預處理數據為Tensorflow服務器所用。然而,這樣做的缺點是會導致很低的生產率。
問題1:訓練數據生成過程中的瓶頸
在Arimo,我們每天都跟大規模時間序列數據打交道。大規模數據和複雜的學習問題通常涉及密集的、耗時的ETL處理,而時間序列數據又尤其富於挑戰性。這種類型數據的建模要求:(1)隨著時間生成大量的子序列和它們關聯的標簽 (2)將子序列重塑為多維張量。
現有的做法是運行一個長時間的Spark批處理作業將原始數據完全轉化為合適的、可進行深度學習訓練的形式。一個長時間的批處理作業對我們的流水線式的生產並不是最優的,因為我們需要等到所有數據劃分在被發送去訓練之前都處理完畢。一個更加理想的模式是立即將已經完整的數據分區流傳輸到訓練階段。
問題2:訓練數據遷移過程中的瓶頸
為了將訓練數據在Spark和Tensorflow之間移動,我們通常需要將整個處理後的數據集合持久化到HDFS或者其他分布式文件係統中。這就不可避免地在寫數據和讀數據中製造了兩次磁盤IO瓶頸。以時間序列建模來說,這個問題在訓練數據達原始數據的數十倍之大時是極其嚴重的。
問題3:訓練數據過程中的巨大浪費
一個有趣且重要的現象是,我們實際上不需要一次性拿到100%的訓練數據才能訓練出更好的模型。這意味著首先生成整個訓練數據然後再進行批處理的方法極為浪費。這個想法促使我們放棄批處理方法,轉而采用一種更加高效的流式方法。
3.解決方案:采用協處理器並發生成小批次訓練數據流並從Spark向Tensorflow進行傳遞
通過避免磁盤IO和利用以內存為中心的共享文件係統Alluxio的優勢,我們可以將數據從Spark向Tensorflow服務器之間更快地移動。讓我們看下圖:
1.利用協同處理,子序列和標簽的準備在數據幀創建後可以馬上開始進行。所以當我們執行其它無關操作的時候,這部分訓練數據就已經悄悄地被準備好並按序排好,等待後續模型訓練的使用。
2.Alluxio的內存級速度存儲緩解了我們將訓練數據持久化到HDFS的需要,從而減少了磁盤IO。
這個方法性能高、優雅且非常有效。浪費得到了最小化,甚至通過協處理器可以得到消除。我們在後台悄悄地生成批數據,然後訓練模型不斷消耗已經排序好的批次數據,直到模型效果令人滿意為止。在數據生成和導入(feed)階段之間,數據總是排好序並且被緩衝的。計算密集型的數據準備階段隻有當模型訓練停止的時候才會停止。
流線型和無浪費,這種基於Alluxio的方法就是我們所認為的大規模數據準備和模型訓練的“豐田標準”。
4.總結
深度學習模型在當模型很大和在大規模數據集上訓練時表現良好。為了加速模型的訓練過程,我們已經實現了在Spark和Tensorflow之間作為常用存儲層的Alluxio。
我們利用協處理器的內存級存儲速度和協處理能力來避免磁盤IO瓶頸,並且為訓練數據預處理和整體模型更新實現了並發。初始結果表明,這種方法能夠將模型訓練過程加速最多60%。
我們期待著將Alluxio用於其它的用例以及產品集成。
版權申明:本文由南京大學顧榮等專家翻譯整理自Alluxio公司技術博客,由Alluxio公司授權雲棲社區及CSDN首發(聯合),版權歸Alluxio公司所有,未經版權所有者同意請勿轉載。
最後更新:2017-09-01 12:02:42
上一篇:
安卓軟件開發外包注意事項有哪些?
下一篇:
阿裏雲大數據計算服務MaxCompute(原ODPS)華南1(深圳)Region即將開服!
Spring????????????DBCP????????????????????????ms access??????????????????-??????-????????????-?????????
《vSphere性能設計:性能密集場景下CPU、內存、存儲及網絡的最佳設計實踐》一1.4 考慮許可要求
關於先知創新大會的那些"為什麼"?
Sql Server 存儲過程實例講解
java麵試題
ASP.NET設置Session過期時間
jQuery Mobile 1.0 正式版發布
ubuntu下的yuv播放器
Windows 9 將於明年11月發布 無開始按鈕
雲服務器 ECS > > 快速入門(一)