譯者 | 李睿
作者:Bin Fan, InfoWorld
機器學習工作負載需要高效的基礎設施來快速產生結果,而模型訓練非常依賴大型數據集。在所有機器學習工作流程中,第一步是將這些數據從存儲集中到訓練集群,而這也會對模型訓練效率產生顯著影響。
長期以來,數據和人工智能平臺工程師一直在考慮以下問題來管理數據:
數據可訪問性:當數據跨越多個來源并且數據被遠程存儲時,如何使訓練數據可訪問?
數據管道:如何將數據作為一條管道進行管理,無需等待即可將數據持續輸入到訓練工作流程中?
性能和GPU利用率:如何同時實現低元數據延遲和高數據吞吐量以保持GPU不會空閑?
本文將討論一種新的解決方案,它將用來協調端到端機器學習管道中的數據以解決上述問題。本文將概述常見的挑戰和陷阱,并推出編排數據這種新技術,以優化機器學習的數據管道。
模型訓練中常見數據挑戰
端到端機器學習管道是從數據預處理、清理、模型訓練再到推理的一系列步驟,其中模型訓練是整個工作流程中最關鍵和最耗費資源的部分。
下圖是一個典型的機器學習管道。它從數據收集開始,然后是數據準備,最后是模型訓練。在數據收集階段,數據平臺工程師通常需要花費大量時間讓數據工程師可以訪問數據,數據工程師則需要為數據科學家準備數據以構建和迭代模型。
訓練階段需要處理大量數據,以確保將數據持續提供給生成模型的GPU。你必須對數據予以管理,以支持機器學習及其可執行架構的復雜性。在數據管道中,每個步驟都會面臨相應的技術挑戰。
(1)數據收集挑戰——數據無處不在
機器學習訓練需要采用大型數據集,因此從所有相關來源收集數據至關重要。當數據駐留在數據湖、數據倉庫和對象存儲中時,(無論是在內部部署、在云中還是分布在多個地理位置)將所有數據組合到一個單一的源中不再可行。對于數據孤島,通過網絡進行遠程訪問不可避免地會導致延遲。因此如何在保持所需性能的同時使數據可訪問是一項重大挑戰。
(2)數據準備挑戰——序列化數據準備
數據準備從采集階段的數據開始,包括清理、ETL和轉換,然后交付數據以訓練模型。如果沒有對這個階段全面考慮,那么數據管道是序列化的,且在等待為訓練集群準備的數據時會浪費額外的時間。因此,平臺工程師必須弄清楚如何創建并行化的數據管道,并實現高效的數據共享和中間結果的高效存儲。
(3)模型訓練挑戰——I/O與GPU未充分利用
模型訓練需要處理數百TB的數據,這些數據通常是大量的小文件,例如圖像和音頻文件等等。訓練涉及需要多次epoch的迭代,從而頻繁訪問數據。通過不斷地向GPU提供數據來保持其忙碌是有必要的,同時優化I/O并保持GPU所需的吞吐量也非易事。
傳統方法和常見陷阱
在討論不同的解決方案之前,先設定一個簡化的場景,如下圖所示。這里使用一個GPU集群在云中訓練,該集群具有多個運行TensorFlow作為機器學習框架的節點。預處理數據存儲在Amazon S3中。通常,有兩種方法可以將此數據傳輸到訓練集群,下文將予以討論。
方法一:在本地存儲中復制數據
在第一種方法中,整個數據集從遠程存儲復制到每個服務器的本地存儲進行訓練,如下圖所示。因此,數據局部性得到保證,訓練作業從本地讀取輸入,而不是從遠程存儲中檢索。
從數據管道和I/O的角度來看,這種方法提供了最高的I/O吞吐量,因為所有數據都是本地的。除了開始階段,GPU將保持忙碌,因為訓練必須等待數據從對象存儲完全復制到訓練集群。
但這種方法并不適用于所有情況。
首先,數據集必須適合聚合本地存儲。隨著輸入數據集大小的增長,數據復制過程變得更長且更容易出錯,從而浪費更多時間和GPU資源。
其次,將大量數據復制到每臺訓練機上會對存儲系統和網絡造成巨大壓力。在輸入數據經常變化的情況下,數據同步可能非常復雜。
最后,因為要使云存儲上的數據與訓練數據保持同步,人工復制數據既費時又容易出錯。
方法二:直接訪問云存儲
另一種常見的方法是將訓練與遠程存儲上的目標數據集直接連接起來,如下圖所示。這種方法與之前的解決方案一樣,數據集的大小不是問題,但也面臨著一些新的挑戰。
首先,從I/O和管道的角度來看,數據是串行處理的。所有的數據訪問操作都必須經過對象存儲和訓練集群之間的網絡,使得I/O成為瓶頸。因此,由于I/O吞吐量受到網絡限制,GPU會等待并會浪費時間。
其次,當訓練規模較大時,所有訓練節點同時從同一個遠程存儲訪問同一個數據集,給存儲系統增加了巨大的壓力。由于高并發訪問,存儲可能會變得擁擠,從而導致GPU利用率低。
第三,如果數據集包含大量的小文件,元數據訪問請求將占數據請求的很大一部分。因此,直接從對象存儲中獲取大量文件或目錄的元數據成為性能瓶頸,并增加了元數據的操作成本。
推薦的方法——編排數據
為了應對這些挑戰和陷阱,在處理機器學習管道中的I/O時,需要重新考慮數據平臺架構。在這里推薦一種加速端到端機器學習管道的新方法:數據編排。數據編排技術將跨存儲系統的數據訪問抽象化,同時將所有數據虛擬化,并通過標準化API和全局命名空間將數據呈現給數據驅動的應用程序。
(1)使用抽象統一數據孤島
與其復制和移動數據,留在原處也不失為上策,無論是在本地還是在云中。數據編排可以幫助抽象數據以創建統一的視圖。這將顯著降低數據收集階段的復雜性。
由于數據編排已經可以與存儲系統集成,機器學習框架只需要與單個數據編排平臺交互即可訪問來自任何連接存儲的數據。因此,來自任何來源的數據都可以用來訓練,從而提高模型質量。同時,無需人工數據移動到中央源。包括Spark、Presto、PyTorch和TensorFlow在內的所有計算框架都可以訪問數據,而無需擔心數據的位置。
(2)在數據本地性方面使用分布式緩存
建議不要將整個數據集復制到每臺機器上,而是實施分布式緩存,其中數據可以均勻分布在集群中。當訓練數據集遠大于單個節點的存儲容量時,分布式緩存尤其有利。當數據是來自遠程時,因為數據是在本地緩存的,它也可以提供助益。因為在訪問數據時沒有網絡I/O,機器學習訓練會變得更快且更具成本效益。
上圖顯示了存儲所有訓練數據的對象存儲,以及表示數據集的兩個文件(/path1/file1和/path2/file2)。與其將所有文件塊存儲在每臺訓練機器上,不如將塊分布在多臺機器上。為了防止數據丟失和提高讀取并發性,每個塊可以同時存儲在多個服務器上。
(3)優化跨管道的數據共享
在機器學習(ML)訓練作業中,作業內部和作業之間執行的數據讀取和寫入之間存在高度重疊。數據共享可以確保所有計算框架都可以訪問先前緩存的數據,用于下一步的讀寫工作負載。例如,如果在數據準備步驟中使用Spark 進行ETL,數據共享可以確保輸出數據被緩存并可供下一階段使用。通過數據共享,整個數據管道獲得了更好的端到端性能。
(4)通過并行化數據預加載、緩存和訓練來編排數據管道
可以通過執行預加載和按需緩存來編排數據管道。如下圖顯示,使用數據緩存從源加載數據可以與實際訓練任務并行完成。因此,在訪問數據時,訓練受益于高數據吞吐量,而無需在訓練前等待緩存完整數據。
雖然一開始會有一些I/O延遲,但因為數據已經加載到緩存中,等待時間會有所減少。這種方法可以減少重復步驟,從對象存儲到訓練集群的數據加載、緩存、訓練要求的數據加載以及訓練都可以并行完成,從而大大加快整個過程。
通過跨機器學習管道的步驟編排數據,可消除數據從一個階段流向下一個階段時串行執行和相關的低效問題,同時也將具有較高的GPU利用率。下表將對這種新方法與兩種傳統方法進行比較:
如何為機器學習工作負載編排數據
這里以Alluxio為例,展示如何使用數據編排。同樣,我們還將使用上面提到的簡化場景。為了安排TensorFlow作業,可使用Kubernetes或公共云服務。
使用Alluxio編排機器學習和深度學習訓練通常包括三個步驟:
(1)在訓練集群上部署Alluxio。
(2)掛載Alluxio作為本地文件夾來訓練作業。
(3)使用訓練腳本從本地文件夾(由Alluxio支持)加載數據。
不同存儲系統中的數據可以在掛載后通過Alluxio立即訪問,并且可以通過基準腳本透明訪問,無需修改TensorFlow。這顯著簡化了應用程序開發過程,不然就需要集成每個特定的存儲系統以及憑證的配置。
可參照這里的方法使用Alluxio和TensorFlow運行圖像識別。
數據編排優秀實踐
因為沒有一勞永逸的方法,所以數據編排最好在以下場景中使用:
需要分布式訓練。
有大量的訓練數據(10TB或更多),尤其是在訓練數據中有很多小文件和圖像的情況下。
GPU資源沒有被網絡I/O充分占用。
管道使用許多數據源和多個訓練/計算框架。
當處理額外的訓練請求時,底層存儲需要穩定。
多個訓練節點或任務使用相同的數據集。
隨著機器學習技術的不斷發展,框架執行更復雜的任務,管理數據管道的方法也將不斷改進。通過將數據編排擴展到數據管道,端到端訓練管道的效率和資源利用率都可以得到提高。
-
人工智能
+關注
關注
1791文章
47208瀏覽量
238291 -
機器學習
+關注
關注
66文章
8408瀏覽量
132575
發布評論請先 登錄
相關推薦
評論