對於大多數團隊而言,模型和資料集通常儲存在某個雲端服務的特定區域中。然而,無論是開發、訓練還是服務,您能取得的 GPU 越來越常位於與資料不同的雲端。一旦資料與運算資源分離,您就必須支付跨雲傳輸費用,才能將自己的資料讀取到自己的 GPU 上。

Hugging Face 與我們(SkyPilot)攜手合作,將這兩部分結合起來:您的模型和資料集將保留在 Hugging Face Hub 上,而 SkyPilot 則負責在任何擁有 GPU 的叢集上執行運算(開發、訓練或服務)。您只需使用一個 hf:// URL 和現有的 HF_TOKEN,即可將 Hugging Face Bucket 或任何 Hub 儲存庫掛載到 SkyPilot 任務中,然後在任何有可用資源的地方啟動它。

Hugging Face 不收取任何出站流量費,因此在任何雲端上將資料讀取到這些 GPU 上都是免費的。

以下是新功能:您的 Hub 資料可在任何任務中使用。store: hf 透過 MOUNT 或 COPY 模式,使用單一 hf:// URL 和您現有的 HF_TOKEN,將 Hugging Face Bucket(可讀寫)或任何模型/資料集/Space 儲存庫(唯讀)掛載到 SkyPilot 任務中。

在任何雲端的任何 GPU 上執行。SkyPilot 可以在超過 20 個雲端、Kubernetes、Slurm 和地端環境中找到任務所需的運算資源,因此相同的執行作業可以使用您預留或隨選的任何可用 GPU,無論是哪個供應商。

讀取資料無需支付出站流量費。Hugging Face Storage 不收取任何出站流量或 CDN 費用,因此無論 SkyPilot 將任務部署到何處,它都可以直接從同一個儲存桶讀取您的模型和資料集,無需在每個雲端建立副本,也無需支付任何資料拉取費用。

Xet 支援的重複資料刪除。Hugging Face Buckets 基於 Xet 技術構建,因此增量檢查點和模型變體只會儲存和傳輸變更過的資料區塊。

共同開發。Hugging Face 和 SkyPilot 共同發布了這項功能,Hugging Face 團隊也將 hf-mount FUSE 的修復程式上游到開源社群,使其能在非特權容器中運作。

SkyPilot 任務已經可以透過將雲端物件儲存(如 S3、GCS、Azure、R2 等)掛載到本地路徑來讀寫資料。現在,Hugging Face Storage 也加入了這個行列,作為 store: hf,可透過 hf:// 協定存取。

這個 hf:// 協定涵蓋了整個生命週期:從儲存庫讀取模型和資料集,在訓練期間將檢查點寫入 Bucket,將完成的模型發布回儲存庫,並在服務時將其拉取到推論伺服器上。大多數團隊已經將模型和資料集保存在 Hub 上,因此無需額外的遷移步驟或建立新的儲存帳戶。

MOUNT 模式使用 Hugging Face 的 hf-mount FUSE 後端,因此儲存桶或儲存庫會像 SkyPilot 的其他 FUSE 掛載點(gcsfuse、blobfuse2、rclone、goofys)一樣,顯示為本地路徑。

資料擷取發生在檔案系統層:當您的程式發出 read() 指令時,驅動程式只會從 Xet 後端拉取所需的位元組,因此只有您實際存取的資料會透過網路傳輸。hf-mount 會保留一個磁碟快取,以便重複讀取時直接從本地存取。這種磁碟快取行為與 SkyPilot 在 MOUNT_CACHED 模式下為其他後端提供的功能相同,而普通的 MOUNT 模式則會從儲存桶串流讀取每個資料,不在本地保留任何內容。

對於 hf 儲存,MOUNT 和 MOUNT_CACHED 的行為相同,兩種模式都會保留快取。

由於讀取是惰性的,程式可以在整個檔案下載完成之前就開始處理大型檔案,而不是先等待完整複製。這使得 GPU 幾乎可以立即投入運作,在資料串流傳入時進行訓練,而不是在資料集或檢查點複製期間閒置(並產生費用)。這在第一個訓練週期中效益最大,因為此時尚未有任何快取。COPY 模式則採用另一種方式,透過 huggingface_hub 預先下載所有資料,沒有特殊要求。

驗證方式就是您已擁有的 token。在您的環境中設定 HF_TOKEN,並透過 --secret HF_TOKEN 將其傳遞給執行作業;SkyPilot 會在任務部署到任何雲端時使用它進行掛載。一個 token 即可適用於 AWS、GCP、Azure、Nebius、Lambda 或您自己的 Kubernetes 叢集,因此無需管理每個雲端不同的儲存桶金鑰。

如今,GPU 容量很少只來自單一來源。為了獲得足夠的 H100 和 H200,團隊會同時在多個供應商(例如超大規模雲端供應商的區塊、新興雲端的叢集,或地端機架)預留和承諾容量,並在有分配資源的地方執行。SkyPilot 正是為此而生:一個任務規格,可在超過 20 個雲端、Kubernetes 和地端環境中排程,並部署到任何可用的預留叢集上。

物件儲存一直是個難題。物件儲存是區域性且依雲端而異的,因此要為位於不同供應商資料中心的 GPU 或推論伺服器提供資料,意味著您必須在每個供應商的儲存桶中保留一份資料副本,或者支付跨雲傳輸費用。大多數雲端服務在資料離開其網路時都會收取傳輸費(例如從 AWS 傳出約 $0.09/GB),甚至在同一雲端內部不同區域之間也會收費。

