在任何云上运行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/)
相似文章
@julien_c: “你的数据托管在 Hugging Face 上。你的计算运行在 Vast GPU 上。”我太喜欢了!!
vast.ai 现在支持将 Hugging Face Storage Buckets 作为云连接,允许租用的 GPU 实例直接从 HF 存储桶拉取数据集和检查点,并将结果推送回去,无需手动传输。
@RituWithAI: 有人打造了一款工具,能自动找到全球最便宜的GPU来运行你的AI工作负载,并直接在那里执行。AWS…
SkyPilot是一个开源工具,可自动在18个云提供商中寻找并配置最便宜的GPU用于AI工作负载,通过竞价实例和自动管理将成本降低高达10倍。
@ClementDelangue: AI团队不应被迫在昂贵的对象存储和痛苦的Git工作流之间做出选择。@huggingface Storage 是 b…
Hugging Face推出Storage Buckets,这是一个专为AI团队构建的存储解决方案,提供按TB计费、内置CDN以及针对模型权重、数据集和检查点的Xet去重功能。
Hugging Face Storage Buckets(网站)
Hugging Face 推出 Storage Buckets,这是一项面向 AI 团队的可扩展对象存储服务,采用按 TB 计费、Xet 去重、内置 CDN,且无 git 开销,专为数据集、模型检查点和 ML 工件设计。
使用云托管GPU运行AI
关于使用云托管GPU运行AI模型的文章,涵盖部署选项和注意事项。