毫末智行 Fluid 实践:云原生 AI 让汽车变得“更聪明”
作者介紹:
李范:毫末智行 服務(wù)端開發(fā)工程師,負(fù)責(zé) AI 自動(dòng)訓(xùn)練平臺(tái)的研發(fā)與算法優(yōu)化
陳鐵文:毫末智行 服務(wù)端開發(fā)工程師,負(fù)責(zé) AI 自動(dòng)訓(xùn)練平臺(tái)的上層研發(fā)
引言:Fluid 是云原生基金會(huì) CNCF 下的云原生數(shù)據(jù)編排和加速項(xiàng)目,由南京大學(xué)、阿里云及 Alluxio 社區(qū)聯(lián)合發(fā)起并開源。本文主要介紹毫末智行機(jī)器學(xué)習(xí)平臺(tái)在自動(dòng)駕駛場(chǎng)景的使用,以及如何基于 Fluid +JindoFS 突破原有存儲(chǔ)與計(jì)算分離架構(gòu)帶來(lái)的性能瓶頸,從而提高生產(chǎn)資源利用率,有效緩解 OSS 帶寬壓力,并且大大提高訓(xùn)練效率的生產(chǎn)實(shí)踐。
自動(dòng)駕駛商業(yè)應(yīng)用正駛?cè)肟燔嚨?/strong>
毫末智行是一家致力于自動(dòng)駕駛,提供智能物流解決方案的人工智能技術(shù)公司。企業(yè)使命為以零事故、零擁堵、自由出行和高效物流為目標(biāo), 協(xié)助客戶重塑和全面升級(jí)整個(gè)社會(huì)的出行及物流方式。
數(shù)據(jù)智能是毫末智行的核心能力,乘用車自動(dòng)駕駛系統(tǒng)及解決方案、低速無(wú)人車生態(tài)系統(tǒng)及解決方案、自動(dòng)駕駛相關(guān)產(chǎn)品研發(fā)與定制服務(wù)三大垂類產(chǎn)品為數(shù)據(jù)智能服務(wù), 數(shù)據(jù)智能反哺三大垂類產(chǎn)品,鞏固其在各自市場(chǎng)內(nèi)的絕對(duì)領(lǐng)先地位。經(jīng)近10年的積累與全棧自研,以及90%以上的研發(fā)投入,在乘用車、低速無(wú)人車、智能硬件三個(gè)方 面不斷積累相關(guān)數(shù)據(jù),目前已孵化出小魔盒、小魔駝、小魔盤等10余款成熟產(chǎn)品。
毫末智行的快速發(fā)展也體現(xiàn)著更高級(jí)別的智能駕駛將在更廣泛的場(chǎng)景中發(fā)揮作用,自動(dòng)駕駛的商業(yè)應(yīng)用正在駛?cè)肟燔嚨馈?/span>
傳統(tǒng)機(jī)器學(xué)習(xí)訓(xùn)練效能遭遇瓶頸
隨著機(jī)器學(xué)習(xí)在自動(dòng)駕駛業(yè)務(wù)場(chǎng)景中的廣泛使用,機(jī)器學(xué)習(xí)平臺(tái)扮演了非常核心的角色。該平臺(tái)采用了存儲(chǔ)與計(jì)算分離的架構(gòu),使得計(jì)算資源得以與存儲(chǔ)資源解耦, 從而實(shí)現(xiàn)了靈活的資源配比以及便捷的存儲(chǔ)擴(kuò)展,并且降低了存儲(chǔ)資金和運(yùn)維成本。
然而,這種架構(gòu)也帶來(lái)了一些挑戰(zhàn),其中比較關(guān)鍵的問(wèn)題體現(xiàn)在數(shù)據(jù)訪問(wèn)性能和穩(wěn)定性方面:
1、計(jì)算存儲(chǔ)分離架構(gòu)導(dǎo)致數(shù)據(jù)訪問(wèn)高延時(shí),導(dǎo)致訓(xùn)練慢:
業(yè)務(wù)團(tuán)隊(duì)使用的機(jī)器學(xué)習(xí)任務(wù)在訓(xùn)練過(guò)程中要實(shí)時(shí)頻繁訪問(wèn) OSS 上的數(shù)據(jù),在 OSS 帶寬受限或者壓力較大時(shí), 訪問(wèn) OSS 上數(shù)據(jù)速度比訪問(wèn)本地文件速度要慢很多;
2、Kubernetes 調(diào)度器數(shù)據(jù)緩存無(wú)感知,同一數(shù)據(jù)源多次運(yùn)行訪問(wèn)依舊慢:
在現(xiàn)實(shí)應(yīng)用中深度學(xué)習(xí)任務(wù)運(yùn)行會(huì)不斷 重復(fù)訪問(wèn)同一數(shù)據(jù),包括相同模型不同超參的任務(wù)、微調(diào)模型相同輸入的任務(wù)、以及 AutoML 任務(wù)等。這種深度學(xué)習(xí)任務(wù)的重復(fù)數(shù)據(jù)訪問(wèn)就產(chǎn)生了可以復(fù)用的數(shù)據(jù)緩存。然而,由于原生 Kubernetes 調(diào)度器無(wú)法感知緩存,導(dǎo)致應(yīng)用調(diào)度的結(jié)果不佳,緩存無(wú)法重用,性能難以提升;
3、OSS 成為數(shù)據(jù)并發(fā)訪問(wèn)的瓶頸點(diǎn),穩(wěn)定性挑戰(zhàn)大:
毫末機(jī)器學(xué)習(xí)平臺(tái)上的大量機(jī)器學(xué)習(xí)任務(wù)在同時(shí)訓(xùn)練時(shí)都會(huì)并發(fā)訪問(wèn)后端 OSS 存儲(chǔ)。這種并發(fā)機(jī)器學(xué)習(xí)訓(xùn)練造成的 IO 壓力比較大, OSS 服務(wù)成為了性能單點(diǎn),一旦 OSS 帶寬出現(xiàn)瓶頸則會(huì)影響所有機(jī)器學(xué)習(xí)任務(wù);
4、訓(xùn)練文件分散,元數(shù)據(jù)壓力大:?
機(jī)器學(xué)習(xí)任務(wù)的訓(xùn)練數(shù)據(jù)文件通常會(huì)分散在不同路徑下,讀取文件需要耗費(fèi)大量的時(shí)間在 list 操作上。對(duì)象存儲(chǔ)的 list 操作性能較差, 因此在進(jìn)行大規(guī)模 list 時(shí)對(duì) OSS 元數(shù)據(jù)壓力很大,經(jīng)常出現(xiàn)超時(shí)或者 list 失敗的情況。
在現(xiàn)實(shí)應(yīng)用中,通過(guò)對(duì)于毫末機(jī)器學(xué)習(xí)平臺(tái)的監(jiān)控分析,我們發(fā)現(xiàn) IO 性能問(wèn)題會(huì)導(dǎo)致 GPU 等昂貴計(jì)算資源不能被充分利用。機(jī)器學(xué)習(xí)自身訓(xùn)練的特點(diǎn)導(dǎo)致了數(shù)據(jù)文件訪問(wèn)較分散, 元數(shù)據(jù)壓力較大。如果能夠精細(xì)化地緩存元數(shù)據(jù)和文件數(shù)據(jù),那么一方面可以提高緩存效率和磁盤利用率,另一方面也可以解決文件查找操作帶來(lái)的元數(shù)據(jù)損耗。
基于 Fluid+JindoRuntime 加速模型推理訓(xùn)練的生產(chǎn)實(shí)踐
為了能更好地滿足大規(guī)模機(jī)器學(xué)習(xí)模型訓(xùn)練的高效性需求,模型訓(xùn)練過(guò)程中需要對(duì)數(shù)據(jù)訪問(wèn)取得更好的數(shù)據(jù)本地化效果。因此,我們希望達(dá)到以下目標(biāo):
- 計(jì)算能夠充分利用本地化數(shù)據(jù)訪問(wèn):這樣就不需通過(guò)網(wǎng)絡(luò)反復(fù)讀取,從而加速機(jī)器學(xué)習(xí)模型的訓(xùn)練速度,并提升集群的 GPU 使用率。
- 降低 OSS 負(fù)載壓力:通過(guò)應(yīng)用對(duì)于部分?jǐn)?shù)據(jù)的本地讀取,減小數(shù)據(jù)訪問(wèn)延時(shí)和降低對(duì)底層 OSS 的帶寬壓力。
- 充分發(fā)揮熱點(diǎn)數(shù)據(jù)集的緩存節(jié)點(diǎn)優(yōu)勢(shì):在對(duì)用戶無(wú)感知的前提下,智能地將任務(wù)調(diào)度到數(shù)據(jù)緩存節(jié)點(diǎn)上,從而使得常用模型訓(xùn)練程序越來(lái)越快。
- 自定義文件列表形式緩存指定文件:只緩存訓(xùn)練需要的文件,極大提高緩存使用率和磁盤利用率。
- 元數(shù)據(jù)緩存和數(shù)據(jù)緩存分離:可單獨(dú)對(duì)文件進(jìn)行元數(shù)據(jù)緩存,緩存策略定制化。
- 通過(guò) POSIX 接口讀取數(shù)據(jù):這樣無(wú)需在模型開發(fā)和訓(xùn)練階段使用不同的數(shù)據(jù)訪問(wèn)接口,降低開發(fā)機(jī)器學(xué)習(xí)模型程序的成本。
為了達(dá)到上述目標(biāo),我們迫切希望找到 Kubernetes 上具有分布式緩存加速能力的系統(tǒng)平臺(tái)。我們發(fā)現(xiàn) CNCF Sandbox 項(xiàng)目 Fluid 正好可以滿足我們的訴求。于是,我們?cè)O(shè)計(jì)了基于 Fluid 的新架構(gòu)方案,經(jīng)過(guò)驗(yàn)證比較,我們選擇 JindoRuntime 作為加速運(yùn)行時(shí)。
3.1 技術(shù)方案
- Fluid
Fluid 是一個(gè)運(yùn)行在 Kubernetes 上可擴(kuò)展的分布式數(shù)據(jù)編排和加速系統(tǒng),它通過(guò)數(shù)據(jù)的編排和 使用數(shù)據(jù)的應(yīng)用調(diào)度,解決云原生編排框架運(yùn)行此類應(yīng)用面臨數(shù)據(jù)訪問(wèn)延時(shí)高、多數(shù)據(jù)源聯(lián)合分析難、應(yīng)用使用數(shù)據(jù)過(guò)程復(fù)雜等痛點(diǎn)。
- JindoRuntime
JindoRuntime 是 Fluid 一種分布式緩存 Runtime 的實(shí)現(xiàn),基于 JindoFS 分布式緩存加速引擎。JindoFS 是阿里云開源大數(shù)據(jù)-數(shù)據(jù)湖存儲(chǔ)團(tuán)隊(duì)自研大數(shù)據(jù)存儲(chǔ)優(yōu)化引擎,完全兼容 Hadoop 文件系統(tǒng)接口,給客戶帶來(lái)更加靈活、高效的計(jì)算存儲(chǔ)方案。JindoRuntime 使用 JindoFS 的 Cache 模式進(jìn)行遠(yuǎn)端文件的訪問(wèn)和緩存,支持 OSS、HDFS、標(biāo)準(zhǔn) S3 協(xié)議等多種存儲(chǔ)產(chǎn)品的訪問(wèn)和緩存加速。在 Fluid 上使用和部署 JindoRuntime 流程簡(jiǎn)單、兼容原生 K8s 環(huán)境、可以開箱即用。深度結(jié)合對(duì)象存儲(chǔ)特性,使用 Navite 框架優(yōu)化性能,并支持免密、checksum 校驗(yàn)等云上數(shù)據(jù)安全功能。
之所于選型基于JindoRuntime 的 Fluid,主要是基于以下考慮:
- Fluid 可以將數(shù)據(jù)集編排在 Kubernetes 集群中,實(shí)現(xiàn)數(shù)據(jù)和計(jì)算的同置,并且提供基于 Persistent Volume Claim 接口,實(shí)現(xiàn) Kubernetes 上應(yīng)用 的無(wú)縫對(duì)接。同時(shí) JindoRuntime 提供對(duì) OSS 上數(shù)據(jù)的訪問(wèn)和緩存加速能力,并且可以利用 FUSE 的 POSIX 文件系統(tǒng)接口實(shí)現(xiàn)可以像本地磁盤一樣輕松使用 OSS 上的海量文件,pytorch 等深度學(xué)習(xí)訓(xùn)練工具可利用 POSIX 文件接口讀取訓(xùn)練數(shù)據(jù)。
- 提供元數(shù)據(jù)和數(shù)據(jù)分布式緩存,可單獨(dú)進(jìn)行元數(shù)據(jù)緩存預(yù)熱。
- 提供元數(shù)據(jù)緩存預(yù)熱,避免訓(xùn)練文件在OSS上大量元數(shù)據(jù)操作、提供數(shù)據(jù)預(yù)熱機(jī)制,避免在訓(xùn)練時(shí)刻拉取數(shù)據(jù)造成的數(shù)據(jù)訪問(wèn)競(jìng)爭(zhēng)
- 提供文件列表形式的數(shù)據(jù)定制化預(yù)熱,精細(xì)化預(yù)熱數(shù)據(jù)。
- 通過(guò) Fluid 的數(shù)據(jù)感知調(diào)度能力,用戶無(wú)需知道緩存節(jié)點(diǎn)信息就可以將任務(wù)放置到有緩存數(shù)據(jù)的節(jié)點(diǎn),實(shí)現(xiàn)數(shù)據(jù)訪問(wèn)性能的優(yōu)勢(shì)最大化。
3.2 落地實(shí)踐
- 選擇合適的緩存節(jié)點(diǎn):
?使用 JindoRuntime 可以獲得更好的數(shù)據(jù)本地性能,在實(shí)際生產(chǎn)中我們發(fā)現(xiàn)不是所有節(jié)點(diǎn)都來(lái)做緩存性能就比較好。原因是有些 節(jié)點(diǎn)的磁盤和網(wǎng)絡(luò) IO 性能不是很好,這個(gè)時(shí)候需要我們能夠把緩存節(jié)點(diǎn)盡量選擇到一些大容量磁盤和網(wǎng)絡(luò)較好的節(jié)點(diǎn)上。Fluid 支持 dataset 的可調(diào)度性,換言 之,就是緩存節(jié)點(diǎn)的可調(diào)度性,我們通過(guò)指定 dataset 的 nodeAffinity 來(lái)進(jìn)行數(shù)據(jù)集緩存節(jié)點(diǎn)的調(diào)度,從而保證緩存節(jié)點(diǎn)可高效的提供緩存服務(wù)。
- 配置緩存容量與路徑:
通過(guò) dataset 的 Mounts 和 JindoRuntime 的 tieredstore 可以設(shè)定數(shù)據(jù)的掛載目錄。同時(shí),為避免數(shù)據(jù)量過(guò)多而導(dǎo)致 緩存量過(guò)于龐大,可手動(dòng)配置 JindoRuntime 的 tieredstore 來(lái)約束緩存的最大容量與水位線(超過(guò)水位線的數(shù)據(jù)會(huì)被自動(dòng)丟棄),tieredstore 也包含對(duì)緩存 存放路徑的設(shè)定與存儲(chǔ)層(SSD/MEM/HDD)的設(shè)定,以滿足各種場(chǎng)景的需要。對(duì)于多節(jié)點(diǎn)的場(chǎng)景,使用dataset 的 replacement 可以支持在同一集群上部署多個(gè) dataset。
- 設(shè)定緩存安全策略:
在Fluid中創(chuàng)建Dataset時(shí),有時(shí)候我們需要在mounts中配置一些敏感信息,如 oss 賬號(hào)的 accessKeyId、accessKeySecret 。為了保證安全,Fluid提供使用Secret來(lái)配置這些敏感信息的能力。通過(guò)創(chuàng)建Secret,dataset 以 EncryptOptions 字段指定 Secret 的 name,實(shí)現(xiàn)對(duì)敏感信息的綁定。
- 數(shù)據(jù)預(yù)加載:
對(duì)于已經(jīng)創(chuàng)建完成的 dataset 和 jindoruntime,第一次訪問(wèn)掛載的數(shù)據(jù)會(huì)經(jīng)歷一次下載數(shù)據(jù)目錄下全部文件的過(guò)程,這就產(chǎn)生了一個(gè)問(wèn)題:若數(shù)據(jù)所在的目錄存在無(wú)需使用的其他數(shù)據(jù),會(huì)造成無(wú)意義的空間資源與網(wǎng)絡(luò)資源浪費(fèi)。為避免這種問(wèn)題,Fluid 既支持對(duì)數(shù)據(jù)的預(yù)加載,同時(shí)也支持元數(shù)據(jù)緩存。通 過(guò)創(chuàng)建 dataload讀取所要預(yù)加載數(shù)據(jù)路徑信息,可以動(dòng)態(tài)將數(shù)據(jù)注入。dataload 支持緩存元數(shù)據(jù)與屏蔽非預(yù)加載數(shù)據(jù)的訪問(wèn),這樣就大大降低的數(shù)據(jù)訪問(wèn)效率。
3.3 帶來(lái)的性能顯著提升
我們使用了不同的模型,推理和訓(xùn)練相同的數(shù)據(jù),分別以使用 JindoRuntime 和不使用 JindoRuntime 的方式推理和訓(xùn)練,對(duì)比訓(xùn)練時(shí)長(zhǎng),發(fā)現(xiàn)性能帶來(lái)了顯示提升:
模型在云端推理1萬(wàn)幀圖片的測(cè)試結(jié)果
另一個(gè)稍大的模型在云端推理1萬(wàn)幀圖片的測(cè)試結(jié)果
模型使用 4 卡在云端訓(xùn)練1萬(wàn)幀圖片幀耗時(shí)測(cè)試結(jié)果
集成了 Fluid+JindoRuntime 后,顯著提升了云端訓(xùn)練和推理的效率,尤其是一些小模型,在云端做訓(xùn)練和推理 JindoRuntime 可以有效解決 IO 瓶頸問(wèn)題,訓(xùn)練速度最高可提升約 300% 。同時(shí)也大幅度提升云端 GPU 使用效率,加速了在云端數(shù)據(jù)驅(qū)動(dòng)的迭代效率。
共建 Fluid 開源生態(tài),讓更多行業(yè)更“聰明”
毫末機(jī)器學(xué)習(xí)訓(xùn)練場(chǎng)景對(duì)于數(shù)據(jù)讀取有較高的性能要求,且對(duì)于元數(shù)據(jù)和數(shù)據(jù)緩存的精細(xì)化控制要求較高, 通過(guò) Fluid + JindoRuntime 的緩存能力可以靈活地緩存 OSS 訓(xùn)練文件進(jìn)行元數(shù)據(jù)和數(shù)據(jù),提供高效的元數(shù)據(jù)和數(shù)據(jù)訪問(wèn)性能。基于這種方案,我們可以實(shí)現(xiàn)精細(xì)化控制緩存的內(nèi)容,提高生產(chǎn)資源利用率,不僅有效緩解了 OSS 帶寬的壓力,也大大提高了訓(xùn)練效率。
當(dāng)前 Fluid + JindoRuntime 能夠滿足生產(chǎn)環(huán)境的基本需要,對(duì) OSS 的加速效果也比較明顯,提供的精細(xì)化緩存策略更加高效。我們期望能夠把彈性的數(shù)據(jù)加速作為毫末機(jī)器學(xué)習(xí)平臺(tái)的差異化競(jìng)爭(zhēng)能力,提升整體訓(xùn)練任務(wù)速度和計(jì)算資源的利用率。在未來(lái)的工作中,我們也希望也幫助社區(qū)不斷演進(jìn),幫助到更多的開發(fā)者。具體來(lái)說(shuō),后面在平臺(tái)中計(jì)劃增加的功能包括:
- 支持定時(shí)任務(wù)支持動(dòng)態(tài)擴(kuò)縮容
- 提供性能監(jiān)控控制臺(tái)
- 支持規(guī)模化 K8s 集群中多數(shù)據(jù)集的全生命周期管理
- 支持對(duì)緩存數(shù)據(jù)和緩存元數(shù)據(jù)的動(dòng)態(tài)刪減
致謝
感謝阿里云 JindoFS 團(tuán)隊(duì)的辰山、揚(yáng)禮和容器團(tuán)隊(duì)的車漾在整個(gè)方案設(shè)計(jì)和優(yōu)化過(guò)程中的巨大幫助,對(duì)生產(chǎn)過(guò)程中的需求給予定制化的支持,對(duì)遇到的各種問(wèn)題進(jìn)行快速的幫助和解決。
相關(guān)鏈接
[1] Fluid:https://github.com/fluid-cloudnative/fluid
[2] JindoFS:?https://github.com/aliyun/alibabacloud-jindodata
如果你對(duì) Fluid 項(xiàng)目感興趣,歡迎點(diǎn)擊下方鏈接了解更多:
https://github.com/fluid-cloudnative/fluid
「Kubernetes 難點(diǎn)攻破系列:容器持久化存儲(chǔ)訓(xùn)練營(yíng)」啟動(dòng)倒計(jì)時(shí)!
9 月 22-24 日 3 天時(shí)間集中突破,從容器持久化存儲(chǔ)開始,打開 Kubernetes 難點(diǎn)攻破之旅。完成全部打卡任務(wù),還有小米耳機(jī)、阿里云定制帽衫、精美周邊等豐富的訓(xùn)練營(yíng)獎(jiǎng)品等你來(lái)拿!
原文鏈接:https://developer.aliyun.com/article/790916?
版權(quán)聲明:本文內(nèi)容由阿里云實(shí)名注冊(cè)用戶自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,阿里云開發(fā)者社區(qū)不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。具體規(guī)則請(qǐng)查看《阿里云開發(fā)者社區(qū)用戶服務(wù)協(xié)議》和《阿里云開發(fā)者社區(qū)知識(shí)產(chǎn)權(quán)保護(hù)指引》。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,填寫侵權(quán)投訴表單進(jìn)行舉報(bào),一經(jīng)查實(shí),本社區(qū)將立刻刪除涉嫌侵權(quán)內(nèi)容。總結(jié)
以上是生活随笔為你收集整理的毫末智行 Fluid 实践:云原生 AI 让汽车变得“更聪明”的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 联邦家私:用宜搭一周上线售后管理系统,打
- 下一篇: 【宜搭客户说第二期】宜搭助力跨境金融行业