在處理小型數(shù)據(jù)集和簡(jiǎn)單算法時(shí),傳統(tǒng)的機(jī)器學(xué)習(xí)模型可以存儲(chǔ)在獨(dú)立機(jī)器或本地硬盤驅(qū)動(dòng)器上。然而,隨著深度學(xué)習(xí)的發(fā)展,團(tuán)隊(duì)在處理更大的數(shù)據(jù)集和更復(fù)雜的算法時(shí)越來越多地遇到存儲(chǔ)瓶頸。
這凸顯了分布式存儲(chǔ)在人工智能(AI)領(lǐng)域的重要性。JuiceFS 是一個(gè)開源、高性能的分布式文件系統(tǒng),為這個(gè)問題提供了解決方案。
在本文中,我們將討論 AI 團(tuán)隊(duì)面臨的挑戰(zhàn),JuiceFS 如何加速模型訓(xùn)練,以及加速模型訓(xùn)練的常見策略。
AI 團(tuán)隊(duì)經(jīng)常遇到以下挑戰(zhàn):
大型數(shù)據(jù)集:隨著數(shù)據(jù)和模型大小的增長(zhǎng),獨(dú)立存儲(chǔ)無法滿足應(yīng)用程序需求。因此,分布式存儲(chǔ)解決方案成為解決這些問題的必要條件。
完整存檔歷史數(shù)據(jù)集:在某些情況下,每天都會(huì)生成大量新數(shù)據(jù)集,并且必須作為歷史數(shù)據(jù)存檔。這在自動(dòng)駕駛領(lǐng)域尤其重要,因?yàn)榈缆窚y(cè)試車輛收集的數(shù)據(jù)(如雷達(dá)和攝像頭數(shù)據(jù))是公司的寶貴資產(chǎn)。在這些情況下,獨(dú)立存儲(chǔ)被證明是不夠的,因此分布式存儲(chǔ)成為必要的考慮因素。
小文件和非結(jié)構(gòu)化數(shù)據(jù)過多:傳統(tǒng)的分布式文件系統(tǒng)難以管理大量小文件,導(dǎo)致元數(shù)據(jù)存儲(chǔ)負(fù)擔(dān)沉重。這對(duì)于視覺模型尤其成問題。為了解決這個(gè)問題,我們需要一個(gè)針對(duì)存儲(chǔ)小文件進(jìn)行優(yōu)化的分布式存儲(chǔ)系統(tǒng)。這確保了高效的上層訓(xùn)練任務(wù)和大量小文件的輕松管理。
用于培訓(xùn)框架的 POSIX 接口:在模型開發(fā)的初始階段,算法科學(xué)家通常依靠本地資源進(jìn)行研究和數(shù)據(jù)訪問。但是,當(dāng)擴(kuò)展到分布式存儲(chǔ)以滿足更大的訓(xùn)練需求時(shí),原始代碼通常需要最少的修改。因此,分布式存儲(chǔ)系統(tǒng)應(yīng)支持 POSIX 接口,以最大程度地兼容在本地環(huán)境中開發(fā)的代碼。
共享公共數(shù)據(jù)集和數(shù)據(jù)隔離:在某些領(lǐng)域,例如計(jì)算機(jī)視覺,權(quán)威的公共數(shù)據(jù)集需要在公司內(nèi)的不同團(tuán)隊(duì)之間共享。為了促進(jìn)團(tuán)隊(duì)之間的數(shù)據(jù)共享,這些數(shù)據(jù)集通常集成并存儲(chǔ)在共享存儲(chǔ)解決方案中,以避免不必要的數(shù)據(jù)重復(fù)和冗余。
基于云的訓(xùn)練中的數(shù)據(jù) I/O 效率低:基于云的模型訓(xùn)練通常使用對(duì)象存儲(chǔ)作為存儲(chǔ)-計(jì)算分離架構(gòu)的基礎(chǔ)存儲(chǔ)。但是,對(duì)象存儲(chǔ)的讀寫性能不佳可能會(huì)導(dǎo)致訓(xùn)練期間出現(xiàn)重大瓶頸。
JuiceFS 如何幫助提高模型訓(xùn)練效率
什么是果汁FS?
JuiceFS 是一個(gè)開源、云原生的分布式文件系統(tǒng),兼容 POSIX、HDFS 和 S3 API。JuiceFS 采用解耦架構(gòu),將元數(shù)據(jù)存儲(chǔ)在元數(shù)據(jù)引擎中,并將文件數(shù)據(jù)上傳到對(duì)象存儲(chǔ),提供高性價(jià)比、高彈性的存儲(chǔ)解決方案。
JuiceFS 的用戶遍布 20 多個(gè)國家,包括人工智能、互聯(lián)網(wǎng)、汽車、電信、金融科技等行業(yè)的龍頭企業(yè)。
模型訓(xùn)練場(chǎng)景中 JuiceFS 的架構(gòu)。
JuiceFS 在模型訓(xùn)練場(chǎng)景中的架構(gòu)由三個(gè)組件組成:
元數(shù)據(jù)引擎:任何數(shù)據(jù)庫,如 Redis 或 MySQL,都可以用作元數(shù)據(jù)引擎。用戶可以根據(jù)自己的需求做出選擇。
對(duì)象存儲(chǔ):您可以使用公有云或自托管提供的任何受支持的對(duì)象存儲(chǔ)服務(wù)。
果汁FS客戶端:要像訪問本地硬盤一樣訪問 JuiceFS 文件系統(tǒng),用戶需要將其掛載在每個(gè) GPU 和計(jì)算節(jié)點(diǎn)上。
底層存儲(chǔ)依賴于對(duì)象存儲(chǔ)中的原始數(shù)據(jù),每個(gè)計(jì)算節(jié)點(diǎn)都有一些本地緩存,包括元數(shù)據(jù)和數(shù)據(jù)緩存。
JuiceFS 設(shè)計(jì)允許在每個(gè)計(jì)算節(jié)點(diǎn)上多級(jí)本地緩存:
第一級(jí):基于內(nèi)存的緩存
第二級(jí):基于磁盤的緩存
對(duì)象存儲(chǔ)僅在緩存滲透時(shí)訪問。
對(duì)于獨(dú)立模型,在第一輪訓(xùn)練中,訓(xùn)練集或數(shù)據(jù)集通常不會(huì)命中緩存。但是,從第二輪開始,有了足夠的緩存資源,幾乎不需要訪問對(duì)象存儲(chǔ)。這可以加速數(shù)據(jù) I/O。
JuiceFS 中的讀寫緩存流程
我們之前比較了使用或不使用緩存來訓(xùn)練訪問對(duì)象存儲(chǔ)時(shí)的效率。結(jié)果表明,JuiceFS 的元數(shù)據(jù)緩存和數(shù)據(jù)緩存,與對(duì)象存儲(chǔ)相比,平均性能提升了 4 倍以上,性能提升了近 7 倍。
下圖顯示了在 JuiceFS 中讀寫緩存的過程:
JuiceFS 的讀寫緩存流程
對(duì)于上圖中的“塊緩存”,塊是 JuiceFS 中的一個(gè)邏輯概念。每個(gè)文件分為多個(gè) 64 MB 的塊,以提高大文件的讀取性能。這些信息緩存在 JuiceFS 進(jìn)程的內(nèi)存中,以加速元數(shù)據(jù)訪問效率。
JuiceFS 中的讀緩存流程:
1. 應(yīng)用程序(可以是 AI 模型訓(xùn)練應(yīng)用程序,也可以是任何啟動(dòng)讀取請(qǐng)求的應(yīng)用程序)發(fā)送請(qǐng)求。
2. 請(qǐng)求進(jìn)入左側(cè)的內(nèi)核空間。內(nèi)核檢查請(qǐng)求的數(shù)據(jù)在內(nèi)核頁面緩存中是否可用。如果沒有,請(qǐng)求會(huì)回到用戶空間中的 JuiceFS 進(jìn)程,該進(jìn)程處理所有讀寫請(qǐng)求。
默認(rèn)情況下,JuiceFS 在內(nèi)存中維護(hù)一個(gè)讀取緩沖區(qū)。當(dāng)請(qǐng)求無法從緩沖區(qū)檢索數(shù)據(jù)時(shí),JuiceFS 會(huì)訪問塊緩存索引,這是一個(gè)基于本地磁盤的緩存目錄。JuiceFS 將文件劃分為 4 MB 塊進(jìn)行存儲(chǔ),因此緩存粒度也是 4 MB。
例如,當(dāng)客戶端訪問文件的一部分時(shí),它僅將與該部分?jǐn)?shù)據(jù)對(duì)應(yīng)的 4 MB 塊緩存到本地緩存目錄,而不是整個(gè)文件。這是 JuiceFS 與其他文件系統(tǒng)或緩存系統(tǒng)的顯著區(qū)別。
3. 塊緩存索引在本地緩存目錄中快速定位文件塊。如果找到文件塊,JuiceFS 會(huì)從本地磁盤讀取,進(jìn)入內(nèi)核空間,并將數(shù)據(jù)返回給 JuiceFS 進(jìn)程,再將數(shù)據(jù)返回給應(yīng)用。
4. 讀取本地磁盤數(shù)據(jù)后,也會(huì)緩存在內(nèi)核頁面緩存中。這是因?yàn)槿绻皇褂弥苯?I/O,Linux 系統(tǒng)會(huì)默認(rèn)將數(shù)據(jù)存儲(chǔ)在內(nèi)核頁面緩存中。內(nèi)核頁面緩存可加快緩存訪問速度。如果第一個(gè)請(qǐng)求命中并返回?cái)?shù)據(jù),則請(qǐng)求不會(huì)通過用戶空間 (FUSE) 層中的文件系統(tǒng)進(jìn)入用戶空間進(jìn)程。如果沒有,JuiceFS 客戶端會(huì)通過緩存目錄來獲取這些數(shù)據(jù)。如果在本地找不到,則會(huì)將網(wǎng)絡(luò)請(qǐng)求發(fā)送到對(duì)象存儲(chǔ),然后提取數(shù)據(jù)并將其返回到應(yīng)用程序。
5. 當(dāng) JuiceFS 從對(duì)象存儲(chǔ)下載數(shù)據(jù)時(shí),數(shù)據(jù)會(huì)異步寫入本地緩存目錄。這可確保下次訪問同一塊時(shí),可以在本地緩存中命中該塊,而無需再次從對(duì)象存儲(chǔ)中檢索它。
與數(shù)據(jù)緩存不同,元數(shù)據(jù)緩存時(shí)間更短。為了確保強(qiáng)一致性,默認(rèn)情況下不緩存 Open 操作??紤]到元數(shù)據(jù)流量較低,其對(duì)整體 I/O 性能的影響很小。但是,在小文件密集型場(chǎng)景中,元數(shù)據(jù)的開銷也占據(jù)了一定的比例。
為什么AI模型訓(xùn)練太慢?
當(dāng)你使用 JuiceFS 進(jìn)行模型訓(xùn)練時(shí),性能是你應(yīng)該考慮的關(guān)鍵因素,因?yàn)樗苯佑绊懹?xùn)練過程的速度。有幾個(gè)因素可能會(huì)影響 JuiceFS 的培訓(xùn)效率:
元數(shù)據(jù)引擎
元數(shù)據(jù)引擎(如 Redis、TiKV 或 MySQL)的選擇會(huì)在處理小文件時(shí)顯著影響性能。一般來說,Redis 比其他數(shù)據(jù)庫快 3-5 倍。如果元數(shù)據(jù)請(qǐng)求速度較慢,請(qǐng)嘗試使用更快的數(shù)據(jù)庫作為元數(shù)據(jù)引擎。
對(duì)象存儲(chǔ)
對(duì)象存儲(chǔ)會(huì)影響數(shù)據(jù)存儲(chǔ)訪問的性能和吞吐量。公有云對(duì)象存儲(chǔ)服務(wù)提供穩(wěn)定的性能。如果您使用自建對(duì)象存儲(chǔ)(例如 Ceph 或 MinIO),則可以優(yōu)化組件以提高性能和吞吐量。
本地磁盤
緩存目錄存儲(chǔ)的位置對(duì)整體讀取性能有重大影響。在高緩存命中率的情況下,緩存磁盤的 I/O 效率會(huì)影響整體 I/O 效率。因此,您必須考慮存儲(chǔ)類型、存儲(chǔ)介質(zhì)、磁盤容量和數(shù)據(jù)集大小等因素。
網(wǎng)絡(luò)帶寬
第一輪訓(xùn)練后,如果數(shù)據(jù)集不足以在本地完全緩存,網(wǎng)絡(luò)帶寬或資源消耗會(huì)影響數(shù)據(jù)訪問效率。在云中,不同的機(jī)器型號(hào)具有不同的網(wǎng)卡帶寬。這也會(huì)影響數(shù)據(jù)訪問速度和效率。
內(nèi)存大小
內(nèi)存大小會(huì)影響內(nèi)核頁緩存的大小。當(dāng)有足夠的內(nèi)存時(shí),剩余的可用內(nèi)存可以作為 JuiceFS 的數(shù)據(jù)緩存。這可以進(jìn)一步加快數(shù)據(jù)訪問速度。
但是,當(dāng)可用內(nèi)存很少時(shí),您需要通過本地磁盤獲取數(shù)據(jù)訪問權(quán)限。這會(huì)導(dǎo)致訪問開銷增加。此外,在內(nèi)核模式和用戶模式之間切換會(huì)影響性能,例如系統(tǒng)調(diào)用的上下文切換開銷。
如何排查 JuiceFS 中的問題
JuiceFS 提供了許多工具來優(yōu)化性能和診斷問題。
工具#1:命令juicefs profile
您可以運(yùn)行該命令來分析訪問日志以進(jìn)行性能優(yōu)化。掛載每個(gè)文件系統(tǒng)后,都會(huì)生成訪問日志。但是,訪問日志不會(huì)實(shí)時(shí)保存,僅在查看時(shí)顯示。juicefs profile
與查看原始訪問日志相比,該命令聚合信息并執(zhí)行滑動(dòng)窗口數(shù)據(jù)統(tǒng)計(jì)信息,按響應(yīng)時(shí)間從高到低對(duì)請(qǐng)求進(jìn)行排序。這有助于您專注于響應(yīng)時(shí)間較慢的請(qǐng)求,進(jìn)一步分析請(qǐng)求與元數(shù)據(jù)引擎或?qū)ο蟠鎯?chǔ)之間的關(guān)系。juicefs profile
工具#2:命令juicefs stats
該命令從宏觀角度收集監(jiān)視數(shù)據(jù)并實(shí)時(shí)顯示。它監(jiān)控當(dāng)前掛載點(diǎn)的 CPU 使用率、內(nèi)存使用率、內(nèi)存中的緩沖區(qū)使用率、FUSE 讀/寫請(qǐng)求、元數(shù)據(jù)請(qǐng)求和對(duì)象存儲(chǔ)延遲。通過這些詳細(xì)的監(jiān)控指標(biāo),可以輕松查看和分析模型訓(xùn)練期間的潛在瓶頸或性能問題。juicefs stats
其他工具
JuiceFS 還提供了 CPU 和堆分析的性能分析工具:
CPU 分析工具分析了 JuiceFS 進(jìn)程執(zhí)行速度的瓶頸,適合熟悉源代碼的用戶。
堆分析工具會(huì)分析內(nèi)存使用情況,尤其是在 JuiceFS 進(jìn)程占用大量?jī)?nèi)存時(shí)。有必要使用堆分析工具來確定哪些函數(shù)或數(shù)據(jù)結(jié)構(gòu)消耗了大量?jī)?nèi)存。
加速AI模型訓(xùn)練的常用方法
元數(shù)據(jù)緩存優(yōu)化
您可以通過兩種方式優(yōu)化元數(shù)據(jù)緩存,如下所示。
調(diào)整內(nèi)核元數(shù)據(jù)緩存的超時(shí)
參數(shù) 、 和對(duì)應(yīng)于不同類型的元數(shù)據(jù):--attr-cache--entry-cache--dir-entry-cache
attr表示文件屬性,例如大小、修改時(shí)間和訪問時(shí)間。
entry表示 Linux 中的文件和相關(guān)屬性。
dir-entry表示目錄及其包含的文件。
這些參數(shù)分別控制元數(shù)據(jù)緩存的超時(shí)。
為了保證數(shù)據(jù)的一致性,這些參數(shù)的默認(rèn)超時(shí)值僅為1秒。在模型訓(xùn)練場(chǎng)景中,不會(huì)修改原始數(shù)據(jù)。因此,可以將這些參數(shù)的超時(shí)時(shí)間延長(zhǎng)到幾天甚至一周。請(qǐng)注意,元數(shù)據(jù)緩存無法主動(dòng)失效,只能在超時(shí)期限到期后刷新。
優(yōu)化 JuiceFS 客戶端的用戶級(jí)元數(shù)據(jù)緩存
打開文件時(shí),元數(shù)據(jù)引擎通常會(huì)檢索最新的文件屬性以確保強(qiáng)一致性。但是,由于通常不會(huì)修改模型訓(xùn)練數(shù)據(jù),因此可以啟用該參數(shù),并且可以設(shè)置超時(shí)以避免每次打開同一文件時(shí)重復(fù)訪問元數(shù)據(jù)引擎。
此外,該參數(shù)控制緩存文件的最大數(shù)量。默認(rèn)值為 10,000,這意味著最近打開的 10,000 個(gè)文件的元數(shù)據(jù)最多將緩存在內(nèi)存中。可以根據(jù)數(shù)據(jù)集中的文件數(shù)調(diào)整此值。
數(shù)據(jù)緩存優(yōu)化
JuiceFS 數(shù)據(jù)緩存包括內(nèi)核頁面緩存和本地?cái)?shù)據(jù)緩存:
內(nèi)核頁面緩存不能通過參數(shù)調(diào)整。因此,在計(jì)算節(jié)點(diǎn)上預(yù)留足夠的空閑內(nèi)存,以便 JuiceFS 能夠充分利用它。如果計(jì)算節(jié)點(diǎn)上的資源緊張,JuiceFS 不會(huì)在內(nèi)核中緩存數(shù)據(jù)。
本地?cái)?shù)據(jù)緩存可由用戶控制,緩存參數(shù)可根據(jù)具體場(chǎng)景進(jìn)行調(diào)整。
調(diào)整緩存大小,默認(rèn)值為 100 GB,這足以滿足大多數(shù)方案的需求。但是,對(duì)于占用特別大的存儲(chǔ)空間的數(shù)據(jù)集,需要適當(dāng)調(diào)整緩存大小。否則 100 GB 的緩存空間可能會(huì)很快被填滿,使得 JuiceFS 無法緩存更多數(shù)據(jù)。
另一個(gè)可以與之一起使用的參數(shù)是 。它確定緩存磁盤上的可用空間量。默認(rèn)值為 0.1,它允許將最多 90% 的磁盤空間用于緩存數(shù)據(jù)。
JuiceFS 也支持同時(shí)使用多個(gè)緩存盤。建議盡可能使用所有可用磁盤。數(shù)據(jù)將通過輪詢均勻分布到多個(gè)磁盤,實(shí)現(xiàn)負(fù)載均衡,最大化多個(gè)磁盤的存儲(chǔ)優(yōu)勢(shì)。
緩存預(yù)熱
為了提高訓(xùn)練效率,您可以使用緩存預(yù)熱來加速訓(xùn)練任務(wù)。JuiceFS 支持在客戶端預(yù)熱元數(shù)據(jù)緩存和本地?cái)?shù)據(jù)緩存。該命令會(huì)提前構(gòu)建緩存,以便在訓(xùn)練任務(wù)開始時(shí)緩存可用,從而提高效率。
增加緩沖區(qū)大小
緩沖區(qū)大小也會(huì)影響讀取性能。默認(rèn)情況下,緩沖區(qū)大小為 300 MB。但在高通量訓(xùn)練場(chǎng)景中,這可能還不夠。您可以根據(jù)訓(xùn)練節(jié)點(diǎn)的內(nèi)存資源調(diào)整緩沖區(qū)大小。
一般來說,緩沖區(qū)大小越大,讀取性能越好。但不要將值設(shè)置得太大,尤其是在最大內(nèi)存有限的容器環(huán)境中。有必要根據(jù)實(shí)際工作負(fù)載設(shè)置緩沖區(qū)大小,并找到一個(gè)相對(duì)合理的值??梢允褂帽疚那懊娼榻B的命令實(shí)時(shí)監(jiān)視緩沖區(qū)使用情況。
審核編輯:郭婷
評(píng)論
查看更多