毫末智行 Fluid 實踐:雲原生 AI 讓汽車變得“更聰明”

阿裏雲開發者 2021-09-18 17:04:08 阅读数:488

毫末 fluid 原生 ai
簡介:毫末機器學習訓練場景對於數據讀取有較高的性能要求,且對於元數據和數據緩存的精細化控制要求較高, 通過 Fluid + JindoRuntime 的緩存能力可以靈活地緩存 OSS 訓練文件進行元數據和數據,提供高效的元數據和數據訪問性能。基於這種方案,我們可以實現精細化控制緩存的內容,提高生產資源利用率,不僅有效緩解了 OSS 帶寬的壓力,也大大提高了訓練效率。

作者介紹:

李範:毫末智行 服務端開發工程師,負責 AI 自動訓練平臺的研發與算法優化

陳鐵文:毫末智行 服務端開發工程師,負責 AI 自動訓練平臺的上層研發

引言:Fluid 是雲原生基金會 CNCF 下的雲原生數據編排和加速項目,由南京大學、阿裏雲及 Alluxio 社區聯合發起並開源。本文主要介紹毫末智行機器學習平臺在自動駕駛場景的使用,以及如何基於 Fluid +JindoFS 突破原有存儲與計算分離架構帶來的性能瓶頸,從而提高生產資源利用率,有效緩解 OSS 帶寬壓力,並且大大提高訓練效率的生產實踐。

自動駕駛商業應用正駛入快車道

毫末智行是一家致力於自動駕駛,提供智能物流解决方案的人工智能技術公司。企業使命為以零事故、零擁堵、自由出行和高效物流為目標, 協助客戶重塑和全面昇級整個社會的出行及物流方式。

數據智能是毫末智行的核心能力,乘用車自動駕駛系統及解决方案、低速無人車生態系統及解决方案、自動駕駛相關產品研發與定制服務三大垂類產品為數據智能服務, 數據智能反哺三大垂類產品,鞏固其在各自市場內的絕對領先地比特。經近10年的積累與全棧自研,以及90%以上的研發投入,在乘用車、低速無人車、智能硬件三個方 面不斷積累相關數據,目前已孵化出小魔盒、小魔駝、小魔盤等10餘款成熟產品。

毫末智行的快速發展也體現著更高級別的智能駕駛將在更廣泛的場景中發揮作用,自動駕駛的商業應用正在駛入快車道。

 title=

傳統機器學習訓練效能遭遇瓶頸

隨著機器學習在自動駕駛業務場景中的廣泛使用,機器學習平臺扮演了非常核心的角色。該平臺采用了存儲與計算分離的架構,使得計算資源得以與存儲資源解耦, 從而實現了靈活的資源配比以及便捷的存儲擴展,並且降低了存儲資金和運維成本。

 title=

然而,這種架構也帶來了一些挑戰,其中比較關鍵的問題體現在數據訪問性能和穩定性方面:

1、計算存儲分離架構導致數據訪問高延時,導致訓練慢:

業務團隊使用的機器學習任務在訓練過程中要實時頻繁訪問 OSS 上的數據,在 OSS 帶寬受限或者壓力較大時, 訪問 OSS 上數據速度比訪問本地文件速度要慢很多;

2、Kubernetes 調度器數據緩存無感知,同一數據源多次運行訪問依舊慢:

在現實應用中深度學習任務運行會不斷 重複訪問同一數據,包括相同模型不同超參的任務、微調模型相同輸入的任務、以及 AutoML 任務等。這種深度學習任務的重複數據訪問就產生了可以複用的數據緩存。然而,由於原生 Kubernetes 調度器無法感知緩存,導致應用調度的結果不佳,緩存無法重用,性能難以提昇;

3、OSS 成為數據並發訪問的瓶頸點,穩定性挑戰大:

毫末機器學習平臺上的大量機器學習任務在同時訓練時都會並發訪問後端 OSS 存儲。這種並發機器學習訓練造成的 IO 壓力比較大, OSS 服務成為了性能單點,一旦 OSS 帶寬出現瓶頸則會影響所有機器學習任務;

4、訓練文件分散,元數據壓力大: 

機器學習任務的訓練數據文件通常會分散在不同路徑下,讀取文件需要耗費大量的時間在 list 操作上。對象存儲的 list 操作性能較差, 因此在進行大規模 list 時對 OSS 元數據壓力很大,經常出現超時或者 list 失敗的情况。

在現實應用中,通過對於毫末機器學習平臺的監控分析,我們發現 IO 性能問題會導致 GPU 等昂貴計算資源不能被充分利用。機器學習自身訓練的特點導致了數據文件訪問較分散, 元數據壓力較大。如果能够精細化地緩存元數據和文件數據,那麼一方面可以提高緩存效率和磁盤利用率,另一方面也可以解决文件查找操作帶來的元數據損耗。

