超越容器化,愛奇藝深度學習雲平臺的實踐及優化

寫在前面

深度學習技術在圖像處理上取得了巨大成功,替代了許多傳統的圖像處理算法。愛奇藝視頻業務線對深度學習訓練任務的計算需求飛速增長。這些訓練任務通常使用GPU進行大量密集的計算。GPU不同於CPU的獨佔使用方式,使得讓傳統基於時間片的共享方法失效。GPU高昂的價格帶來的成本壓力,對使用效率提出了更高的要求。如何把GPU資源更好的更快的更靈活的提供給業務使用,降低深度學習的使用門檻,成爲計算團隊的一個難題。爲了解決這個難題,我們開始對深度學習雲平臺構建的漫長旅途。

一個雲計算平臺主要解決三大類問題:計算、存儲和網絡。在計算方面,愛奇藝大量使用虛擬化計算和容器雲計算。相比於虛擬化技術,容器更加簡單便捷,不需要額外的硬件支持,近乎無損的提供GPU計算能力,可以快速的提供不同軟件環境,啓動時間短,成爲首選的GPU計算承載方式。

訓練任務場景

image

image

我們的第一次嘗試從訓練任務容器化開始。一個典型的訓練任務和普通數據處理任務類似:訓練程序設置參數,從數據源讀取數據,使用框架提供的API進行計算,輸出保存點和最終模型,同時也會輸出日誌和一些事件信息。

訓練任務容器化demo很快就完成了,我們拿着demo去和算法同事溝通:

A:“首先需要把訓練框架和代碼做成一個Docker鏡像,然後登錄到我們容器雲平臺,啓動容器……”

B:“什麼是Docker/容器?可以直接跑訓練任務嗎?”算法同事問。

A:“我們兩個星期後要上線,什麼時候可以給訓練任務服務?”

B:”有沒有一個方案可以讓算法用戶在不瞭解容器的情況下使用訓練服務?最好兩個星期內做出來!“

PS:這個時候發現我們忽略了最終用戶的基礎情況:算法工程師專注與算法,關心平臺的易用性和實際訓練時間。通常沒有興趣瞭解容器、存儲等基礎服務,對計算性能幾乎沒有概念。

Runonce訓練服務

image

兩個星期後,我們開始測試了Runonce訓練服務。Runonce的最初設計目的是,讓用戶像使用虛擬機一樣使用容器。Runonce底層設施是基於mesos容器雲環境。計算資源已容器方式的提供,所有容器使用統一鏡像。爲了保存用戶數據,容器使用了Ceph RBD網絡塊存儲設備作爲RootFS。容器啓動點是一個sshd服務,作爲用戶的登錄入口。我們提供了特殊的文件注入工具幫助用戶管理ssh key。

Runonce訓練服務功能簡單,開發量小,短時間完成上線。Runonce服務的用戶體驗沒有發生根本新的變化,可以很快上手。但是,缺點也很明顯。用戶對軟件環境完全控制,常常出現錯誤修改系統文件引發的問題。這些問題很難跟蹤和調查,帶來很高的運維開銷。用戶是在使用shell來交互操作資源,通常會進行大量代碼修改和調試,實際使用GPU時間不多,最終體現是整體GPU利用率較低。由於塊存儲設備不能進行共享,RUNONCE不支持數據集共享,也不能支持並行多任務訓練,更加不支持分佈式訓練。

因爲Runonce服務存在無法修復的缺陷,我們決定開發一個新的訓練平臺。通過大量觀察用戶使用Runonce服務行爲,我們總結出典型使用步驟:數據集上傳,編寫訓練代碼,執行訓練任務,獲取訓練結果。這些步驟後面的核心是數據,而支持數據讀取的存儲方案是最關鍵的方案。

儲存選擇

image

如果需要進行數據共享,那麼網絡存儲是最好的選擇。在對網絡存儲選擇過程中,我們關注下面這些設計和指標:健壯性,伸縮性,吞吐量,併發,延遲。由於多數訓練框架都支持文件系統接口,所以提供文件接口是存儲的必須功能。綜合各個因素後,Jarvis使用的首選存儲平臺是Ceph對象存儲(RWG)。Ceph對象存儲有很好的併發性能,可以很容易的進行水平擴展,但對象儲存提供的接口是基於HTTP的S3接口,需要進行文件API的封裝。

