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