基於 Fluid+JindoRuntime 加速模型推理訓練的生產實踐

為了能更好地滿足大規模機器學習模型訓練的高效性需求,模型訓練過程中需要對數據訪問取得更好的數據本地化效果。因此,我們希望達到以下目標:

  • 計算能够充分利用本地化數據訪問:這樣就不需通過網絡反複讀取,從而加速機器學習模型的訓練速度,並提昇集群的 GPU 使用率。
  • 降低 OSS 負載壓力:通過應用對於部分數據的本地讀取,减小數據訪問延時和降低對底層 OSS 的帶寬壓力。
  • 充分發揮熱點數據集的緩存節點優勢:在對用戶無感知的前提下,智能地將任務調度到數據緩存節點上,從而使得常用模型訓練程序越來越快。
  • 自定義文件列錶形式緩存指定文件:只緩存訓練需要的文件,極大提高緩存使用率和磁盤利用率。
  • 元數據緩存和數據緩存分離:可單獨對文件進行元數據緩存,緩存策略定制化。
  • 通過 POSIX 接口讀取數據:這樣無需在模型開發和訓練階段使用不同的數據訪問接口,降低開發機器學習模型程序的成本。

為了達到上述目標,我們迫切希望找到 Kubernetes 上具有分布式緩存加速能力的系統平臺。我們發現 CNCF Sandbox 項目 Fluid 正好可以滿足我們的訴求。於是,我們設計了基於 Fluid 的新架構方案,經過驗證比較,我們選擇 JindoRuntime 作為加速運行時。

 title=

3.1 技術方案

  • Fluid

Fluid 是一個運行在 Kubernetes 上可擴展的分布式數據編排和加速系統,它通過數據的編排和 使用數據的應用調度,解决雲原生編排框架運行此類應用面臨數據訪問延時高、多數據源聯合分析難、應用使用數據過程複雜等痛點。

  • JindoRuntime

JindoRuntime 是 Fluid 一種分布式緩存 Runtime 的實現,基於 JindoFS 分布式緩存加速引擎。JindoFS 是阿裏雲開源大數據-數據湖存儲團隊自研大數據存儲優化引擎,完全兼容 Hadoop 文件系統接口,給客戶帶來更加靈活、高效的計算存儲方案。JindoRuntime 使用 JindoFS 的 Cache 模式進行遠端文件的訪問和緩存,支持 OSS、HDFS、標准 S3 協議等多種存儲產品的訪問和緩存加速。在 Fluid 上使用和部署 JindoRuntime 流程簡單、兼容原生 K8s 環境、可以開箱即用。深度結合對象存儲特性,使用 Navite 框架優化性能,並支持免密、checksum 校驗等雲上數據安全功能。

之所於選型基於JindoRuntime 的 Fluid,主要是基於以下考慮:

  • Fluid 可以將數據集編排在 Kubernetes 集群中,實現數據和計算的同置,並且提供基於 Persistent Volume Claim 接口,實現 Kubernetes 上應用 的無縫對接。同時 JindoRuntime 提供對 OSS 上數據的訪問和緩存加速能力,並且可以利用 FUSE 的 POSIX 文件系統接口實現可以像本地磁盤一樣輕松使用 OSS 上的海量文件,pytorch 等深度學習訓練工具可利用 POSIX 文件接口讀取訓練數據。
  • 提供元數據和數據分布式緩存,可單獨進行元數據緩存預熱。
  • 提供元數據緩存預熱,避免訓練文件在OSS上大量元數據操作、提供數據預熱機制,避免在訓練時刻拉取數據造成的數據訪問競爭
  • 提供文件列錶形式的數據定制化預熱,精細化預熱數據。
  • 通過 Fluid 的數據感知調度能力,用戶無需知道緩存節點信息就可以將任務放置到有緩存數據的節點,實現數據訪問性能的優勢最大化。

3.2 落地實踐

  • 選擇合適的緩存節點:

 使用 JindoRuntime 可以獲得更好的數據本地性能,在實際生產中我們發現不是所有節點都來做緩存性能就比較好。原因是有些 節點的磁盤和網絡 IO 性能不是很好,這個時候需要我們能够把緩存節點盡量選擇到一些大容量磁盤和網絡較好的節點上。Fluid 支持 dataset 的可調度性,換言 之,就是緩存節點的可調度性,我們通過指定 dataset 的 nodeAffinity 來進行數據集緩存節點的調度,從而保證緩存節點可高效的提供緩存服務。

  • 配置緩存容量與路徑:

通過 dataset 的 Mounts 和 JindoRuntime 的 tieredstore 可以設定數據的掛載目錄。同時,為避免數據量過多而導致 緩存量過於龐大,可手動配置 JindoRuntime 的 tieredstore 來約束緩存的最大容量與水比特線(超過水比特線的數據會被自動丟弃),tieredstore 也包含對緩存 存放路徑的設定與存儲層(SSD/MEM/HDD)的設定,以滿足各種場景的需要。對於多節點的場景,使用dataset 的 replacement 可以支持在同一集群上部署多個 dataset。

  • 設定緩存安全策略:

