Run AI workloads on any cloud, store on Hugging Face: zero-egress storage with SkyPilot
Run AI workloads on any cloud, store on Hugging Face: zero-egress storage with SkyPilot
The moment those two come apart, you pay a cross-cloud transfer tax just to read your own data onto your own GPUs. Together with Hugging Face, we’ve joined the two halves: your models and datasets stay on the Hub, and SkyPilot runs the compute (dev, training, or serving) on whatever cluster has the GPUs. Mount a Hugging Face Bucket or any Hub repo into a SkyPilot job with one hf:// URL and the HF_TOKEN you already have, then launch it wherever capacity is. Hugging Face charges no egress, so reading your data onto those GPUs costs nothing, on any cloud. Hugging Face Storage is now a first-class SkyPilot backend SkyPilot tasks already read and write cloud object stores (S3, GCS, Azure, R2, and many more) by mounting them at a local path. Hugging Face Storage now joins that list as store: hf, reached through the hf:// scheme: file_mounts: # A Hugging Face Bucket, read-write, for checkpoints, logs, processed data. /checkpoints: /base-model: 5-4B store: hf mode: MOUNT # A dataset repo, pinned to a revision, read-only. /data: Most teams already keep their models and datasets on the Hub, so there is no migration step and no new storage account to create. MOUNT uses Hugging Face’s hf-mount FUSE backend, so a bucket or repo shows up as a local path next to SkyPilot’s other FUSE mounts (gcsfuse, blobfuse2, rclone, goofys). The fetching happens at the filesystem layer: when your code issues a read(), the driver pulls just those bytes from the Xet backend, so only the data you actually touch crosses the network, and hf-mount keeps an on-disk cache so repeat reads stay local. That on-disk cache is the behavior SkyPilot gives its other backends under MOUNT_CACHED, where a plain MOUNT instead streams every read from the bucket with nothing kept locally. For the hf store, MOUNT and MOUNT_CACHED behave the same, so either mode keeps the cache. Because reads are lazy, a process can start working through a large file before the whole file has downloaded, instead of blocking on a full copy first. That keeps the GPU busy almost immediately, training on data as it streams in rather than sitting idle (and billing) while a dataset or checkpoint copies down. It pays off most on the first epoch, when nothing is cached yet.