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