基於靈活高速的存儲系統Alluxio 訓練深度學習模型

前言

在當前數據集規模以及計算能力快速增長的時代下,深度學習已成為一種流行的人工智慧技術。隨著可用於訓練的數據越來越多以及可以處理的神經網路更加複雜,深度學習模型不斷地提升著它對處理各大領域的問題的性能表現。深度學習模型的發展將人工智慧推上高點,然而這對數據的訪問和存儲管理系統帶來了一些挑戰。 在本文中,我們進一步深入分析深度學習在數據存儲方面存在的挑戰,以及Alluxio如何幫助我們解決這些問題。

深度學習在數據層面的挑戰

當前可用數據量大大提高,並且通常更多的數據會帶來更好的效果,因此深度學習已經成為機器學習中一種流行趨勢。然而,這並不能保證所有訓練數據都能夠直接用於深度學習框架( Tensorflow, Caffe, torch)。例如,深度學習框架目前正與一些現有的存儲系統集成,但並不是所有存儲都能夠直接完成集成。因此,深度學習框架可能無法直接操作訓練數據的某個子集,從而導致較低的能效。

同時,對於用戶來說,當前存在有各種各樣的存儲選項可選。這些存儲選項中分散式存儲系統(HDFS,Ceph)和雲存儲(AWS S3,Azure Blob存儲,谷歌雲存儲)變得更受歡迎。然而,相比於以前僅僅是在本地機器上操作本地文件系統,使用者對這些分散式遠程存儲系統的交互方式與傳統方式不同。用戶很難準確地配置和使用各式各樣的新工具。這使得訪問來自不同系統的數據對於深度學習訓練非常困難。

最後,隨著存儲資源和計算資源的高速增長,它們必須要使用遠程存儲系統。對於雲計算而言這是很常見的現象,並且支持按需資源分配,從而形成更高的利用率、更靈活的彈性、更低的成本。然而,當遠程存儲系統用於深度學習訓練數據,這意味著數據必須通過網路獲取,可以增加深度學習的訓練時間。另外,網路IO會增加數據訪問成本,並增加處理數據的總時間。

Alluxio如何幫助深度學習面對存儲挑戰

深度學習面臨幾個數據存儲管理相關問題,而Alluxio可以幫助大家解決這些數據訪問難題。Alluxio最簡單的呈現形式是作為一個虛擬文件系統,透明地連接到現有的底層存儲系統,並對用戶提供一個單一的訪問介面。使用Alluxio統一命名空間後,許多存儲技術可以掛載到Alluxio中,包括雲存儲S3,Azure,GCS。 因為Alluxio已經可以與這些存儲系統集成,深度學習框架只需要與Alluxio交互,就能夠訪問底層所有的數據存儲。這使得訓練可以對於任何數據源上的所有數據執行,這將帶來更好的模型效果。

Alluxio還包含一個叫做FUSE的介面為用戶提供更加便捷和熟悉的使用體驗。 當Alluxio FUSE工作時,Alluxio 可以掛載本地文件系統。所以說,與Alluxio系統交互就像與本地文件和目錄交互一樣簡單。 因此,用戶可以繼續使用他們熟悉的工具和模式對數據進行交互。 由於Alluxio可以連接到多個獨立的存儲系統,這意味著對任何數據存儲的操作都將與對本地文件或目錄操作一樣。

如圖1所示。 Alluxio縮短了深度學習框架和存儲之間的距離

最後,Alluxio還對經常使用的數據提供了本地緩存。這在涉及遠程數據的計算時尤其有用,例如分解計算的存儲環境。因為,Alluxio可以在本地緩存數據,數據訪問並不會產生網路IO,所以深度學習訓練可以更高效和省時。

安裝配置 Alluxio FUSE

這一小節主要描述如何安裝Alluxio,以訪問在S3中的ImageNet訓練數據,並允許深度學習框架通過FUSE訪問數據。

安裝Alluxio,需要下載最新的/綁定FUSE連接器的tarball原始碼。Alluxio下載網站是[FILL_IN]。 注意,Alluxio 1.7之前的版本並不是通過Java 8編譯生成的,它們並不包含需要只有Java 8 +編譯才能內置的FUSE連接器。 如果你想使用Alluxio 1.6或之前的版本的FUSE,請按照這個文檔的說明來手動構建分布。

接下來,解壓tarball,然後進入目錄

$ tar -xvf alluxio-1.7.0-hadoop-2.8-bin.tar.gz$ cd alluxio-1.7.0-hadoop-2.8

使用默認設置來配置Alluxio。首先,從模板中創建一個conf/alluxio-site.properties文件

$ cp conf/alluxio-site.properties.template conf/alluxio-site.properties

然後,打開文件(conf/alluxio-site.properties)並取消這些屬性的注釋。

alluxio.master.hostname=localhostalluxio.underfs.address=${alluxio.work.dir}/underFSStorage

然後,在worker屬性配置worker內存的大小

alluxio.worker.memory.size=20GB

我們設置為20 GB,這足夠存儲ImageNet的子集了。

接下來,我們將格式化Alluxio,為啟動 Alluxio作準備。運行以下命令,這個命令將格式化Alluxio日誌,以便master可以正確運行。

$ ./bin/alluxio format

之後你會發現,在工作目錄中日誌已經創建了/.journal