在Fluid中創建Dataset時,有時候我們需要在mounts中配置一些敏感信息,如 oss 賬號的 accessKeyId、accessKeySecret 。為了保證安全,Fluid提供使用Secret來配置這些敏感信息的能力。通過創建Secret,dataset 以 EncryptOptions 字段指定 Secret 的 name,實現對敏感信息的綁定。

  • 數據預加載:

對於已經創建完成的 dataset 和 jindoruntime,第一次訪問掛載的數據會經曆一次下載數據目錄下全部文件的過程,這就產生了一個問題:若數據所在的目錄存在無需使用的其他數據,會造成無意義的空間資源與網絡資源浪費。為避免這種問題,Fluid 既支持對數據的預加載,同時也支持元數據緩存。通 過創建 dataload讀取所要預加載數據路徑信息,可以動態將數據注入。dataload 支持緩存元數據與屏蔽非預加載數據的訪問,這樣就大大降低的數據訪問效率。

3.3 帶來的性能顯著提昇

我們使用了不同的模型,推理和訓練相同的數據,分別以使用 JindoRuntime 和不使用 JindoRuntime 的方式推理和訓練,對比訓練時長,發現性能帶來了顯示提昇:

 title=

模型在雲端推理1萬幀圖片的測試結果

 title=

另一個稍大的模型在雲端推理1萬幀圖片的測試結果

 title=

模型使用 4 卡在雲端訓練1萬幀圖片幀耗時測試結果

集成了 Fluid+JindoRuntime 後,顯著提昇了雲端訓練和推理的效率,尤其是一些小模型,在雲端做訓練和推理 JindoRuntime 可以有效解决 IO 瓶頸問題,訓練速度最高可提昇約 300% 。同時也大幅度提昇雲端 GPU 使用效率,加速了在雲端數據驅動的迭代效率。

共建 Fluid 開源生態,讓更多行業更“聰明”

毫末機器學習訓練場景對於數據讀取有較高的性能要求,且對於元數據和數據緩存的精細化控制要求較高, 通過 Fluid + JindoRuntime 的緩存能力可以靈活地緩存 OSS 訓練文件進行元數據和數據,提供高效的元數據和數據訪問性能。基於這種方案,我們可以實現精細化控制緩存的內容,提高生產資源利用率,不僅有效緩解了 OSS 帶寬的壓力,也大大提高了訓練效率。

當前 Fluid + JindoRuntime 能够滿足生產環境的基本需要,對 OSS 的加速效果也比較明顯,提供的精細化緩存策略更加高效。我們期望能够把彈性的數據加速作為毫末機器學習平臺的差异化競爭能力,提昇整體訓練任務速度和計算資源的利用率。在未來的工作中,我們也希望也幫助社區不斷演進,幫助到更多的開發者。具體來說,後面在平臺中計劃增加的功能包括:

  • 支持定時任務支持動態擴縮容
  • 提供性能監控控制臺
  • 支持規模化 K8s 集群中多數據集的全生命周期管理
  • 支持對緩存數據和緩存元數據的動態删减

致謝

感謝阿裏雲 JindoFS 團隊的辰山、揚禮和容器團隊的車漾在整個方案設計和優化過程中的巨大幫助,對生產過程中的需求給予定制化的支持,對遇到的各種問題進行快速的幫助和解决。

相關鏈接

[1] Fluid:_https://github.com/fluid-cloudnative/fluid_

[2] JindoFS:_ https://github.com/aliyun/alibabacloud-jindodata_

如果你對 Fluid 項目感興趣,歡迎點擊下方鏈接了解更多:

https://github.com/fluid-cloudnative/fluid

「Kubernetes 難點攻破系列:容器持久化存儲訓練營」啟動倒計時!

9 月 22-24 日 3 天時間集中突破,從容器持久化存儲開始,打開 Kubernetes 難點攻破之旅。完成全部打卡任務,還有小米耳機、阿裏雲定制帽衫、精美周邊等豐富的訓練營獎品等你來拿!

 title=

版權聲明:本文內容由阿裏雲實名注册用戶自發貢獻,版權歸原作者所有,阿裏雲開發者社區不擁有其著作權,亦不承擔相應法律責任。具體規則請查看《阿裏雲開發者社區用戶服務協議》和《阿裏雲開發者社區知識產權保護指引》。如果您發現本社區中有涉嫌抄襲的內容,填寫侵權投訴錶單進行舉報,一經查實,本社區將立刻删除涉嫌侵權內容。
版权声明:本文为[阿裏雲開發者]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/09/20210918170408007S.html