在任何云上运行AI工作负载,存储在Hugging Face:SkyPilot的零出口存储

Hugging Face Blog 工具

摘要

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,通过 MOUNTCOPY 方式。
  • 在任何云的任何 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 挂载(gcsfuseblobfuse2rclonegoofys)旁边。数据获取发生在文件系统层:当你的代码发出 read() 时,驱动程序只从 Xet 后端拉取那些字节,因此只有你实际接触的数据会经过网络传输,并且 hf-mount 会保留一个磁盘缓存,使重复读取保持本地化。

这个磁盘缓存正是 SkyPilot 在其 MOUNT_CACHED (https://docs.skypilot.co/en/latest/reference/storage.html) 后端上的行为,而普通的 MOUNT 则会对每次读取都流式传输数据,不保留本地副本。对于 hf 存储,MOUNTMOUNT_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/)

相似文章

Hugging Face Storage Buckets(网站)

TLDR AI

Hugging Face 推出 Storage Buckets,这是一项面向 AI 团队的可扩展对象存储服务,采用按 TB 计费、Xet 去重、内置 CDN,且无 git 开销,专为数据集、模型检查点和 ML 工件设计。

使用云托管GPU运行AI

Reddit r/openclaw

关于使用云托管GPU运行AI模型的文章,涵盖部署选项和注意事项。