SkyPilot v0.13.0rc1: Sky Batch, Hugging Face Storage, Lifecycle Hooks, Cost Caps, Blackwell GPUs, and More
SkyPilot v0.13.0rc1 introduces Sky Batch for large-scale batch inference and data processing across worker pools, a native Hugging Face storage backend (hf://), a generalized lifecycle-hooks framework for running custom logic around cluster events, and the **sky debug-dump** command for one-shot troubleshooting. This release also adds per-instance cost caps, NVIDIA Blackwell / CUDA 13 images, and GKE Autopilot support.
Get it now with:
uv pip install "skypilot[all]==0.13.0rc1"Or, upgrade your team SkyPilot API server:
NAMESPACE=skypilot
RELEASE_NAME=skypilot
VERSION=0.13.0rc1
helm repo update skypilot
helm upgrade -n $NAMESPACE $RELEASE_NAME skypilot/skypilot \
--set apiService.image=berkeleyskypilot/skypilot:$VERSION \
--version $VERSION --devel --reuse-valuesDeprecations & Breaking Changes:
**api_accessrenamed toapi_server_access, now defaulting toTrue** (#9169). Tasks now automatically receive API server credentials. The legacyapi_accesskey is still accepted for backward compatibility.**sky.jobs.queue(version=1)remains deprecated** and continues to emit a warning; usesky.jobs.queue(version=2), which returns richer job metadata as dictionaries (#9118).- Removed
all_includes_in_clusterfrom the SkyPilot config schema (#9671).
Highlights
[New] Sky Batch
**sky batch** brings large-scale batch inference and data processing to SkyPilot with a simple Python API (#8850, #9438, #9456). Given a dataset and a processing function, Sky Batch splits the data into batches, distributes them across a pool of GPU/CPU workers, and collects the results, with no manual sharding, provisioning, or failure handling. Workers are reused across jobs, so expensive setup (installing packages, downloading weights, loading models onto GPUs) happens only once.
import sky
# Point at your input data in cloud storage
ds = sky.batch.Dataset(source='s3://my-bucket/prompts/')
# Map a processing function over the dataset across a worker pool
ds.map(my_inference_fn, pool='my-gpu-pool', output='s3://my-bucket/results/')Inputs and outputs can be read from and written to Amazon S3 (s3://) or Google Cloud Storage (gs://).
[New] Hugging Face Storage Backend
SkyPilot now supports Hugging Face as a first-class storage backend via the hf:// scheme (#9698, #9763). It wraps read-write Hugging Face Buckets (Xet-backed, S3-like object storage) and, through the same handle, read-only mounting of model, dataset, and space repos. Bucket lifecycle operations go through huggingface_hub, and MOUNT/MOUNT_CACHED modes use the FUSE-based hf-mount, consistent with SkyPilot's existing mount infrastructure.
file_mounts:
# Read-write Hugging Face Bucket
/data:
source: hf://buckets/my-org/my-bucket
# Read-only model / dataset / space repo
/model:
source: hf://meta-llama/Llama-3.1-8B
mode: MOUNTURL formats: hf://buckets/<ns>/<bucket> (bucket, read-write), hf://<ns>/<model>[@<rev>], hf://datasets/<ns>/<ds>, and hf://spaces/<ns>/<sp> (repos, read-only). Authentication reads HF_TOKEN from the environment or the Hugging Face CLI token file.
[New] Lifecycle Hooks Framework
The autostop hook introduced in v0.12 has grown into a generalized lifecycle-hooks framework via resources.hooks (#9064). Each hook declares a script and the events it fires on: autostop, preemption, and down. Use it to checkpoint state, sync experiment trackers, or send notifications around cluster lifecycle transitions.
resources:
hooks:
- run: |
wandb sync
curl -X POST $SLACK_WEBHOOK -d '{"text": "Cluster shutting down"}'
events: [autostop, down]
timeout: 300The legacy autostop.hook YAML continues to work with a deprecation warning.
[New] sky debug-dump: One-Shot Troubleshooting
The new **sky debug-dump** command collects diagnostic information (logs, state, and configuration) for clusters, requests, and managed jobs into a single zip for troubleshooting and bug reports (#8868, #9752, #9753). Dumps are stored under ~/.sky/debug_dumps/ and automatically cross-link related resources (e.g. a cluster and its associated requests) so you capture complete context in one command.
sky debug-dump --cluster my-clusterCost Caps: Max Hourly Cost
You can now set a per-instance hourly budget cap with resources.max_hourly_cost (#9132, #9170). Only instances at or below the limit are considered during optimization. When use_spot is set, the cap applies against spot prices; otherwise against on-demand prices.
resources:
accelerators: A100
max_hourly_cost: 10.0NVIDIA Blackwell & CUDA 13 Images
SkyPilot's default GPU image now ships NVIDIA driver 580 (open) + CUDA 13 for Blackwell support (#9639), with a legacy CUDA 12 image retained for pre-Turing GPUs and an arm64 build fix (#9789). RunPod adds RTX PRO Blackwell GPUs to its catalog (#9187).
GKE Autopilot Support
SkyPilot now detects GKE Autopilot clusters and trusts Node Auto-Provisioning (NAP) instead of walking existing node pools, so GPU requests provision correctly on Autopilot instead of being incorrectly rejected (#9565).
What's new: compared to v0.12.0
API Server
- RBAC viewer role for read-only dashboard/API access (#9681).
- Reconcile internal daemon rows on API server boot (#9668) and skip request env overlay for internal daemon requests (#9663).
- Bundle SSH credentials with the launch response (#9586).
- Refinements for graceful upgrade (#9317) and
MIN_COMPATIBLE_API_VERSIONbump for 0.12 clients (#9121). - Reap multiprocess Prometheus files from dead/exited workers (#9689, #9690) and periodic scrape-timeout tuning (#9480, #9434).
- Return 404 for missing dashboard
_next/assets instead of index.html (#9722); don't cache error responses on/dashboard/_nextpaths (#9498). - Fixed incorrect headers passed by oauth2-proxy (#9468) and oauth pod scheduling (#9288).
- Async engine improvements: hand asyncpg the libpq DSN via
async_creator(#9483),put_asyncfor the queue backend (#9346). - Workspace controls: name-length limits (#9162), workspace permission checks for
enabled_cloudsandsky check(#9284), cached permission checks (#9125). - Helm chart:
devModeflag for in-cluster iteration (#9609), persist the wholesky_logsdir (#9454), optional server log mirror (#9754), configurable probes (#9477), disable session affinity on ingress (#9347), option to disable serving the server log (#9140).
Kubernetes
- GKE Autopilot support via
autopilot.enableddetection and NAP trust (#9565). - Per-workspace namespaces via
context_configs(#9640). - Container operations for clusters on Kubernetes (#9066).
**ephemeral-storagerequests/limits** on pods (#9053),allowed_nodesconfig for node-level filtering (#9151), pod spread constraints (#9296).- Configurable APT mirrors (#9521, #9553) and timeouts on APT commands (#9375).
- Surface pod OOM and eviction reasons for jobs and clusters (#9758); better provisioning-failure reasons (#9389); fix misleading "Pulling image" status during init-container execution (#9702).
- Treat pods as scheduled on binding rather than container status (#9766); auto-increase provision timeout when an autoscaler is configured (#9322).
- Respect configured tolerations in node-health display (#9750).
- Allow
pod_configto overrideruntimeClassNamefor GPU pods (#9241); probe Ray ports whenhostNetwork: true(#9644). - Fail fast when a cluster has no default StorageClass (#9713); auto-clamp CPU/memory for capacity (#9179).
network_tier: bestfor OCI OKE RoCE (#9622); allow excluding the in-cluster context fromallowed_contexts: all(#9637).- Fixed GPU labeller crash preserving method metadata (#9152),
volumeMountspatch-merge key fromnametomountPath(#9358), write permissions for all volume mounts at startup (#9221), owner-identity check for scoped kubeconfig names (#9725, #9190). Updated default/base k8s images (#9618, #9590).
Volumes
- Volume auto-mounts on Kubernetes (#9205, #9353).
- New
k8s-hostpathvolume type for node-local cache (#9165). - Volume detail page with saved/shown volume YAML (#9101) and refreshed volume page styling (#9122).
- Infer
access_modefrom an existing PVC foruse_existingvolumes (#9359); check the existing backend when creating volumes (#9104); add volume mount check (#9343). - Show
Tiunits for volume sizes ≥ 1024Gi (#9369); don't rewrite region toin-clusterwhen in-cluster auth is unavailable (#9743).
Storage
- Hugging Face storage backend (
hf://) for buckets and repos (#9698, #9763). - Read-only support for
MOUNT(#9225). - Upload v2 improvements: narrowed locking (#9460), skip-assemble support (#9458), delayed extract (#9376), and upload chunk size capped to fit Cloudflare's 100MB limit (#9360).
- Upgraded goofys to 0.24.0 (#9222); mount-command cleanup for
S3CompatibleStore(#9080); fixed git "dubious ownership" during workdir sync (#9352).
Core & Backend
- Support specifying both a cloud VM image and a Docker image on the same resources (#9759).
- Deep-merge workspace config with global cloud config (#9788).
- Speed up log download and tailing for large jobs (#9464).
- Turn silent launch misconfigurations into explicit errors (#9423) with improved user-facing messages (#9403); detect file paths mistakenly used as cluster names (#9233).
- Fall back to SSH when the skylet gRPC endpoint is unreachable (#9287); cancel in-flight skylet gRPC calls on context cancel (#9620); bind gRPC to all interfaces (#9282).
- Bumped default cluster event retention to 30 days (#9462).
- Deterministic config hash (#9415), reproducible wheel builds (#9368), and excluding
__pycache__from the built wheel (#9413). - Allow relative
file_mountsdestinations again (#9537); fixed cluster re-provisioning and atomic SSH-key writes (#9476); prioritize user SSH keys over cluster keys inHost *config (#9099). - Fixed autostop ignoring active SSH after stop/start (#9539); close
/dev/fusefd after passing it to the client (#9463); fixed a flock leak in theuv_spawnchild process (#9431); fixed browser opening on WSL forsky api login(#9178). - Moved the catalog dir to
SKY_RUNTIME_DIRand removed import-time filesystem side effects (#9605); let packages expose client SDKs under theskynamespace (#9784). - Expanded plugin extension points and config sections for third-party extensibility (#9494, #9510, #9457, #9616).
Managed Jobs & Serve
**--tailforsky jobs logs** (#9449),preload_contentforsky.jobs.tail_logs(#9662), and awaithelper in the programmatic SDK (#9138).- Provisioning spinner and dashboard links during
sky jobs launch(#9761, #9135, #9191); optionally merge cluster launch-progress events into job events (#9804). - Custom job recovery strategy configuration (#9154); retry transient DB errors in the controller monitor loop (#9748); daemon to sweep expired managed-job API access tokens (#9588).
- Fixed git commit metadata not captured in managed jobs (#9184) and git workdir env vars not set for JobGroup / multi-task DAGs (#9251); fixed user-hash races in concurrent job-group launches (#9248).
- Serve:
ServiceStatusRunnerextension point (#9801), new user-configurable options (#9116), and improved max-services error messages (#8897). - Consolidation mode: use short workers (#9442) and skip the two-hop path (#9444).
Pools & Batch
- Sky Batch for distributed batch inference over worker pools (#8850, #9438, #9456).
- Prioritize idle workers for scale-down (#9098); speed up the pool dashboard with batched queries and indexes (#9636); fixed pool consolidation under deploy-mode auto-enable (#9342).
Infrastructure & Cloud Integrations
AWS
- Support for
aws login(2026 AWS CLI command) (#9526) and subnet selection (#9127). - Add tags to security groups for scoped IAM policies (#8981); fixed false MISMATCH error when
subnet_namesspan multiple AZs (#9791); added AZ-fetch timeouts to preventsky checkhangs (#9244, #9240).
GCP
- Select specific VPC subnets (#9334); set
provisioningModel=RESERVATION_BOUNDfor DENSE reservations (#9779); added missing required instance types to the catalog (#9472); pinned/bumped the gcloud SDK (#9587, #9535); sped upsky check(#9095).
Nebius
- Native security groups with
open_portsreplacing UFW (#9563); use managed disks to create instances (#9432); parallelize multi-node VM creation (#9570); customimage_id(#9133); fixed autodown (#9573).
Slurm
cpu_partitionconfig for CPU-only tasks (#9281) andgpu_partition_mapfor GRES without a GPU type (#9237).- Let users override
--timeand fall back toDefaultTimewhenMaxTimeis UNLIMITED (#9633); preserveSLURM_CONF*env vars when launchingsrun(#9425). - Fixed a proctrack barrier hang on multi-node container jobs (#9181), fractional memory truncation in
sbatch(#9174), numeric partition names treated as integers (#9168), and--memwhen memory is not consumable (#9171).
RunPod / Vast / PrimeIntellect
- RunPod: RTX PRO Blackwell GPUs in the GPU name map (#9187); pass formatted image name to
create_template(#9550). - Vast: fixed API compatibility with
vastai-sdkv6+ (#9314); made account-level SSH key registration best-effort (#9631). - PrimeIntellect: fixed
query_instancesTypeError on retry (#9259) and instance update after_get_instance_info(#9327).
SSH Node Pools
- Install Prometheus + node-exporter in
sky ssh up(#9402). - Auto-enable HA K3s for pools of 3+ nodes (#9351).
- Wait for async Ray setup on SSH node pools (#9299); support redirect in the WebSocket SSH proxy (#9167).
User Experience
Dashboard
- Batch-edit user roles and workspace
allowed_users(#9696); show counts above the users and service-account tables (#9655). - Admin-configurable external links (#9603) and detection of W&B Dedicated Cloud run URLs (#9383).
- Provision log in the cluster detail page (#9201, #9344).
- Managed Jobs filter polish: More dropdown, Active/All toggle, default to "Mine" (#9707), default sort by ID descending (#9522), and don't block the table on
/statuswhen the controller is up (#9645). - Unified filter-bar sizing and styling across list pages (#9407); improved performance for cluster detail and job pages (#9195); quieter upgrade banner (#9654).
- Fixed infinite-spinner states on root and detail pages (#9139, #9147), routing for catch-all pages opened in new tabs (#9137), and layout flashes on slow plugin loads (#9208).
CLI
**sky api login --no-browser** for headless environments, continuing to poll when a browser can't be opened (#9677, #9676).**sky debug-dump**troubleshooting command (#8868).- Display autostop in hours when minutes are divisible by 60 (#9453); JSON output for
cost-report(#9504).
Dependencies
- Bumped protobuf to 5.29.6 and black to 24.10.0 to close CVE alerts (#9541).
- Pinned
kubernetes < 36due to an RBAC regression, while acceptingdict[K, V]openapi_types forkubernetes >= 36(#9685, #9682). - Capped
azure-cli < 2.87.0(azure-mgmt-storage 25.0.0 breaks Azure storage) (#9774). - Dropped the
pyopensslupper limit (#8070); pinnedclick < 8.3.0in relevant runtime installs (#9459, #9763).
Documentation & Examples
- Sky Batch docs including custom formats (#9438);
MOUNT_CACHEDconfig documentation (#9130);api_server_accessdocumentation (#9115); refreshed managed jobs, quickstart, and agent-skills docs (#9564, #9250). - New examples: autonomous code optimization (#9182), parallel autoresearch (#9092, #9131), RL post-training with policy pushback (#9625), Cosmos3 fine-tuning and nano (#9809, #9790).
- "Copy page as Markdown" button for LLM-friendly content sharing (#9093); faster incremental docs builds (#9396); added Slurm to the CoreWeave installation guide (#9674); refreshed cloud logos (#9642, #9602).
Testing & CI/CD
- Nightly workflow: run once daily at 00:00 UTC and drop the preflight schedule (#9739); trigger a downstream workflow after PyPI publish (#9738).
- Fixed a race condition in the release workflow that caused untagged releases (#9227).
- Dropped Black in favor of yapf+isort for the IBM provider (#9557); numerous test reliability and flakiness fixes.
Contributors
Thank you to all contributors who made this release possible!
@aylei, @Michaelvll, @DanielZhangQD, @zpoint, @kevinmingtarja, @lloyd-brown, @concretevitamin, @cg505, @SeungjinYang, @rohansonecha, @kevinzwang, @kyuds, @romilbhardwaj, @alex000kim, @andylizf, @cblmemo, @hentt30, @williamsnell, @Jobarion, and many others.
Note: this is a draft. Use GitHub's "Generate release notes" on the tagged release to finalize the exact contributor @Handles and the "New Contributors" section.
Full Changelog
For a complete list of changes, see the commit history.