Jarvis存儲

image

Jarvis在S3上採用fuse文件系統,用於支持文件讀寫。S3 fuse對讀操作很友好,但是在寫功能上有很多限制,例如:不支持隨機寫,任何文件修改都需要重新上傳整個文件。Jarvis使用本地文件作爲緩存,然後定期同步到Ceph對象存儲。因爲同步會造成大量重複寫操作,Jarvis對寫操作做了劃分,一類是寫日誌這樣的小文件操作,一類是模型同步等的大文件操作。小文件使用較短的同步週期,大文件使用較長的同步週期。

Jarvis運行環境

在Jarvis上,訓練任務容器使用的是定製的鏡像,軟件環境是精確定義。鏡像啓動腳本將訓練數據通過S3 fuse接入到容器內部,然後拉取gitlab代碼,執行用戶訓練任務,同時將輸出數據同步到對象存儲上。這裏我們做一個小小的優化,軟件環境劃分爲基礎鏡像和運行時腳本鏡像。在基礎鏡像上,注入運行時腳本鏡像內容。每次修改運行腳本,可以不必更新基礎鏡像,大大加快了開發效率。

但是Jarvis很大程度的改變了用戶使用方法,用戶普遍反應使用更不方便。我們在調試和狀態查詢上下了很大的功夫,提供了實時日誌展現網頁,同時還提供Tensorboard這樣的圖形化狀態查看的功能。Tensorboard功能強大,但是內存消耗也比較大。於是,我們開發了輕量化指標收集器,將指標直接投遞到數據後臺,由數據後臺界面來進行展現。

在Jarvis平臺運行一段時間之後,我們沒有觀察到GPU利用率顯著提升。這樣結果讓我們很驚訝。我們發現,GPU利用率低的主要原因是,大多數任務沒有對優化數據讀取。這個問題在網絡存儲環境下會更加突出。

存儲優化

image

網絡存儲有以下這些特點:

  • 高吞吐:讀寫速度很高

  • 高併發:可以支持很高的併發讀寫

  • 高延遲:發去請求到拿到第一個字節的時間相對較長

  • 掉隊現象:某些請求可能會過很長時間才返回

在網絡存儲環境下,我們需要增加處理數據讀取和處理的併發數,儘量避免使用小文件,放寬讀取數據順序的限制。

如果訓練數據文件都是比較小的圖片,應該合併若干小文件爲一個tfrecord的大文件,降低請求次數。目前,tensorflow在併發數據讀取處理支持做好,建議閱讀 Data Input Pipeline Performance。

申請容器時,用戶應該注意CPU資源的數量。如果CPU申請較少,數據處理速度慢,GPU處於等待數據空閒狀態。

同時,還應該做好數據的預處理。我們遇到一個案例,使用純文本的輸入數據,大量CPU時間花費在字符串到數字轉換上。在將文本數據處理成二級制數據之後,訓練任務幾乎跑滿了GPU計算能力。

深度學習技術發展迅速,大量變革正在發生。很多端到端的平臺正在開發,例如Kubeflow,OpenPAI。這些平臺都想把深度學習做成完整的閉環功能,讓算法工程師專注於數據和算法。要實現這樣的功能,我們還有很長的路要走。

本文轉載自“愛奇藝技術產品團隊”公衆號。

作者簡介:周海維,QCon講師,愛奇藝機器學習平臺架構師。有12年軟件開發經驗,從底層操作系統到上層應用都有涉及,熟悉系統軟件的性能分析與調優。加入愛奇藝後,從事智能路由器程序設計和開發。轉到雲平臺部門後,專注容器雲和高性能計算,負責機器學習平臺Jarvis開發。希望通過Jarvis平臺降低機器學習使用門檻,普通用戶也可以方便使用先進機器學習算法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章