在任何云上运行AI工作负载,存储在Hugging Face:SkyPilot的零出口存储
摘要
Hugging Face Storage现已成为SkyPilot的一级后端,允许用户将Hugging Face仓库和存储桶挂载到任何云上的任务中,无需支付出口费用,从而在多个提供商之间实现灵活的GPU计算。
查看缓存全文
缓存时间: 2026/07/07 22:41
在任何云上运行AI工作负载,在Hugging Face上存储:SkyPilot实现零出站存储
来源:https://huggingface.co/blog/skypilot-hf-storage
返回文章列表 (https://huggingface.co/blog)
Nikhil Jha 的头像 (https://huggingface.co/njha)
- Hugging Face Storage 现已成为 SkyPilot 的一等后端 (https://huggingface.co/blog/skypilot-hf-storage#hugging-face-storage-is-now-a-first-class-skypilot-backend)
- 零出站:存储不再决定你在哪里运行 (https://huggingface.co/blog/skypilot-hf-storage#no-egress-storage-stops-deciding-where-you-run)
- 快速基准测试 (https://huggingface.co/blog/skypilot-hf-storage#a-quick-benchmark)
- Xet 支持的存储:检查点和模型变体的去重 (https://huggingface.co/blog/skypilot-hf-storage#xet-backed-storage-dedup-for-checkpoints-and-model-variants)
- 快速入门 (https://huggingface.co/blog/skypilot-hf-storage#get-started)
- 共同构建:Hugging Face 和 SkyPilot (https://huggingface.co/blog/skypilot-hf-storage#built-together-hugging-face-and-skypilot)
- 资源 (https://huggingface.co/blog/skypilot-hf-storage#resources)
对大多数团队来说,模型和数据集都存放在某个云提供商某个区域的一个存储桶中。你能够获得的 GPU(无论是用于开发、训练还是推理)越来越多地出现在与数据不同的云上。一旦这两者分离,你就得支付跨云传输费用才能将你自己的数据读到你自己的 GPU 上。
Hugging Face 和 SkyPilot 联手将这两部分结合在一起:你的模型和数据集保留在 Hub 上,而 SkyPilot 在任何拥有 GPU 的集群上运行计算(开发、训练或推理)。只需一个 hf:// URL 和你已有的 HF_TOKEN,就能将 Hugging Face Bucket 或任何 Hub 仓库挂载到 SkyPilot 作业中,然后在你需要算力的地方启动它。Hugging Face 不收取出站流量费用,因此在任何云上,将你的数据读到那些 GPU 都是免费的。
以下是新特性:
- 在任何作业中使用你的 Hub 数据。
store: hf可将 Hugging Face Bucket(可读写)或任何 模型/数据集/Space 仓库(只读)挂载到 SkyPilot 任务中,只需一个hf://URL 和你已有的HF_TOKEN,通过MOUNT或COPY方式。 - 在任何云的任何 GPU 上运行。 SkyPilot (https://docs.skypilot.co/) 将任务计算调度到超过 20 个云、Kubernetes、Slurm 以及本地环境中,因此同一个运行可以使用你预留或按需的任何 GPU(无论来自哪个供应商)。
- 读取数据零出站费用。 Hugging Face Storage 不收取出站或 CDN 费用 (https://huggingface.co/pricing),因此无论 SkyPilot 将任务运行在何处,它都直接从同一个存储桶中读取你的模型和数据集,无需为每个云复制数据,也无需为拉取数据支付出站费用。
- Xet 支持的去重。 Bucket 基于 Xet (https://huggingface.co/docs/hub/xet/overview) 构建,因此增量检查点和模型变体仅存储和传输发生变化的块。
- 共同构建。 Hugging Face (https://huggingface.co/) 和 SkyPilot (https://docs.skypilot.co/) 共同推出了此功能,Hugging Face 团队上游了使
hf-mount能在非特权容器中正常工作的 FUSE 修复。
https://huggingface.co/blog/skypilot-hf-storage#hugging-face-storage-is-now-a-first-class-skypilot-backend Hugging Face Storage 现已成为 SkyPilot 的一等后端
SkyPilot 将 Hugging Face 模型、数据集和检查点挂载到在 CoreWeave、Nebius、GCP 及 20 多个其他平台上运行的预留 GPU 集群上的作业中,实现零出站读取。
(https://huggingface.co/blog/assets/skypilot-hf-storage/architecture.png)
SkyPilot 任务已经可以读取和写入云端对象存储(S3、GCS、Azure、R2 等),通过将它们挂载到本地路径来实现。Hugging Face Storage 现在以 store: hf 的形式加入了这个列表,通过 hf:// 方案访问:
file_mounts:
# Hugging Face Bucket,可读写,用于检查点、日志、处理过的数据。
/checkpoints:
source: hf://buckets/my-org/qwen-sft
store: hf
mode: MOUNT # 或 COPY
# 模型仓库,只读挂载。
/base-model:
source: hf://Qwen/Qwen3.5-4B
store: hf
mode: MOUNT
# 数据集仓库,固定到某个修订版本,只读。
/data:
source: hf://datasets/my-org/my-dataset@main
store: hf
mode: MOUNT
这一个 hf:// 方案覆盖了整个生命周期:从仓库中读取模型和数据集,在训练时将检查点写入 Bucket,将训练好的模型发布回仓库,并在推理服务器上拉取它以提供服务。大多数团队已经将模型和数据集保存在 Hub 上,因此无需迁移步骤,也无需创建新的存储账户。
MOUNT 使用 Hugging Face 的 hf-mount (https://github.com/huggingface/hf-mount) FUSE 后端,因此 Bucket 或仓库会作为本地路径出现在 SkyPilot 的其他 FUSE 挂载(gcsfuse、blobfuse2、rclone、goofys)旁边。数据获取发生在文件系统层:当你的代码发出 read() 时,驱动程序只从 Xet 后端拉取那些字节,因此只有你实际接触的数据会经过网络传输,并且 hf-mount 会保留一个磁盘缓存,使重复读取保持本地化。
这个磁盘缓存正是 SkyPilot 在其 MOUNT_CACHED (https://docs.skypilot.co/en/latest/reference/storage.html) 后端上的行为,而普通的 MOUNT 则会对每次读取都流式传输数据,不保留本地副本。对于 hf 存储,MOUNT 和 MOUNT_CACHED 的行为相同,因此两种模式都会保留缓存。
由于读取是惰性的,进程可以在整个文件下载完成之前就开始处理大文件,而不需要等待完整复制完成。这使得 GPU 几乎立即开始工作,在数据流式流入时进行训练,而不是在数据集或检查点复制过程中空闲等待(同时还在计费)。这在对第一个 epoch 时尤其有价值,此时还没有任何缓存。COPY 采用另一种方式,通过 huggingface_hub 预先下载,没有特殊要求。
身份验证使用你已经拥有的令牌。在环境中设置 HF_TOKEN,并通过 --secret HF_TOKEN (https://docs.skypilot.co/en/latest/running-jobs/environment-variables.html) 将其传递给任务;无论作业落在哪个云上,SkyPilot 都使用它进行挂载。一个令牌即可用于作业落在 AWS、GCP、Azure、Nebius、Lambda 或你自己的 Kubernetes 集群上,因此无需为不同云管理不同的存储桶密钥。
https://huggingface.co/blog/skypilot-hf-storage#no-egress-storage-stops-deciding-where-you-run 零出站:存储不再决定你在哪里运行
如今 GPU 容量很少来自单一来源。为了获得足够的 H100 和 H200,团队需要同时在多个供应商处持有预留和承诺容量(如超大规模云上的一个块,新形态云上的一个集群,或本地机架),并在有分配的任何地方运行。SkyPilot 正是为此而构建:一个作业规范,可调度到超过 20 个云、Kubernetes 和本地环境,落在哪个空闲的预留集群上。
对象存储一直是瓶颈。对象存储是区域性的且每个云独立,因此如果你需要为位于不同供应商数据中心的 GPU 或推理服务器提供数据,要么在每个供应商的存储桶中都保留一份数据副本,要么支付跨云传输费用。大多数云在数据离开其网络时会收取出站费用(例如 AWS 约为 $0.09/GB),有时甚至在同一个云的不同区域之间也会收费。将基础模型拉取到每个推理节点,或者从另一个云上的集群迭代数据集多个 epoch,都会在已经预留的 GPU 费用之上增加一笔可观的账单。团队最终不得不将每次运行限定在持有数据的那个供应商上,而让其他预留容量闲置。
Hugging Face Storage 在读取方面消除了这一成本。由于不收取出站或 CDN 费用 (https://huggingface.co/pricing),且存储价格为 $12-18/TB/月(相比之下 AWS S3 约为 $23/TB 加上出站费用),同一个存储桶可以从所有这些集群访问,无论 GPU 在哪里运行,读取都是免费的。写回操作仍然需要支付计算云的常规出站费用(与任何外部云存储相同),但对于大多数 AI 工作来说,读取占主导地位:数据集经过多个 epoch 的流式传输,或将模型权重拉取到每个新的训练或推理节点。因此,你不再需要将每次运行限定在持有数据副本的供应商上。
https://huggingface.co/blog/skypilot-hf-storage#a-quick-benchmark 快速基准测试
为了收集一些基准测试数据,我们运行了一个小型微调任务:使用 Qwen/Qwen3.5-4B (https://huggingface.co/Qwen/Qwen3.5-4B) 在 HuggingFaceH4/Multilingual-Thinking (https://huggingface.co/datasets/HuggingFaceH4/Multilingual-Thinking) 数据集上,通过 TRL 的 SFTTrainer (https://huggingface.co/docs/trl/sft_trainer) 进行训练,将模型从其 Hub 仓库只读挂载,并将每个检查点写入 Hugging Face Bucket。同一个 SkyPilot YAML 在 AWS、GCP 和 Lambda 上运行,只需更改 --infra。SkyPilot 将每个作业放置在 GPU 空闲的地方,所有三个任务都读取和写入同一个 Bucket。
# qwen-sft.yaml。在任何地方启动: sky launch qwen-sft.yaml --infra aws|gcp|...
resources:
accelerators: H100:1 # 或该云可用的任何GPU
file_mounts:
/base-model:
source: hf://Qwen/Qwen3.5-4B # 只读,从Hub懒加载
store: hf
mode: MOUNT
/checkpoints:
source: hf://buckets/my-org/qwen-sft # 可读写的Bucket
store: hf
mode: MOUNT
run: |
python train.py --model /base-model --output_dir /checkpoints
我们测量的结果:
- 模型在每个云上加载都是免费的。 懒加载只拉取
from_pretrained实际访问的数据,因此大约 30 秒后即可开始训练(速度高达 500 MB/s)。由于 Hugging Face 不收取出站费用,这次拉取成本为零;如果模型驻留在 S3 上,那么每次从另一个云上的 GPU 读取都会被收取出站费用(AWS 上 $0.09/GB)。 - 检查点直接流式传输到 Bucket,速度高达约 170 MB/s(每个权重文件 8.43 GB),并在 GPU 实例终止后仍然保留。不同云上检查点写入 Bucket 的速度为:
| 云 | GPU | 检查点写入速度 |
|---|---|---|
| AWS (us-east-2) | L40S | ~168 MB/s |
| GCP (us-central1) | L4 | ~123 MB/s |
| Lambda (us-west-3) | H100 | ~112 MB/s |
https://huggingface.co/blog/skypilot-hf-storage#xet-backed-storage-dedup-for-checkpoints-and-model-variants Xet 支持的存储:检查点和模型变体的去重
Hugging Face Bucket 基于 Xet (https://huggingface.co/docs/hub/xet/overview) 构建,它使用内容定义的块拆分 (https://huggingface.co/docs/hub/xet/deduplication) 将文件分割成约 64 KB 的块,并只存储每个唯一块一次。由于边界随内容变化,一次编辑只会修改它触及的块,而其余块会被识别为已存储。这在几个场景中特别有用:
- 增量检查点和适配器检查点。 当你冻结层、训练适配器,或在不同保存之间大部分权重保持不变时,只有发生变化的块会上传,而不是整个检查点。
- 共享基础模型的变体。 基于同一基础模型的微调和量化版本高度重叠,因此共享块会在所有版本间只存储一次。
- 追加数据的数据集。 像对话轨迹或推理输出这样的日志会通过向大型 Parquet 文件追加行而增长。现有的行组保持字节完全相同,因此只有新行会被传输:在 Hugging Face 的测试 (https://huggingface.co/blog/parquet-cdc) 中,向一个包含 100K 行的表中追加 10K 行只传输了约 10 MB,而不是完整的约 106 MB。(如果你在原地编辑或删除行,请使用
use_content_defined_chunking=True写入,以保持更改局部化。) - 重新上传跳过已存储的内容。 在我们的测试中,重新上传一个已经在 Bucket 中的 8.43 GB blob 大约需要 8 秒,而首次上传需要 24 秒,因为只有块哈希值在移动。同样的机制使得服务器端
hf buckets cp能够在仓库和 Bucket 之间通过引用复制,而不是重新上传字节。
你能节省多少取决于工件之间的重叠程度,但去重是自动的:你像往常一样写入检查点,只有新块会离开机器。
https://huggingface.co/blog/skypilot-hf-storage#get-started 快速入门
pip install "skypilot[huggingface]"
hf auth login
# 或: export HF_TOKEN=
在任何 SkyPilot 任务中添加 hf:// 挂载并启动。MOUNT 需要一个基础镜像,要求 glibc 2.34+ 和 /dev/fuse。
https://huggingface.co/blog/skypilot-hf-storage#built-together-hugging-face-and-skypilot 共同构建:Hugging Face 和 SkyPilot
最初的 store: hf 支持由 Nikhil Jha 作为贡献 (https://github.com/skypilot-org/skypilot/pull/9418) 开始。Hugging Face 团队将其推进 (https://github.com/skypilot-org/skypilot/pull/9698),并上游了使 hf-mount FUSE 能在非特权容器(许多 Kubernetes 集群的默认设置)中挂载的修复。SkyPilot 团队将其集成到存储后端。整个路径都是开源的:SkyPilot、Hugging Face 的 hf-mount 以及 huggingface_hub 客户端。
https://huggingface.co/blog/skypilot-hf-storage#resources 资源
- SkyPilot 存储文档 (https://docs.skypilot.co/en/latest/reference/storage.html)
- Hugging Face Storage Buckets 指南 (https://huggingface.co/docs/hub/storage-buckets)
hf-mount(https://github.com/huggingface/hf-mount)- Xet:内容定义的块拆分与去重 (https://huggingface.co/docs/hub/xet/deduplication)
- SkyPilot Slack 社区 (https://slack.skypilot.co/)
相似文章
@ClementDelangue: AI团队不应被迫在昂贵的对象存储和痛苦的Git工作流之间做出选择。@huggingface Storage 是 b…
Hugging Face推出Storage Buckets,这是一个专为AI团队构建的存储解决方案,提供按TB计费、内置CDN以及针对模型权重、数据集和检查点的Xet去重功能。
使用云托管GPU运行AI
关于使用云托管GPU运行AI模型的文章,涵盖部署选项和注意事项。
Hugging Face Hub 推出 Storage Buckets
Hugging Face 推出 Storage Buckets,这是 Hub 上全新的可变性类 S3 对象存储功能,通过其 Xet 后端实现高效去重,专为生产级 ML 工作流优化。
Foundry 托管计算上的 Hugging Face 模型
微软宣布了 Foundry 托管计算以及 Foundry 上的 Hugging Face 模型,这是一个来自 Hugging Face 的精选开放权重模型目录,可通过一键部署到微软的托管 GPU 平台上,提供企业级安全性、治理和可观测性。
将你的 GitHub CI 迁移至 Hugging Face Jobs
本文提供了一份逐步指南,教你如何将 GitHub Actions CI 迁移到 Hugging Face Jobs 上运行,从而为类似 Trackio 的项目启用基于 GPU 的测试套件,并将 CPU CI 时间缩短 30%。