通過ossfs,您可以像操作本地檔案一樣直接存取和管理OSS中的Object,從而實現資料的無縫共用和操作。本文介紹ossfs 1.91.2和1.91.3版本的新功能情況。
1.91.2版本
新增直讀模式
ossfs讀檔案時,預設從雲上下載的資料會先寫到磁碟,再從磁碟讀取返回給使用者。由於ossfs的磁碟寫操作均為非同步寫,因此下載的資料會先寫到記憶體page cache,作業系統非同步將髒頁刷到磁碟上。使用者讀取時,如果記憶體快取命中則直接返回。
ossfs讀檔案時預設會將預取的資料全部保留在磁碟上,磁碟空間到達上限才會淘汰。
當記憶體足夠大時,所有的資料均緩衝在記憶體page cache中,不受到磁碟頻寬的限制,僅受機器的網路頻寬節流設定。
當記憶體不足以緩衝整個檔案時,下載的資料需要落盤,讀取資料也需要從磁碟讀,因此讀效能同時會受到磁碟頻寬和網路頻寬節流設定。一般磁碟頻寬是主要效能制約。
預設模式下,當檔案較大時,ossfs讀效能受到磁碟效能的制約,因此新增直讀模式。
直讀模式下,ossfs從雲上下載的資料會存放在記憶體buffer中,讀取時資料直接從記憶體buffer返回,整個流程並不涉及磁碟,從而可以充分利用網路頻寬,提升順序讀效能。
直讀模式下,ossfs以chunk(預設4 MB,可通過direct_read_chunk_size參數設定)為單位管理下載的資料,會在記憶體中保留
[當前chunk - 1, 當前chunk + direct_read_prefetch_chunks]
區間內的資料,如果下一次讀的位移量超過這個區間,因此ossfs會丟棄已經下載的資料,並從新的位移量處開始重新預取。
直讀模式僅適用於順序讀(唯讀)情境,對於其他情境:
隨機讀:ossfs只會保留當前讀位移量視窗內的資料,如果隨機讀的位移量超過這個區間,則會造成資料被多次下載、釋放,導致網路資源浪費和效能下降。因此大量隨機讀操作的情境不適合開啟直讀模式。
寫:資料寫入仍然會先寫入本地磁碟。為了保證效能與資料一致性,如果當前檔案直讀過程中有寫請求,該檔案將自動回退到預設的讀模式,即下載到磁碟的邏輯。針對某一個檔案的寫不會導致其他檔案退出直讀模式。
直讀模式相關配置請參見下表:
參數 | 說明 | 預設值 |
direct_read | 是否開啟直讀模式。直接通過-odirect_read開啟。 | disabled |
direct_read_chunk_size | 每個預取任務下載資料的大小,單位為MB。 | 4 |
direct_read_prefetch_chunks | 預取的chunk數量。 | 32 |
direct_read_prefetch_limit | 所有檔案預取資料總量上限,單位為MB。 | 1024 |
direct_read_prefetch_thread | 預取線程數量。 | 64 |
1.91.3版本
新增參數direct_read_backward_chunks
直讀模式下,ossfs保留[當前chunk - 1, 當前chunk + direct_read_prefetch_chunks]
區間內的資料,當前讀的位置之前只保留一個chunk的資料,如果使用者向前跳躍讀,則會丟棄大量已經預取的資料,有可能造成頻寬與資源浪費,以及效能下降。
新增參數direct_read_backward_chunks,使ossfs保留[當前chunk - direct_read_backward_chunks, 當前chunk + direct_read_prefetch_chunks]
區間內的資料。在AI推理情境下,載入safetensors模型檔案(隨機讀)時,通過調大direct_read_backward_chunks參數,能有更多的資料保留,減少資料重複下載,一定程度上提升效能。
參數 | 說明 | 預設值 | |
direct_read_backward_chunks | 在直讀模式下,保留當前讀請求位置之前已下載的chunk數量,單位為個。1個chunk的預設大小為4 MB。 本次新增的參數。 | 1 | |
stat_cache_expire | 中繼資料到期時間,單位為秒。新支援設為-1,即永不到期。 失效後會重新載入快取資料。 | 900 |
新增混合直讀模式
在隨機讀頻繁且跳躍範圍較大的情境下:
直讀模式的ossfs會頻繁下載資料並丟棄,再重複下載,效能會受到很大影響。
預設模式的ossfs會將資料下載到磁碟上,在磁碟空間到達上限之前不會丟棄,因此無重複下載。
當檔案不大時,下載的資料直接寫到記憶體page cache中隨後直接返回,不會受到磁碟效能限制。
當檔案較大,page cache無法全部緩衝之後,讀效能受到磁碟效能制約。
混合直讀模式兼具了預設落盤模式和純直讀模式的優勢。小檔案可以全部利用page cache加速,大檔案可以充分利用page cache,超過一定上限之後才切換到直讀模式,同樣避免受到磁碟效能限制。
參數 | 說明 | 預設值 |
direct_read_local_file_cache_size_mb | 混合直讀模式下,資料預設下載到磁碟上。當下載資料總量超過該值時,切換到直讀模式,單位為MB。 | 0(等同直讀模式) |
1.91.3及以上版本使用最佳實務
純直讀模式
適合順序唯讀大檔案的情境,支援一定亂序(如跳躍範圍為少量chunk)。如:AI推理載入大型safetensors模型檔案。
您需要開啟-odirect_read。
直讀模式的資料保留視窗為
[-direct_read_backward_chunks * direct_read_chunk_size, +direct_read_prefetch_chunks * direct_read_chunk_size]
,其中direct_read_chunk_size預設為4 MB,direct_read_prefetch_chunks預設為32,direct_read_backward_chunks預設為1,即預設資料保留視窗為[-4 MB, +128 MB]
。如果讀取亂序確定在小範圍內(例如:部分safetensors模型檔案,連續兩次讀的位置跳躍範圍在[-32 MB, +32 MB]
之間),則可以設定-odirect_read_backward_chunks=8,保留當前位移量之前32 MB的資料。您還可以適當調整direct_read_prefetch_chunks、direct_read_chunk_size參數,提升並行預取的資料量,充分利用網路頻寬。
預設模式
適合小檔案(指page cache能夠快取檔案)和大檔案隨機唯讀情境。如:AI 訓練中大量原始圖片素材檔案。使用純直讀模式,即使開啟了部分亂序仍然讀取效能很差時,建議嘗試使用預設模式。
ossfs讀檔案時,核心會緩衝一份ossfs掛載點檔案的資料在記憶體中,另外ossfs會將資料寫在磁碟快取檔案上,因此記憶體還有一份快取檔案的資料,即一個檔案會在記憶體中有雙倍緩衝。
如果您的作業系統page cache最多緩衝6 GB的髒資料,那麼理論上預設模式適合大小為3 GB以下的檔案讀。
您可以設定parallel_count參數調節下載資料的並發數量,設定multipart_size參數調節單個任務下載資料量。
混合直讀模式
適合小檔案(指page cache能夠快取檔案)和大檔案混雜唯讀情境,支援一定亂序(如跳躍範圍為數個chunk)。如:AI推理載入大型safetensors模型檔案。如果大檔案讀取中出現大幅隨機跳躍,此模式效能會低於預設模式。
您需要開啟-odirect_read。
您需要設定direct_read_local_file_cache_size_mb參數來控制下載落盤的資料大小。如機器page cache最多6 GB時,可以設定-odirect_read_local_file_cache_size_mb=3072,當下載資料到達3 GB時,切換到直讀模式。
直讀模式的資料保留視窗為
[-direct_read_backward_chunks * direct_read_chunk_size, +direct_read_prefetch_chunks * direct_read_chunk_size]
,direct_read_chunk_size預設為4 MB,direct_read_prefetch_chunks預設為32,direct_read_backward_chunks預設為1,則預設資料保留視窗為[-4 MB, +128 MB]
。如果讀取亂序確定在少量範圍內(如:部分safetensors模型檔案,連續兩次讀的位置跳躍範圍在[-32 MB, +32 MB]
之間),則可以設定-odirect_read_backward_chunks=8,保留當前位移量之前32 MB的資料。您還可以適當調整direct_read_prefetch_chunks、direct_read_chunk_size參數,提升並行預取的資料量,充分利用網路頻寬。
如何選擇3種模式
如果您的檔案是在通過ossfs寫入時進行讀取,請直接使用預設模式。
如果您的ossfs只會對檔案進行讀取,或通過ossfs寫入和讀取的是不同檔案:
說明當嘗試純直讀模式和混合直讀模式發現效能較差時,建議使用預設模式,將檔案快取至本地磁碟。使用預設模式時,磁碟效能容易成為ossfs的瓶頸,建議提高ossfs使用的磁碟配置。例如:使用ESSD AutoPL,並配置適當的預配置效能或使用效能突發。
情境
說明
只有小檔案
請使用預設模式。
只有大檔案
順序讀取或小幅跳躍(部分safetensors模型檔案),請使用純直讀模式。
大幅跳躍隨機讀取,請使用預設模式。
無法確認讀模數式,或使用純直讀模式並調整了direct_read_backward_chunks後,效能仍然差時,請使用預設模式。
小檔案和大檔案混雜
大檔案為順序讀取或小幅跳躍(部分safetensors模型檔案),請使用混合直讀模式。
大檔案會大幅隨機跳躍讀取、無法確認讀模數式或使用混合直讀模式並調整了direct_read_backward_chunks後,效能仍然差時,請使用預設模式。
效能測試對比
測試1 順序讀
機器規格
記憶體:32GB
磁碟頻寬:130MB/s
內網頻寬:750MB/s
掛載命令
預設模式ossfs掛載命令:
ossfs [bucket name] [mountpoint] -ourl=[endpoint] -oparallel_count=32 -omultipart_size=16
直讀模式ossfs掛載命令:
ossfs [bucket name] [mountpoint] -ourl=[endpoint] -odirect_read -odirect_read_chunk_size=8 -odirect_read_prefetch_chunks=64
測試命令:
dd if=testfile of=/dev/null bs=1M status=progress
測試結果:
檔案大小
預設模式
直讀模式
1 GB
646MB/s
592MB/s
5 GB
630MB/s
611MB/s
10 GB
260MB/s
574MB/s
測試2 pytorch負載檔案測試
機器規格
記憶體:15GB
磁碟頻寬:150MB/s
內網頻寬:500MB/s
掛載命令
預設模式ossfs掛載命令:
ossfs [bucket name] [mountpoint] -ourl=[endpoint] -oparallel_count=32 -omultipart_size=16
直讀模式ossfs掛載命令:
ossfs [bucket name] [mountpoint] -ourl=[endpoint] -odirect_read -odirect_read_chunk_size=8 -odirect_read_prefetch_chunks=64 -odirect_read_backward_chunks=16
混合直讀模式ossfs掛載命令:
ossfs [bucket name] [mountpoint] -ourl=[endpoint] -oparallel_count=32 -omultipart_size=16 -odirect_read -odirect_read_chunk_size=8 -odirect_read_prefetch_chunks=64 -odirect_read_backward_chunks=16 -odirect_read_local_file_cache_size_mb=3072
測試
測試指令碼:
import time from safetensors.torch import load_file file_path = "./my_folder/bert.safetensors" start = time.perf_counter() loaded = load_file(file_path) end = time.perf_counter() elapsed = end - start print("time_spent:", elapsed)
測試結果:
說明測試結果僅供參考,實際讀的耗時除了和檔案大小有關,也和safetensors模型結構本身有關。
檔案大小
預設模式
直讀模式
混合直讀模式
2.0 GB
4.00s
5.86s
3.94s
5.3 GB
20.54s
27.33s
19.91s
6.5 GB
30.14s
24.23s
17.93s