將基礎模型拉取到每個推論節點,或從另一個雲端的叢集迭代資料集數個訓練週期,都會在您已預留的 GPU 費用之外,額外增加一筆可觀的帳單。這導致團隊最終將每個執行作業綁定到持有資料的供應商,而讓其餘容量閒置。

Hugging Face Storage 消除了最令人頭痛的成本:讀取端。由於不收取任何出站流量或 CDN 費用,且儲存費用為每月 $12-18/TB(相較於 AWS S3 大約每月 $23/TB 加上出站流量費),同一個儲存桶可以從所有這些叢集存取,無論 GPU 在何處執行,讀取資料都是免費的。

寫回資料仍然會產生您運算雲端供應商的標準出站流量費,這與寫入任何非雲端儲存相同。然而,對於大多數 AI 工作而言,讀取操作佔主導地位:例如資料集在多個訓練週期中串流,或模型權重被拉取到每個新的訓練或推論節點。因此,您不再需要將每個執行作業綁定到持有資料副本的供應商。

為了收集一些基準測試數據,我們執行了一個小型微調任務:使用 TRL 的 SFTTrainer,在 HuggingFaceH4/Multilingual-Thinking 資料集上微調 Qwen/Qwen3.5-4B 模型。我們將模型從其 Hub 儲存庫唯讀掛載,並將每個檢查點寫入 Hugging Face Bucket。

相同的 SkyPilot YAML 設定檔在 AWS、GCP 和 Lambda 上執行,僅更改了 --infra 參數。SkyPilot 將每個任務部署到有可用 GPU 的地方,所有三個任務都讀寫同一個儲存桶。

我們測量了以下結果:模型在每個雲端上都免費載入。惰性讀取只會拉取 from_pretrained 函式存取的內容,因此模型在大約 30 秒內即可準備好訓練(最高可達 500 MB/s)。由於 Hugging Face 不收取傳輸費,這次拉取沒有任何成本;如果模型儲存在 S3 中,每次讀取到另一個雲端上的 GPU 都會產生傳輸費(AWS 上為 $0.09/GB)。

檢查點直接串流到儲存桶,速度最高約為 170 MB/s(每個檢查點包含 8.43 GB 的權重),並且在 GPU 實例結束後仍然保留。

每個雲端將檢查點寫入儲存桶的速度如下表所示。

Xet 支援的儲存:檢查點和模型變體的重複資料刪除。Hugging Face Buckets 基於 Xet 技術構建,該技術使用內容定義分塊(content-defined chunking)將檔案分割成約 64 KB 的區塊,並只儲存每個唯一的區塊一次。由於區塊邊界是根據內容定義的,因此編輯只會改變受影響的區塊,其餘部分則會被識別為已儲存。這在以下幾個方面帶來了效益:

增量和適配器檢查點。當您凍結層、訓練適配器,或在儲存之間大部分權重保持不變時,只會上傳變更過的區塊,而不是整個檢查點。

共享基礎的模型變體。一個基礎模型的微調和量化版本會高度重疊,因此共享的區塊只會儲存一次。

您追加的資料集。對話紀錄或推論輸出等日誌會透過向大型 Parquet 檔案追加行來增長。現有的行組保持位元組級別的相同,因此只會傳輸新行:在 Hugging Face 的測試中,向一個 10 萬行的表格追加 1 萬行,只傳輸了大約 10 MB,而不是完整的約 106 MB。(如果您原地編輯或刪除行,請使用 use_content_defined_chunking=True 寫入以保持變更在本地。)

重新上傳會跳過已儲存的內容。在我們的測試中,重新上傳一個已存在於儲存桶中的 8.43 GB 檔案大約需要 8 秒,而首次上傳則需要 24 秒,因為只傳輸了區塊的雜湊值。同樣的機制也允許伺服器端的 hf buckets 在儲存庫和儲存桶之間進行 cp 操作時,以參考方式複製而不是重新上傳位元組。

您能節省多少取決於您的資料重疊程度,但重複資料刪除是自動進行的:您像往常一樣寫入檢查點,只有新的區塊會離開機器。

開始使用:首先執行 pip install "skypilot[huggingface]",然後 hf auth login 或設定環境變數 export HF_TOKEN=<your-token>。接著,將 hf:// 掛載點新增到任何 SkyPilot 任務中並啟動。請注意,MOUNT 模式需要基礎映像檔包含 glibc 2.34+ 和 /dev/fuse。

共同開發:Hugging Face 和 SkyPilot。最初的 store: hf 支援是 Nikhil Jha 的貢獻。Hugging Face 團隊接手並將 hf-mount FUSE 的修復程式上游,使其能夠在非特權容器中掛載,這在許多 Kubernetes 叢集中是預設設定。

SkyPilot 團隊則將其整合到儲存後端。整個開發路徑都是開源的,包括 SkyPilot、Hugging Face 的 hf-mount 和 huggingface_hub 客戶端。

相關資源包括 SkyPilot 儲存文件、Hugging Face Storage Buckets 指南、hf-mount 專案、Xet 的內容定義分塊和重複資料刪除技術,以及 SkyPilot 的 Slack 社群。