本頁面提供相關指引,說明如何使用 Cloud Storage FUSE 的重要功能和設定,盡可能提高輸送量及最佳化效能,特別是針對人工智慧和機器學習 (AI/ML) 工作負載,例如訓練、服務和檢查點。
注意事項
套用本頁建議的設定前,請先考慮下列事項:
您可以使用三種方法,在這個頁面中套用建議的設定:
僅限 Google Kubernetes Engine:Google Kubernetes Engine YAML 範例檔案
確認你使用的是最新版 Cloud Storage FUSE。建議的設定僅適用於 Cloud Storage FUSE 3.0 以上版本,以及在 GKE 叢集 1.32.2-gke.1297001 以上版本執行的 Google Kubernetes Engine 適用的 Cloud Storage FUSE CSI 驅動程式。
建議的設定會將 Cloud Storage 中繼資料快取至工作長度,且在檔案系統的初始掛接後不會檢查。因此,為獲得最佳效能,建議檔案系統為唯讀,或檔案系統語意為寫入新檔案應用程式,也就是應用程式一律寫入新檔案。下列 AI/ML 工作負載會寫入新資料:
檢查點
訓練
供應
jax.jit()
快取
本頁面中的建議設定已針對大規模的 Cloud GPU 和 Cloud TPU 大型機器類型進行驗證,這些類型具有大量記憶體和高頻寬網路介面。Cloud GPU 和 Cloud TPU 機器類型在主機節點設定中,可用的 CPU、記憶體和本機儲存空間等資源數量可能不同。這可能會直接影響下列設定的效能:
A3 Mega - 1.8 TiB 記憶體,搭配 6 TiB LSSD
Cloud TPU v5e - 188 GiB 記憶體,不含 LSSD
Cloud TPU v5p - 448 GiB 記憶體,不含 LSSD
Cloud TPU v6 (Trillium) - 1.5 TiB 記憶體,不含 LSSD
使用已啟用階層命名空間的 bucket
請一律使用已啟用階層命名空間的 bucket。階層式命名空間會將資料整理成階層式檔案系統結構,讓 bucket 內的操作更有效率,進而縮短回應時間,並減少每次操作的整體清單呼叫次數。
階層式命名空間的優點包括:
與平面 bucket 相比,採用階層結構式命名空間的 bucket 初始每秒查詢次數 (QPS) 最高可達八倍。階層式命名空間支援每秒 40,000 次的初始物件讀取要求,以及 8,000 次的初始物件寫入要求,遠高於一般的 Cloud Storage FUSE 平面值區 (初始物件讀取要求為每秒 5,000 次,初始物件寫入要求為 1,000 次)。
階層命名空間提供不可分割的目錄重新命名作業,這是使用 Cloud Storage FUSE 進行檢查點作業時的必要條件,可確保作業的不可分割性。啟用階層式命名空間的 bucket 特別適合大規模檢查點作業,因為 ML 架構會使用目錄重新命名來完成檢查點作業,這項指令速度快且不可分割,但僅支援啟用階層式命名空間的 bucket。如果您選擇不使用已啟用階層命名空間的 bucket,請參閱「提高非 HNS bucket 的重新命名限制」。
如要瞭解如何建立已啟用階層式命名空間的值區,請參閱「建立已啟用階層式命名空間的值區」。如要瞭解如何掛接已啟用階層命名空間的 bucket,請參閱「掛接已啟用階層命名空間的 bucket」。Google Kubernetes Engine 1.31.1-gke.2008000 以上版本支援階層式命名空間。
執行目錄專屬掛接作業
如要存取值區內的特定目錄,可以使用 only-dir
掛接選項掛接特定目錄,而不必掛接整個值區。執行目錄專屬的掛接作業可加快清單呼叫速度,並限制解析檔案名稱時要遍歷的目錄數量,進而減少清單和統計資料呼叫的總數,因為 LookUpInode
呼叫和值區/目錄存取要求會自動為路徑中的每個檔案或目錄產生清單和統計資料呼叫。
如要掛接特定目錄,請使用下列其中一種方法:
Google Kubernetes Engine
搭配 Google Kubernetes Engine 專用的 Cloud Storage FUSE CSI 驅動程式使用下列掛接設定:
volumeHandle: BUCKET_NAME
- only-dir:DIRECTORY_NAME
其中:
BUCKET_NAME
是您要掛接目錄的值區名稱。DIRECTORY_NAME
是您要掛接的目錄名稱。
Compute Engine
執行 gcsfuse --only-dir
指令,在 Compute Engine 虛擬機器上掛接特定目錄:
gcsfuse --only-dir DIRECTORY_NAME BUCKET_NAME MOUNT_POINT
其中:
BUCKET_NAME
是您要掛接目錄的值區名稱。DIRECTORY_NAME
是您要掛接的目錄名稱。MOUNT_POINT
是要掛接 bucket 的本機目錄。例如:/path/to/mount/point
。
如要進一步瞭解如何執行目錄掛接,請參閱「掛接 bucket 中的目錄」。
增加中繼資料快取值
如要提升重複讀取作業的效能,您可以設定 Cloud Storage FUSE 快取大量中繼資料,並略過中繼資料到期時間,避免重複向 Cloud Storage 提出中繼資料要求,大幅提升效能。
增加中繼資料快取值有助於處理重複讀取的工作負載,可避免重複呼叫 Cloud Storage,並適用於可設定無限 TTL 的唯讀磁碟區。
提高中繼資料快取值前,請先考量下列事項:
只有唯讀或僅供寫入新資料的磁碟區,才應設定無限存留時間 (TTL)。
只有在記憶體配置較大的節點上,才應啟用中繼資料快取,並大幅增加快取大小,因為這項功能會快取每個節點中指定掛接點的所有中繼資料,並免除對 Cloud Storage 的額外存取需求。
本節中的設定會以無限 TTL 存取所有中繼資料,因此當任何其他用戶端在同一個 Cloud Storage 值區中進行變更時 (例如覆寫或刪除檔案),可能會影響一致性保證。
如要確認記憶體用量未受影響,請驗證中繼資料快取耗用的記憶體容量是否可接受 (可能達到 GB 級,取決於已掛接的 bucket 中的檔案數量,以及使用的掛接點數量)。舉例來說,每個檔案的中繼資料約佔 1.5 KiB 的記憶體,因此一百萬個檔案的中繼資料約佔 1.5 GiB 的記憶體。詳情請參閱快取總覽。
請按照下列操作說明,將 Cloud Storage FUSE 設定為快取大量中繼資料,並略過中繼資料到期時間:
CLI 選項
gcsfuse --metadata-cache-ttl-secs=-1 \ --stat-cache-max-size-mb=-1 \ --type-cache-max-size-mb=-1 \ BUCKET_NAME MOUNT_POINT
其中:
BUCKET_NAME
是值區名稱。MOUNT_POINT
是要掛接 bucket 的本機目錄。例如:/path/to/mount/point
。
設定檔
metadata-cache: stat-cache-max-size-mb: -1 ttl-secs: -1 type-cache-max-size-mb: -1
Google Kubernetes Engine
mountOptions: - metadata-cache:ttl-secs:-1 - metadata-cache:stat-cache-max-size-mb:-1 - metadata-cache:type-cache-max-size-mb:-1
Compute Engine
gcsfuse --metadata-cache-ttl-secs=-1 \ --stat-cache-max-size-mb=-1 \ --type-cache-max-size-mb=-1 \ BUCKET_NAME MOUNT_POINT
其中:
BUCKET_NAME
是值區名稱。MOUNT_POINT
是要掛接 bucket 的本機目錄。例如:/path/to/mount/point
。
預先填入中繼資料快取
執行工作負載前,建議您預先填入中繼資料快取,這能大幅提升效能,並大幅減少對 Cloud Storage 的中繼資料呼叫次數,特別是使用 implicit-dirs
設定選項時。GKE 適用的 Cloud Storage FUSE CSI 驅動程式提供 API,可處理預先填入中繼資料快取,請參閱「使用中繼資料預先擷取功能預先填入中繼資料快取」。
如要預先填入中繼資料快取,請使用下列其中一種方法:
Google Kubernetes Engine
將 gcsfuseMetadataPrefetchOnMount
CSI 音量屬性旗標設為 true
:
在 Google Kubernetes Engine 1.32.1-gke.1357001 以上版本中,您可以使用 PersistentVolume
定義的 volumeAttributes
欄位中的 gcsfuseMetadataPrefetchOnMount
設定選項,為特定磁碟區啟用中繼資料預先擷取功能。使用 gcsfuseMetadataPrefetchOnMount
設定選項時,不需要 initContainer
方法。
apiVersion: v1 kind: PersistentVolume metadata: name: training-bucket-pv spec: ... csi: volumeHandle: BUCKET_NAME volumeAttributes: ... gcsfuseMetadataPrefetchOnMount: "true"
其中:
BUCKET_NAME
是值區名稱。
Linux
在 Cloud Storage FUSE 掛接點手動執行 ls -R
指令,以遞迴方式列出所有檔案,並預先填入中繼資料快取:
ls -R MOUNT_POINT > /dev/null
其中:
MOUNT_POINT
:Cloud Storage FUSE 掛接點的路徑。
Compute Engine
在 Cloud Storage FUSE 掛接點手動執行 ls -R
指令,以遞迴方式列出所有檔案,並預先填入中繼資料快取:
ls -R MOUNT_POINT > /dev/null
其中:
MOUNT_POINT
:Cloud Storage FUSE 掛接點的路徑。
啟用檔案快取和並行下載功能
檔案快取功能可讓您在本機儲存經常存取的檔案資料,加快重複讀取速度並降低 Cloud Storage 費用。啟用檔案快取後,系統也會自動啟用平行下載功能。平行下載會使用多個工作站平行下載檔案,並將檔案快取目錄做為預先擷取緩衝區,因此模型載入速度會快上九倍。
如要瞭解如何啟用及設定檔案快取和平行下載功能,請參閱「啟用及設定檔案快取行為」。如要使用設定範例,請參閱「啟用檔案快取和並行下載的設定範例」。
使用檔案快取和並行下載時,Cloud GPU 和 Cloud TPU 的注意事項
檔案快取可託管於本機 SSD、RAM、永久磁碟或 Google Cloud Hyperdisk,但須遵守下列指引。在所有情況下,資料或個別大型檔案都必須符合檔案快取目錄的可用容量,而這項容量是透過 max-size-mb
設定控制。
Cloud GPU 注意事項
本機 SSD 非常適合用於訓練資料和檢查點下載作業。Cloud GPU 機器類型包含可用的 SSD 容量,例如包含 12 TiB SSD 的 A4 機器類型。
相較於系統上未使用的 RAM 數量,RAM 磁碟的大小較小,因此可提供最佳效能來載入模型權重。
永久磁碟或 Google Cloud Hyperdisk 都可以做為快取。
Cloud TPU 注意事項
Cloud TPU 不支援本機 SSD。如果您在 Cloud TPU 上使用檔案快取,但未進行修改,系統會使用開機磁碟區做為預設位置,這不建議使用,且會導致效能不佳。
建議您使用 RAM 磁碟,而非開機磁碟區,因為 RAM 磁碟效能較佳,且不會增加成本。不過,RAM 磁碟的大小通常會受到限制,而且最適合用於提供模型權重或檢查點下載作業,具體取決於檢查點大小和可用 RAM。此外,建議您使用永久磁碟和 Google Cloud Hyperdisk 進行快取。
啟用檔案快取和平行下載的設定範例
根據預設,如果 Google Kubernetes Engine 節點已啟用 ephemeral-storage-local-ssd
模式,檔案快取會使用本機 SSD。如果沒有可用的本機 SSD (例如在 Cloud TPU 電腦上),檔案快取會使用 Google Kubernetes Engine 節點的開機磁碟,不建議這麼做。在這種情況下,您可以使用 RAM 磁碟做為快取目錄,但請考量檔案快取可用的 RAM 數量,以及 Pod 需要的 RAM 數量。
CLI 選項
gcsfuse --file-cache-max-size-mb: -1 \ --file-cache-cache-file-for-range-read: true \ --file-cache-enable-parallel-downloads: true \ BUCKET_NAME
其中:
BUCKET_NAME
是值區名稱。
設定檔
file-cache: max-size-mb: -1 cache-file-for-range-read: true enable-parallel-downloads: true
Cloud GPU
mountOptions: - file-cache:max-size-mb:-1 - file-cache:cache-file-for-range-read:true - file-cache:enable-parallel-downloads:true # RAM disk file cache if LSSD not available. Uncomment to use # volumes: # - name: gke-gcsfuse-cache # emptyDir: # medium: Memory
Cloud TPU
mountOptions: - file-cache:max-size-mb:-1 - file-cache:cache-file-for-range-read:true - file-cache:enable-parallel-downloads:true volumes: - name: gke-gcsfuse-cache emptyDir: medium: Memory
Compute Engine
gcsfuse --file-cache-max-size-mb: -1 \ --file-cache-cache-file-for-range-read: true \ --file-cache-enable-parallel-downloads: true \ BUCKET_NAME MOUNT_POINT
其中:
BUCKET_NAME
是值區名稱。MOUNT_POINT
是要掛接 bucket 的本機目錄。例如:/path/to/mount/point
。
停用負面狀態快取項目
根據預設,Cloud Storage FUSE 會快取負面狀態項目 (即不存在的檔案項目),存留時間為五秒。在經常建立或刪除檔案的工作負載中 (例如分散式檢查點),這些快取項目很快就會過時,導致效能問題。為避免發生這種情況,建議您使用 negative-ttl-secs
設定選項,針對訓練、放送和檢查點工作負載停用負面狀態快取。
請按照下列操作說明停用負面統計資料快取:
CLI 選項
gcsfuse --metadata-cache-negative-ttl-secs: 0 \ BUCKET_NAME
其中:
BUCKET_NAME
是值區名稱。
設定檔
metadata-cache: negative-ttl-secs: 0
Google Kubernetes Engine
mountOptions: - metadata-cache:negative-ttl-secs:0
Compute Engine
gcsfuse --metadata-cache-negative-ttl-secs: 0 \ BUCKET_NAME MOUNT_POINT
其中:
BUCKET_NAME
是值區名稱。MOUNT_POINT
是要掛接 bucket 的本機目錄。例如:/path/to/mount/point
。
啟用串流寫入
串流寫入作業會將資料直接上傳至 Cloud Storage,因此可減少延遲時間和磁碟空間用量。這對大型循序寫入作業 (例如檢查點) 特別有益。根據預設,Cloud Storage FUSE 3.0 以上版本會啟用串流寫入功能。
如果系統未預設啟用串流寫入功能,請按照下列操作說明啟用。如要啟用串流寫入功能,必須使用 Cloud Storage FUSE 3.0 版,這項功能適用於 Google Kubernetes Engine 1.32.1-gke.1729000 以上版本。
CLI 選項
gcsfuse --enable-streaming-writes: true \ BUCKET_NAME
其中:
BUCKET_NAME
是值區名稱。
設定檔
write: enable-streaming-writes: true
Google Kubernetes Engine
mountOptions: - write:enable-streaming-writes:true
Compute Engine
gcsfuse --enable-streaming-writes: true \ BUCKET_NAME MOUNT_POINT
其中:
BUCKET_NAME
是值區名稱。MOUNT_POINT
是要掛接 bucket 的本機目錄。例如:/path/to/mount/point
。
增加核心預先讀取大小
對於主要涉及大型檔案循序讀取作業的工作負載 (例如提供服務和還原檢查點),增加預先讀取大小可大幅提升效能。您可以使用本機電腦上的 read_ahead_kb
Linux 核心參數完成這項操作。建議您將 read_ahead_kb
核心參數增加至 1 MB,而不是使用大多數 Linux 發行版設定的預設量 128 KB。如果是 Compute Engine 執行個體,您必須具備 sudo
或 root
權限,才能順利增加核心參數。
如要將特定 Cloud Storage FUSE 掛接目錄的 read_ahead_kb
核心參數增加至 1 MB,請按照下列操作說明進行。執行指令前,必須先將 bucket 掛接至 Cloud Storage FUSE,否則核心參數不會增加。
Google Kubernetes Engine
mountOptions:
- read_ahead_kb=1024
Compute Engine
export MOUNT_POINT=/path/to/mount/point echo 1024 | sudo tee /sys/class/bdi/0:$(stat -c "%d" $MOUNT_POINT)/read_ahead_kb
其中:
MOUNT_POINT
:Cloud Storage FUSE 掛接點的路徑。
停用安全權杖服務,避免多餘的檢查
Google Kubernetes Engine 的 Cloud Storage FUSE CSI 驅動程式會進行存取權檢查,確保 Pod 可復原,避免使用者在 Bucket 和 GKE 服務帳戶之間錯誤設定工作負載身分繫結,這可能會大規模達到預設的 Security Token Service API 配額。如要停用這項功能,請設定永久磁碟區 CSI 驅動程式的 skipCSIBucketAccessCheck
磁碟區屬性。建議您確認 GKE 服務帳戶具有目標 Cloud Storage bucket 的存取權,以免 Pod 無法掛接。
此外,如果 Google Kubernetes Engine 叢集包含超過 6,000 個節點,則必須將 Security Token Service 配額調高至 6000
以上的預設值,否則大規模部署時可能會發生 429
錯誤。您必須透過配額與限制頁面提高 Security Token Service 配額。建議您將配額設為與掛接數量相同,舉例來說,如果叢集有 10,000 個掛接點,配額應增加至 10000
。
如要設定 skipCSIBucketAccessCheck
磁碟區屬性,請參閱下列範例設定:
volumeAttributes: - skipCSIBucketAccessCheck: "true"
其他效能注意事項
除了上述主要最佳化措施,還有其他因素會大幅影響 Cloud Storage FUSE 的整體效能。以下各節說明使用 Cloud Storage FUSE 時,建議考量的其他效能注意事項。
提高非 HNS 值區的重新命名限制
由於啟用階層命名空間的 bucket 具有不可分割的重新命名功能,且讀取和寫入的 QPS 較高,因此檢查點工作負載一律應使用這類 bucket。不過,如果您接受目錄重新命名並非不可分割,且耗時較長的風險,可以使用 rename-dir-limit
設定選項,在不使用階層式命名空間的情況下,透過值區執行檢查點作業,指定目錄重新命名作業在任何時間點涉及的檔案或作業數量上限。
建議將 rename-dir-limit
設定選項設為較高的值,以免檢查點作業失敗。由於 Cloud Storage FUSE 使用一般命名空間,且物件無法變更,因此重新命名目錄時,必須重新命名並刪除目錄中的所有個別檔案。您可以設定 rename-dir-limit
設定選項,控管重新命名作業影響的檔案數量。
請按照下列操作說明設定 rename-dir-limit
設定選項:
CLI 選項
gcsfuse --rename-dir-limit: 200000 \ BUCKET_NAME
其中:
BUCKET_NAME
是值區名稱。
設定檔
file-system: rename-dir-limit: 200000
Google Kubernetes Engine
mountOptions: - rename-dir-limit=200000
Compute Engine
gcsfuse --rename-dir-limit: 200000 \ BUCKET_NAME MOUNT_POINT
其中:
BUCKET_NAME
是值區名稱。MOUNT_POINT
是要掛接 bucket 的本機目錄。例如:/path/to/mount/point
。
核心清單快取
清單快取是目錄和檔案清單的快取,或 ls
,可加快清單作業的速度。與由 Cloud Storage FUSE 管理的統計資料和類型快取不同,清單快取會保留在核心的頁面快取中,並由核心根據可用記憶體進行控管。
啟用核心清單快取功能,對下列用途最有幫助:
工作負載會重複列出目錄:這項設定特別適合執行頻繁完整目錄列出的工作負載,例如 AI/機器學習訓練執行。這對服務和訓練工作負載都有好處。
唯讀掛接:建議使用唯讀掛接進行清單快取,以免發生一致性問題。
啟用核心清單快取時請務必謹慎,且只有在檔案系統確實為唯讀,且作業執行期間預期不會有目錄內容變更時,才應使用這項功能。這是因為使用這個旗標時,本機應用程式永遠不會看到更新,尤其是當 TTL 設為 -1
時。
舉例來說,「用戶端 1」列出 directoryA
,導致 directoryA
成為核心清單快取中的常駐項目。用戶端 2 會在 Cloud Storage 值區的 directoryA
下建立 fileB
。用戶端 1 會持續檢查 directoryA
中的 fileB
,這基本上是檢查核心清單快取項目,絕不會透過網路進行。用戶端 1 不會看到目錄中有新檔案,因為檔案清單會持續從本機核心清單快取提供。用戶端 1 隨後逾時,導致程式中斷。
請按照下列指示啟用清單快取:
CLI 選項
gcsfuse --kernel-list-cache-ttl-secs: -1 \ BUCKET_NAME
其中:
BUCKET_NAME
是值區名稱。
設定檔
file-system: kernel-list-cache-ttl-secs: -1
Google Kubernetes Engine
mountOptions: - file-system:kernel-list-cache-ttl-secs:-1
Compute Engine
gcsfuse --kernel-list-cache-ttl-secs: -1 \ BUCKET_NAME MOUNT_POINT
其中:
BUCKET_NAME
是值區名稱。MOUNT_POINT
是要掛接 bucket 的本機目錄。例如:/path/to/mount/point
。
使用 file-system:kernel-list-cache-ttl-secs
掛接選項時,這些值代表的意義如下:
正值代表存留時間 (以秒為單位),用於將目錄清單回應保留在核心的頁面快取中。
如果值為
-1
,系統會略過項目到期時間,並在快取可用時傳回清單回應。
搭配使用 JAX 持續性編譯 (JIT) 快取與 Cloud Storage FUSE
JAX 支援即時 (JIT) 快取,這是一種選用的持續性編譯快取,可儲存編譯的函式構件。使用這個快取時,您可以避免多餘的編譯步驟,大幅加快後續指令碼的執行速度。
如要啟用 JIT 快取,必須符合下列條件:
使用最新版 JAX:使用 JAX 0.5.1 以上版本,即可享有最新的快取功能和最佳化項目。
盡量擴大快取容量:為避免快取逐出導致效能降低,請考慮設定不限大小的快取,特別是想覆寫預設設定時。如要達成這個目標,請設定環境變數:
export JAX_COMPILATION_CACHE_MAX_SIZE=-1
確認檢查點 Pod YAML:針對 JAX JIT 快取掛接點使用檢查點設定。
後續步驟
使用範例 Google Kubernetes Engine YAML 檔案,設定調整最佳做法。
進一步瞭解 Cloud Storage FUSE 設定檔選項。
進一步瞭解 Cloud Storage FUSE CLI 選項。