用 SkyPilot 跑多云 AI 任务,把数据零出口留在 Hugging Face

2026-07-07 42 预计阅读时间: 1 分钟
来源: huggingface.co AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:7 分钟

AI 训练和批量推理越来越像一门调度生意:GPU 在哪便宜、哪有空,就把任务跑到哪。但数据搬来搬去很快会变成账单黑洞。这个主题的关键变化是:用 SkyPilot 在任意云上运行 AI workload,同时把存储放在 Hugging Face,通过“zero-egress storage”的思路减少跨云数据出口成本和数据复制负担。

问题不只是 GPU,还是数据出口

很多团队做多云 AI 调度时,第一眼只看 GPU 单价:A100、H100、L4 哪家便宜,哪个区域库存充足。但真正上线后,账单里经常冒出来另一类费用:对象存储出口、跨区域传输、重复缓存、临时训练集复制。

SkyPilot 的角色是把计算调度抽象出来:你描述任务、资源、启动命令,它负责在云上找合适的资源执行。Hugging Face 的角色则更像数据和模型的中心仓库:数据集、模型权重、检查点可以通过统一接口获取。

“zero-egress storage”在这里的价值不在于魔法般消除所有网络成本,而是改变数据布局:把 AI workload 的可复用数据放在 Hugging Face 上,让不同云上的计算任务围绕同一个存储入口工作,避免每换一个云就把大数据集重新搬进该云的私有桶里。

SkyPilot 适合放在调度层,而不是业务代码里

一个常见误区是把云厂商选择写进训练脚本:如果是 AWS 就读 S3,如果是 GCP 就读 GCS,如果是 Azure 就读 Blob。这样短期能跑,长期会把业务代码和基础设施绑死。

更清晰的切法是:

  • 训练脚本只关心 Hugging Face dataset/model 的名字。
  • SkyPilot YAML 描述需要什么资源、环境变量和启动命令。
  • 云选择由 SkyPilot 和你的资源策略处理。

这样做的结果是,同一份训练代码可以在不同云之间移动。你需要调整的是任务配置,而不是把数据读取路径写成一堆云厂商分支。

可以这样实践:一个最小 SkyPilot 任务

下面是一个可改造的最小示例。假设你已经安装并配置了 SkyPilot,并且本机能访问目标云账号。示例使用 Hugging Face 上的数据集名称作为输入,实际运行前请把 HF_DATASET 改成你自己的数据集。

创建 skypilot-hf-train.yaml

name: hf-zero-egress-demo

resources:
  accelerators: L4:1
  cloud: aws  # 可以改成 gcp、azure,或移除后让 SkyPilot 按资源可用性选择

workdir: .

setup: |
  pip install -U datasets transformers accelerate torch

run: |
  export HF_DATASET="imdb"
  python train_or_infer.py --dataset "$HF_DATASET"

再创建一个可运行的 Python 脚本 train_or_infer.py。它不写死任何云存储路径,只从 Hugging Face 读取数据集:

import argparse
from datasets import load_dataset


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--dataset", required=True)
    args = parser.parse_args()

    ds = load_dataset(args.dataset, split="train[:100]")
    print(f"Loaded {len(ds)} rows from Hugging Face dataset: {args.dataset}")
    print(ds[0])


if __name__ == "__main__":
    main()

运行任务:

sky launch -c hf-demo skypilot-hf-train.yaml

查看任务日志:

sky logs hf-demo

任务结束后,如果只是实验,可以释放集群:

sky down hf-demo

这个例子的重点不是模型精度,而是边界划分:计算资源由 SkyPilot 管,数据入口由 Hugging Face 管,训练脚本保持可迁移。

私有数据和令牌要提前设计

如果数据集或模型是私有的,就不能只靠公开名称访问。可以通过环境变量传入 Hugging Face token。下面的写法适合改造到 CI/CD 或内部任务平台中,避免把 token 写进 YAML 文件。

export HF_TOKEN="hf_xxx_change_me"
sky launch -c hf-private skypilot-hf-train.yaml --env HF_TOKEN

Python 侧可以保持简单,datasetshuggingface_hub 通常会读取环境中的认证信息。对生产任务,还应注意几件事:

  • 不要把 HF_TOKEN 提交到 Git。
  • 给 token 最小权限,只开放需要读取的数据集或模型。
  • 对大规模训练任务,观察首次读取数据时的吞吐和缓存行为。
  • 在多云之间切换时,记录同一任务的总成本,而不只看 GPU 小时价格。

什么时候值得采用

这套方式适合 GPU 供给紧张、经常跨云找资源、数据集或模型已经托管在 Hugging Face 的团队。它把“算在哪里”和“数据放哪里”拆开,让实验、批量推理和训练任务更容易迁移。

但边界也要讲清楚:如果你的数据因为合规要求必须留在特定云或特定区域,不能简单搬到 Hugging Face;如果任务依赖超低延迟的本地对象存储,也需要实际压测;如果数据量巨大,首次读取、缓存策略和并发下载限制都要进入成本模型。

采用前可以用这张小清单判断:

  • 训练脚本是否已经摆脱云厂商专用路径?
  • 数据集、模型、检查点是否适合放到 Hugging Face?
  • SkyPilot 配置是否能在至少两个云上复用?
  • token、权限、日志中是否没有泄露敏感信息?
  • 成本评估是否包含 GPU、存储、网络、缓存和失败重试?

把这些问题答清楚,SkyPilot 加 Hugging Face 的组合就不只是“多云能跑”,而是让 AI workload 的迁移成本和数据出口成本都变得可控。


相关推荐