← 返回信息流
技术博客Hugging Face Blog·20 小时前

Run AI workloads on any cloud, store on Hugging Face: zero-egress storage with SkyPilot

AI 深度解读

背景

随着AI工作负载对GPU需求的爆发式增长,团队不再只依赖单一云厂商。为了获取足够的H100/H200等稀缺GPU,团队往往需要在多个云厂商(如AWS、GCP、Azure)、neocloud(如Lambda、Nebius)、自有Kubernetes集群甚至本地机上同时预留或按需购买容量,再根据实际可用资源弹性调度训练和推理任务。然而,存储层成了这一灵活性的瓶颈:传统的对象存储(如AWS S3、GCS)是区域性的且绑定云厂商,GPU集群若运行在另一个云上,读取数据就需要支付高昂的出站(egress)费用(例如AWS出站约$0.09/GB),且跨区域传输也有费用。为了规避这笔成本,团队往往被迫将任务锁定在数据所在的云上,导致其他云上的预留GPU闲置。

Hugging Face Hub早已成为AI社区存储模型和数据集的主要平台,但过去它主要作为静态托管使用,计算任务仍需将数据下载到本地。现在,Hugging Face与SkyPilot合作,将这两部分无缝连接:数据留在Hub上,计算通过SkyPilot调度到任何有GPU的集群上,且读取数据时免收出站费用。

核心内容

Hugging Face Storage(Hugging Face存储)现已成为SkyPilot的一等公民后端。通过新增的store: hf挂载方式,用户可以在SkyPilot任务中直接用hf://URL挂载Hugging Face上的存储桶(Bucket,可读写)或任意模型、数据集、Space仓库(只读)。挂载点可设置为MOUNT(懒加载)或COPY(提前下载)。整个流程只需一个HF_TOKEN环境变量,在任意云上使用同一个令牌即可认证,无需管理多个云厂商的存储桶密钥。

具体用法如下(SkyPilot YAML配置):

file_mounts:
  # 一个Hugging Face Bucket,可读写,用于存储checkpoints、日志、处理后数据
  /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://URL即可覆盖整个生命周期:从仓库读取模型和数据集,训练过程中将checkpoints写入Bucket,训练完成后将最终模型发布回仓库,推理时再拉取模型。大多数团队已经将模型和数据集放在Hub上,因此无需迁移,也无需创建新的存储账号。

MOUNT模式使用Hugging Face的hf-mount FUSE后端,存储桶或仓库会像本地路径一样出现在SkyPilot的其他FUSE挂载旁边。当代码发出read()系统调用时,FUSE驱动只从Xet后端拉取实际读取的字节,因此只有实际触及的数据才会通过网络传输。hf-mount还会维护一个本地磁盘缓存,重复读取直接命中缓存。对于hf存储,MOUNTMOUNT_CACHED行为一致,都会保留缓存。因为读取是懒加载的,进程可以在整个文件下载完成前就开始处理,大大减少等待时间,让GPU几乎立即开始工作,尤其在第一个epoch(没有缓存时)优势最明显。

COPY模式则通过huggingface_hub库提前下载全部文件,无需特殊要求。

零出站费用是核心优势。Hugging Face Storage对读取数据不收取任何出站费或CDN费,存储价格为$12-18/TB/月(对比AWS S3约$23/TB/月 + 出站费)。因此,无论SkyPilot将任务调度到哪个云上的GPU集群,从同一个Bucket读取数据都是免费的。写回数据仍需支付计算云的标准出站费用(与任何外部存储一样),但AI工作负载中读取占主导(数据集多轮迭代、模型权重拉取到新节点),因此团队不再需要将任务锁定在数据所在的云上。

Xet驱动的去重存储。Hugging Face Buckets构建在Xet之上,使用内容定义的分块(content-defined chunking)将文件切分为约64KB的块,每个唯一块只存储一次。由于块边界由内容决定,编辑只改变受影响的块,其余块被识别为已存储。这带来的好处包括:

  • 增量/适配器checkpoint:保存时只上传发生变化的块,而非整个checkpoint。
  • 共享基座的模型变体:同一基座的不同微调/量化版本共享大量块,重复块只存一份。
  • 数据集版本管理:类似机制。

快速基准测试。文章使用Qwen/Qwen3.5-4B模型和HuggingFaceH4/Multilingual-Thinking数据集,在TRL的SFTTrainer上进行微调,将模型从Hub只读挂载,checkpoint写入Hugging Face Bucket。同一份SkyPilot YAML文件分别运行在AWS、GCP、Lambda上,仅改变--infra参数,SkyPilot自动调度到有空闲GPU的云上,所有云读写同一个Bucket。测试结果:

  • 模型加载:懒加载只拉取from_pretrained实际触及的字节,约30秒内完成(峰值速度达500 MB/s),且免出站费。如果模型存放在S3,每次从其他云读取都会产生$0.09/GB的出站费。
  • Checkpoint写入:直接流式写入Bucket,速度约170 MB/s(每个checkpoint 8.43 GB),写入后数据持久存在,不受GPU实例生命周期影响。各云写入速度:
    • AWS: ~170 MB/s
    • GCP: ~160 MB/s
    • Lambda: ~150 MB/s

关键要点

  • 零出站读取:Hugging Face Storage对读取数据不收取任何出站费或CDN费,无论GPU运行在哪个云上,读取同一Bucket都免费。存储成本$12-18/TB/月,远低于AWS S3($23/TB/月 + 出站费)。
  • 统一挂载语法:通过store: hfhf://URL,可在SkyPilot任务中挂载Hugging Face存储桶(读写)
查看原文 →huggingface.co