你現在可以啟動Alluxio了。 在默認設置下,Alluxio會在本機啟動master and worker。 我們可以用如下命令,在主機上啟動Alluxio

$ ./bin/alluxio-start.sh local SudoMount

你可以通過訪問http://localhost:19999Alluxio查看來Alluxio master的狀態來確認Alluxio是否已啟動。

接下來,我們將存儲在雲端的訓練數據掛載到Alluxio的某個文件夾中。首先,我們將創建一個根植於Alluxio的文件夾

$ ./bin/alluxio fs mkdir /training-data

然後,我們可以掛載存儲在S3中的ImageNet數據到路徑/training-data/imagenet

$ ./bin/alluxio fs mount /training-data/imagenet/ s3a://alluxio-tensorflow-imagenet/ --option aws.accessKeyID=<ACCESS_KEY_ID> --option aws.secretKey=<SECRET_KEY>

注意,該行命令可以通過options傳遞桶的S3憑證,以便後面的訪問不需要憑證。

接下來,我們將啟動Alluxio-FUSE進程。這需要Linux的libfuse或macOS的osxfuse。關於FUSE的更多的使用方法和限制,你可以查看這個文檔。

首先,我們將創建一個文件夾/mnt /Fuse,將管理許可權改成當前用戶(本教程中ec2-user),並使其具有讀寫許可權。

$ sudo mkdir -p /mnt/fuse$ sudo chown ec2-user:ec2-user /mnt/fuse$ chmod 664 /mnt/fuse

接下來,我們將運行Alluxio-FUSE shell以便將Alluxio文件夾的訓練數據掛載到本地文件夾/mnt/fuse

$ ./integration/fuse/bin/alluxio-fuse mount /mnt/fuse /training-data

現在FUSE進程應該已經啟動,你可以用以下命令檢查它的狀態:

$ ./integration/fuse/bin/alluxio-fuse stat

現在你可以去安裝文件夾瀏覽數據,它會展示存儲在雲端的訓練數據。

$ cd /mnt/fuse$ ll

這個文件夾是為使用深度學習框架而準備的,這將讓Alluxio存儲如同本地文件夾一樣。 在下一節中,我們使用這個文件夾用於Tensorflow訓練

使用Tensorflow on Alluxio FUSE

我們以Tensorflow這個深度學習框架為例,在本教程中為您展示Alluxio如何助力數據訪問和管理。

我們在一台配置8 GPUs (NVIDIA Tesla K80) 和 32 vCPUs的EC2 p2.8xlarge機器上運行這個教程,並安裝Tensorflow 1.3.0. 我們同時使用TensorFlow的CNN的基準作為深度學習工作負載的案例。根據它的主頁,它包含幾個流行的卷積模型的實現,比如用於圖像分類的AlexNet和GoogleNet。它的訓練流程並被設計並實現成儘可能高效,主要是通過一些處理技術(如流水線輸入,並行IO讀取,訓練數據預處理)構建高性能模型。

為了藉助Alluxio 訪問S3中的訓練數據,我們可以通過Alluxio FUSE簡便地將路徑/ mnt/FUSE/imagenet傳遞到基準程序script tf_cnn_benchmkars.py中的data_dir參數中。

只要掛載一次底層存儲系統,不同底層存儲系統中的數據就可以通過Alluxio被這個基準程序透明地訪問,而並不需要修改Tensorflow或基準程序本身。這極大地簡化了應用程序的開發,否則將需要對每個特定的存儲系統進行集成並設置相關配置以及憑證。

除了統一存儲方面的好處之外,Alluxio也能帶來性能優勢。這個基準以圖像/秒為單位評估輸入訓練圖像的訓練模型的吞吐量。整個訓練流程在三個階段利用了不同的資源:

  • 數據讀取(I / O):從源頭選擇和讀取圖像文件。
  • 圖像處理(CPU):將圖像記錄解碼程圖像、預處理,以及組織成mini-batches形式。
  • 建模訓練(GPU):計算和更新多個卷積層中的參數

通過將深度學習框架和Alluxio worker設置在同一台機器上,Alluxio將後續再次訪問的遠程數據緩存在本地,從而實現了數據本地化。沒有Alluxio,緩慢的遠程存儲可能導致I / O瓶頸,致使珍貴的GPU資源沒有被充分利用。例如,在基準模型中,我們發現AlexNet結構相對簡單,因此,當存儲訪問變得緩慢時,很有可能導致I/O的瓶頸。

我們的基準測試結果表明,訓練AlexNet直接從S3讀取訓練數據時,會遇到I/O讀瓶頸。Alluxio克服了這一瓶頸,從而帶來了近2倍的性能提升。這幾乎與本地讀取是一樣的性能。

總結:

通過Alluxio FUSE,Alluxio統一了底層不同存儲系統,並對於深度學習框架提供如同本地文件夾一樣的數據訪問方式。利用Alluxio,數據科學家可以在不折中性能的情況之下,便捷地訪問各種底層儲系統中的數據。


推薦閱讀:

論文筆記:[OSDI14] F4: Facebooks Warm BLOB Storage System
單機存儲引擎的基礎方法
分散式存儲系統演進
上陣不離親兄弟 談談VxRail這款超融合設備!
分散式系統的雪崩效應

TAG:深度學習DeepLearning | 分散式存儲 | 分散式計算 |