v0.14.0
skypilot-org/skypilotv0.14.0Oct 5, 2026by Michaelvll
Upgrading?
AI Summary
SkyPilot v0.14.0 introduces dynamic job groups, allowing running tasks to launch managed jobs that attach to the group, and multi-user Slurm support for per-user QoS and identity. It also adds AWS Trainium/Inferentia on Kubernetes, read-only visibility for private workspaces, and removes Conda from the default image.
Key Highlights
- Dynamic Job Groups: Tasks within a group can launch new managed jobs that attach to the group.
- Multi-User Slurm: Slurm clusters now run jobs under the authenticated user's identity with per-user QoS and account settings.
- AWS Neuron Support: Trainium and Inferentia accelerators are now supported on Kubernetes.
- Read-Only Workspaces: Private workspaces can now be viewed by non-members without modification rights.
- Conda-Free Default: Conda is no longer installed by default; users can opt-in via `provision.install_conda: true`.
Breaking Changes
- Conda is no longer installed by default; `provision.install_conda` defaults to `false`.
- Job Groups enforce in-group networking by default; tasks that cannot be co-located now fail at submission.
- Tighter API authorization: request listing, `sky debug-dump`, and download paths are now scoped to the calling user.
- `rbac.restrict_config_to_admins` now defaults to `true`, preventing non-admins from reading the API server config.
- Kubernetes: the `ephemeral_storage` field has been replaced with `disk_size`.
New Features
- Dynamic Job Groups with `inter_connection` knob for guaranteed networking.
- Multi-user Slurm support including `submit_as_user`, `username_map`, and `quota` configuration.
- AWS Trainium and Inferentia (Neuron) support on Kubernetes.
- Read-only visibility for private workspaces via `read_access: all`.
- GCP RTX PRO 6000 Blackwell (G4) and InfiniBand on Nebius B200/B300 support.
- SR-IOV RDMA support on Kubernetes via `kubernetes.rdma`.
- Run multiple isolated local API servers on one machine.
- Scoped auto-mounts for volumes (personal, workspace, global).
- Region-free cost estimates priced at the joint regional minimum.
- Reworked Dashboard with URL-filtered views and improved Infra page.
Full Release Notes
# SkyPilot v0.14.0: Dynamic Job Groups, Multi-User Slurm, AWS Neuron, Read-Only Workspaces, and More
SkyPilot v0.14.0 introduces **dynamic job groups**, letting a running job group launch more managed jobs that are tracked and cancelled with it, and makes **Slurm a multi-user backend**: jobs are submitted as the authenticated user, with per-user QoS/account settings and stop/start for container clusters. This release also adds **AWS Trainium/Inferentia (Neuron)** on Kubernetes, **read-only visibility for private workspaces**, and a **conda-free default image**.
Get it now with:
```bash
uv pip install "skypilot[all]==0.14.0"
```
Or, upgrade your team SkyPilot API server:
```bash
NAMESPACE=skypilot
RELEASE_NAME=skypilot
VERSION=0.14.0
helm repo update skypilot
helm upgrade -n $NAMESPACE $RELEASE_NAME skypilot/skypilot \
--set apiService.image=berkeleyskypilot/skypilot:$VERSION \
--version $VERSION --devel --reuse-values
```
**Deprecations & Breaking Changes**:
- **Conda is no longer installed by default** ([#10132](https://github.com/skypilot-org/skypilot/pull/10132)). `provision.install_conda` now defaults to `false`, and conda has been removed from the default Kubernetes images, which instead ship system Python plus a default user venv (`~/sky-user-env`). Set `provision.install_conda: true` to opt back in; the opt-in install now uses a current Miniforge with conda-forge as the only channel.
- **Job Groups enforce in-group networking by default** ([#10297](https://github.com/skypilot-org/skypilot/pull/10297), [#10330](https://github.com/skypilot-org/skypilot/pull/10330)). Groups whose tasks cannot be co-located now fail at submission instead of being silently spread across clusters, and networking setup failures fail the job. Set `inter_connection: false` on the group to allow cross-cluster placement.
- **Tighter API authorization**: request listing and tracking endpoints are scoped to the calling user ([#10274](https://github.com/skypilot-org/skypilot/pull/10274), [#10278](https://github.com/skypilot-org/skypilot/pull/10278)), `sky debug-dump` is admin-only ([#10277](https://github.com/skypilot-org/skypilot/pull/10277)), download paths are authorized against the user's own roots ([#10683](https://github.com/skypilot-org/skypilot/pull/10683)), principals with an unrecognized role are denied ([#10501](https://github.com/skypilot-org/skypilot/pull/10501)), and non-admins can no longer grant the admin role via service accounts ([#9932](https://github.com/skypilot-org/skypilot/pull/9932), [#10482](https://github.com/skypilot-org/skypilot/pull/10482)).
- **`rbac.restrict_config_to_admins` now defaults to `true`** ([#10042](https://github.com/skypilot-org/skypilot/pull/10042)): users with the `user` role can no longer read the API server config. Set it to `false` to restore the previous behavior.
- Kubernetes: use `disk_size` instead of the `ephemeral_storage` field ([#9273](https://github.com/skypilot-org/skypilot/pull/9273)).
- Async request submission no longer prints the API stream link ([#10081](https://github.com/skypilot-org/skypilot/pull/10081)).
## Highlights
### [New] [Dynamic Job Groups](https://docs.skypilot.co/en/latest/examples/job-groups.html)
A task in a job group can now launch further managed jobs with `sky jobs launch` or `sky.jobs.launch`, and they **attach to the group automatically** as *dynamic tasks* ([#10698](https://github.com/skypilot-org/skypilot/pull/10698), [#10701](https://github.com/skypilot-org/skypilot/pull/10701), [#10702](https://github.com/skypilot-org/skypilot/pull/10702), [#10725](https://github.com/skypilot-org/skypilot/pull/10725), [#10734](https://github.com/skypilot-org/skypilot/pull/10734), [#10736](https://github.com/skypilot-org/skypilot/pull/10736), [#10732](https://github.com/skypilot-org/skypilot/pull/10732)). Dynamic tasks are listed under the group in `sky jobs queue` and the dashboard, numbered after the group's own tasks, addressed like any other task (`sky jobs logs 122 3`, `sky jobs cancel 122 --task 3`), and cancelled together with the group. A common use is an eval watcher that launches one evaluation job per checkpoint while the trainer keeps training:
```yaml
---
name: train-and-eval
execution: parallel
primary_tasks: [trainer, eval-watcher]
---
name: trainer
resources:
accelerators: H100:8
run: python train.py --checkpoint-dir /checkpoints
---
name: eval-watcher
resources:
cpus: 2
run: |
for ckpt in $(python watch_checkpoints.py /checkpoints); do
sky jobs launch -y -d -n "eval-$ckpt" eval.yaml --env CKPT=$ckpt
done
```
```console
$ sky jobs queue
ID TASK NAME ... STATUS
122 - train-and-eval ... RUNNING
↳ 0 trainer [P] ... RUNNING
↳ 1 eval-watcher [P] ... RUNNING
↳ 2 eval-step-1 ... SUCCEEDED
↳ 3 eval-step-2 ... RUNNING
↳ 4 eval-step-3 ... RUNNING
```
Job groups also gain an `inter_connection: true | false` knob ([#10297](https://github.com/skypilot-org/skypilot/pull/10297)): networking is a real guarantee when enabled, and `false` skips the networking machinery entirely so tasks can be placed across clusters or clouds.
### [New] Multi-User Slurm
Slurm clusters shared through one API server can now run each user's work **under their own Unix identity** ([#10294](https://github.com/skypilot-org/skypilot/pull/10294), [#10477](https://github.com/skypilot-org/skypilot/pull/10477), [#10685](https://github.com/skypilot-org/skypilot/pull/10685), [#10686](https://github.com/skypilot-org/skypilot/pull/10686)). With `slurm.submit_as_user`, provisioning, `srun`, rsync, cancellation, and SSH all run as the mapped user, so Slurm accounting, fairshare, and file permissions apply per person. Service accounts default to their creator's identity. A new `slurm.quota` block maps to `sbatch --qos` / `--account` and resolves per workspace ([#10680](https://github.com/skypilot-org/skypilot/pull/10680), [#10631](https://github.com/skypilot-org/skypilot/pull/10631)).
```yaml
slurm:
submit_as_user: true
username_map:
jane.doe@example.com: jdoe
inference-prod: inference-svc
quota:
queue: normal # -> #SBATCH --qos=normal
account: pre-training # -> #SBATCH --account=pre-training
```
Slurm container (Pyxis) clusters also support **`sky stop` / `sky start`**, snapshotting each rank's filesystem to shared storage and restoring it into a new allocation ([#10544](https://github.com/skypilot-org/skypilot/pull/10544)), plus **autostop** ([#10645](https://github.com/skypilot-org/skypilot/pull/10645)) and **host path volume mounts** ([#10438](https://github.com/skypilot-org/skypilot/pull/10438)).
### [New] AWS Trainium & Inferentia on Kubernetes
SkyPilot now schedules **AWS Neuron accelerators** (Trainium and Inferentia) on Kubernetes ([#10169](https://github.com/skypilot-org/skypilot/pull/10169)). It recognizes the `aws.amazon.com/neuron` resource, detects accelerator type and count from node labels (including Karpenter), adds the Neuron taint toleration, and lists Neuron devices in `sky show-gpus`.
```bash
sky launch --gpus Trainium2:16 --infra k8s
```
Other new hardware in this release: **GCP RTX PRO 6000 Blackwell (G4)** ([#9634](https://github.com/skypilot-org/skypilot/pull/9634)), **InfiniBand on Nebius B200/B300** ([#10369](https://github.com/skypilot-org/skypilot/pull/10369)), **OCI GB200/GB300 NCCL profiles** for `network_tier: best` ([#10204](https://github.com/skypilot-org/skypilot/pull/10204)), and **SR-IOV RDMA delivery** on Kubernetes via `kubernetes.rdma` ([#10554](https://github.com/skypilot-org/skypilot/pull/10554)).
### [New] [Read-Only Visibility for Private Workspaces](https://docs.skypilot.co/en/latest/admin/workspaces.html)
A private workspace can now let non-members **see it and its clusters and managed jobs (including logs) without being able to modify anything** ([#10228](https://github.com/skypilot-org/skypilot/pull/10228)). Members and admins keep full access. The same change hardens per-resource write isolation so mutating an existing cluster is always gated by the cluster's own workspace.
```yaml
workspaces:
private-ws:
private: true
read_access: all # default: allowed_users
allowed_users:
- alice@example.com
```
Set `workspace_config.read_access: all` to make this the org-wide default.
### Why Is My Job Not Running?
Managed jobs now explain themselves. `sky jobs queue -v` shows the latest launch-progress event for a waiting job, such as a Slurm pending reason or a Kubernetes image pull ([#10692](https://github.com/skypilot-org/skypilot/pull/10692)), and, with API server metrics enabled, SkyPilot exports **where a job's start-up time went** as metrics broken down by stage (controller queue, provisioning, node start-up, setup) ([#10638](https://github.com/skypilot-org/skypilot/pull/10638)). Event logs also record who requested a cluster stop/termination or job cancellation ([#10621](https://github.com/skypilot-org/skypilot/pull/10621), [#10619](https://github.com/skypilot-org/skypilot/pull/10619), [#10661](https://github.com/skypilot-org/skypilot/pull/10661)).
```console
$ sky jobs queue -v
ID NAME STATUS ... DETAILS
56266 train STARTING ... Launching (pending: Resources; partition: dev)
```
---
## What's new: compared to v0.13.0
### API Server
- **Run multiple isolated local API servers on one machine** via `SKYPILOT_API_SERVER_LOCAL_PORT` / `sky api start --port` and `SKY_RUNTIME_DIR` ([#10213](https://github.com/skypilot-org/skypilot/pull/10213)); `SKYPILOT_DISABLE_LOCAL_API_SERVER` blocks local server autostart ([#10093](https://github.com/skypilot-org/skypilot/pull/10093)).
- **The service account token API accepts a role** for new tokens ([#10115](https://github.com/skypilot-org/skypilot/pull/10115)); throttled `last_used_at` writes ([#10391](https://github.com/skypilot-org/skypilot/pull/10391)).
- Grant private-workspace access to users added to `allowed_users` before their first login ([#10079](https://github.com/skypilot-org/skypilot/pull/10079)); surface the resolved `active_workspace` to admin policies ([#10241](https://github.com/skypilot-org/skypilot/pull/10241)).
- Refuse uploads that cannot fit on the server's disk ([#10714](https://github.com/skypilot-org/skypilot/pull/10714)); process client task YAMLs in memory ([#10435](https://github.com/skypilot-org/skypilot/pull/10435)); move chunked-upload work off the event loop ([#10556](https://github.com/skypilot-org/skypilot/pull/10556)).
- Request lifecycle fixes: mark a request FAILED when enqueue fails ([#10617](https://github.com/skypilot-org/skypilot/pull/10617)), fail `/api/get` for requests interrupted by a restart ([#10257](https://github.com/skypilot-org/skypilot/pull/10257)), and reclaim orphaned request logs ([#10675](https://github.com/skypilot-org/skypilot/pull/10675), [#10657](https://github.com/skypilot-org/skypilot/pull/10657)).
- Opt-in executor pool sizing that accounts for server and controller memory (`SKYPILOT_MEMORY_AWARE_WORKER_SIZING`) ([#10550](https://github.com/skypilot-org/skypilot/pull/10550)); fixed retention-daemon cadence ([#10538](https://github.com/skypilot-org/skypilot/pull/10538)) and hourly requests GC ([#10555](https://github.com/skypilot-org/skypilot/pull/10555)).
- Security: never regenerate the JWT signing secret on a DB read failure ([#10566](https://github.com/skypilot-org/skypilot/pull/10566)); redact credentials from config debug logs ([#10511](https://github.com/skypilot-org/skypilot/pull/10511)) and basic-auth passwords in printed URLs ([#10286](https://github.com/skypilot-org/skypilot/pull/10286)); parameterize request-status queries ([#10273](https://github.com/skypilot-org/skypilot/pull/10273)).
- Helm chart: `storage.existingClaim` to attach a pre-provisioned PVC ([#10085](https://github.com/skypilot-org/skypilot/pull/10085), [#10086](https://github.com/skypilot-org/skypilot/pull/10086)), `apiService.host` to set the bind interface ([#10050](https://github.com/skypilot-org/skypilot/pull/10050)), configurable clients-dir subPath ([#10101](https://github.com/skypilot-org/skypilot/pull/10101)).
- Launches blocked on a cluster lock held by another operation release their executor worker while they wait, and the client shows what they are waiting on ([#10210](https://github.com/skypilot-org/skypilot/pull/10210), [#10291](https://github.com/skypilot-org/skypilot/pull/10291), [#10013](https://github.com/skypilot-org/skypilot/pull/10013), [#10534](https://github.com/skypilot-org/skypilot/pull/10534)).
- Auth runs on its own executor with bounded database lookups ([#10313](https://github.com/skypilot-org/skypilot/pull/10313), [#10373](https://github.com/skypilot-org/skypilot/pull/10373), [#10185](https://github.com/skypilot-org/skypilot/pull/10185)); idle-in-transaction time is bounded on PostgreSQL ([#10687](https://github.com/skypilot-org/skypilot/pull/10687)).
- Configurable state-DB connection pool size ([#10791](https://github.com/skypilot-org/skypilot/pull/10791)).
- Optional `SO_REUSEPORT` for spreading connections across API server workers ([#10016](https://github.com/skypilot-org/skypilot/pull/10016)).
### Observability & Metrics
- **New provisioning, pending-time, and availability metrics** with matching Grafana panels and 30-day availability tracking ([#10625](https://github.com/skypilot-org/skypilot/pull/10625)).
- Managed-job recovery gauges ([#10186](https://github.com/skypilot-org/skypilot/pull/10186)), `/api/get` latency by request name ([#10349](https://github.com/skypilot-org/skypilot/pull/10349)), client-side DB instrumentation ([#10525](https://github.com/skypilot-org/skypilot/pull/10525)), SQLite size and local disk metrics ([#10363](https://github.com/skypilot-org/skypilot/pull/10363), [#10674](https://github.com/skypilot-org/skypilot/pull/10674)), SSH round-trip timing ([#10656](https://github.com/skypilot-org/skypilot/pull/10656)), and event-loop stall attribution ([#10523](https://github.com/skypilot-org/skypilot/pull/10523)).
- `/metrics` runs on its own event loop, stays responsive when a collector hangs, and caches the multiprocess merge ([#10503](https://github.com/skypilot-org/skypilot/pull/10503), [#10377](https://github.com/skypilot-org/skypilot/pull/10377), [#10573](https://github.com/skypilot-org/skypilot/pull/10573), [#10575](https://github.com/skypilot-org/skypilot/pull/10575)).
- Slurm GPU metrics federated via the login node, with `/federate` scoping for a shared Prometheus ([#10572](https://github.com/skypilot-org/skypilot/pull/10572), [#10603](https://github.com/skypilot-org/skypilot/pull/10603)).
### Kubernetes
- **AWS Neuron (Trainium/Inferentia) support** ([#10169](https://github.com/skypilot-org/skypilot/pull/10169)) and **SR-IOV RDMA** via `kubernetes.rdma` ([#10554](https://github.com/skypilot-org/skypilot/pull/10554)), with a `pod_config` opt-out from OCI RoCE host networking ([#10546](https://github.com/skypilot-org/skypilot/pull/10546)).
- **EFA improvements**: co-locate multi-node EFA jobs in one AZ ([#10054](https://github.com/skypilot-org/skypilot/pull/10054)) and derive EFA count on scale-from-zero clusters ([#10053](https://github.com/skypilot-org/skypilot/pull/10053)).
- **Kueue**: don't count admission wait against `provision_timeout` and show when a launch is waiting for queue admission ([#10252](https://github.com/skypilot-org/skypilot/pull/10252)), and pools now work under Kueue quota ([#10718](https://github.com/skypilot-org/skypilot/pull/10718)).
- **Clearer failures**: fail on persistent volume mount failures instead of hanging ([#10218](https://github.com/skypilot-org/skypilot/pull/10218)), detect PVCs that will not bind ([#10440](https://github.com/skypilot-org/skypilot/pull/10440)), bound pod wait loops and explain missing pods ([#10460](https://github.com/skypilot-org/skypilot/pull/10460), [#10272](https://github.com/skypilot-org/skypilot/pull/10272)), surface which node a terminated cluster lost ([#10233](https://github.com/skypilot-org/skypilot/pull/10233)), and recommend `set_pod_resource_limits` after an OOM ([#10551](https://github.com/skypilot-org/skypilot/pull/10551)).
- `sky local up --num-nodes` for multi-node local clusters ([#10138](https://github.com/skypilot-org/skypilot/pull/10138)); package-manager-agnostic bootstrap and graceful Docker CLI skip on non-Debian images ([#10077](https://github.com/skypilot-org/skypilot/pull/10077), [#10382](https://github.com/skypilot-org/skypilot/pull/10382)).
- Report node GPU total from capacity with allocatable alongside ([#10395](https://github.com/skypilot-org/skypilot/pull/10395)); display actual pod requests when they diverge from the spec ([#10214](https://github.com/skypilot-org/skypilot/pull/10214)); check ephemeral storage when fitting instances ([#10131](https://github.com/skypilot-org/skypilot/pull/10131)).
- Let pods with DRA claims terminate gracefully ([#10751](https://github.com/skypilot-org/skypilot/pull/10751)); request gzip-compressed API responses ([#10153](https://github.com/skypilot-org/skypilot/pull/10153)); fixed a logging fork deadlock on Python < 3.13 ([#10104](https://github.com/skypilot-org/skypilot/pull/10104)) and multi-node rank crashes on multi-NIC / hostNetwork nodes ([#9924](https://github.com/skypilot-org/skypilot/pull/9924)).
### Volumes
- **Scoped auto-mounts**: `kubernetes.auto_mounts` entries take `scope: personal | workspace | global` ([#10411](https://github.com/skypilot-org/skypilot/pull/10411)), and the volume listing is filtered to the caller's workspaces ([#10531](https://github.com/skypilot-org/skypilot/pull/10531)).
- Refresh a volume's size from the cloud and show pending resizes ([#10549](https://github.com/skypilot-org/skypilot/pull/10549), [#10553](https://github.com/skypilot-org/skypilot/pull/10553)); show why a volume is not ready ([#10486](https://github.com/skypilot-org/skypilot/pull/10486)); fail early when an auto-mounted volume is not ready ([#10402](https://github.com/skypilot-org/skypilot/pull/10402)).
- Volume page filtering ([#10316](https://github.com/skypilot-org/skypilot/pull/10316)); don't fail launches when tagging AWS volumes is denied ([#10627](https://github.com/skypilot-org/skypilot/pull/10627)); validate volumes at creation ([#10513](https://github.com/skypilot-org/skypilot/pull/10513)).
### Managed Jobs & Serve
- **Dynamic job groups** and the **`inter_connection`** knob (see Highlights).
- **Server-side infra filtering** for `sky jobs queue` ([#10613](https://github.com/skypilot-org/skypilot/pull/10613)) and smaller payloads for field-filtered queries ([#10176](https://github.com/skypilot-org/skypilot/pull/10176)).
- Controller resilience: emergency recovery for unexpected controller errors ([#9868](https://github.com/skypilot-org/skypilot/pull/9868), [#10416](https://github.com/skypilot-org/skypilot/pull/10416)), retry transient DB and cluster-status errors ([#10655](https://github.com/skypilot-org/skypilot/pull/10655), [#10040](https://github.com/skypilot-org/skypilot/pull/10040)), fail deterministic task-prep errors fast ([#10326](https://github.com/skypilot-org/skypilot/pull/10326)), and fail jobs whose pool no longer exists ([#10203](https://github.com/skypilot-org/skypilot/pull/10203)).
- Exit code and log pointer in RECOVERING events ([#10256](https://github.com/skypilot-org/skypilot/pull/10256)); `--num-jobs` without a pool ([#10552](https://github.com/skypilot-org/skypilot/pull/10552)); fixed partial state writes on Job Group sync failure and parallelized group teardown ([#10415](https://github.com/skypilot-org/skypilot/pull/10415)).
- **Serve**: fixed `least_load` replica decrement and rotation ([#10445](https://github.com/skypilot-org/skypilot/pull/10445)).
### Core & Backend
- Launch failover stops trying further zones when a provisioner reports a request it can never serve, such as starting a legacy Nebius preemptible VM ([#10697](https://github.com/skypilot-org/skypilot/pull/10697)).
- **Region-free cost estimates** priced with the joint regional minimum ([#10199](https://github.com/skypilot-org/skypilot/pull/10199)).
- Extract external links (e.g. W&B) from job logs server-side ([#9934](https://github.com/skypilot-org/skypilot/pull/9934)); concise health-probe failures in unhealthy-cluster events ([#10201](https://github.com/skypilot-org/skypilot/pull/10201)).
- `sky debug-dump`: fast-fail unreachable kube contexts, parallel per-cluster collection, and bounded controller steps so a stuck controller cannot hang the dump ([#10041](https://github.com/skypilot-org/skypilot/pull/10041), [#10161](https://github.com/skypilot-org/skypilot/pull/10161), [#10068](https://github.com/skypilot-org/skypilot/pull/10068)).
- More robust runtime installs: fall back when an apt repository or distro mirror is unusable ([#10673](https://github.com/skypilot-org/skypilot/pull/10673), [#10512](https://github.com/skypilot-org/skypilot/pull/10512)).
- Fixed Ray job submit failures from a dashboard-agent port conflict ([#9856](https://github.com/skypilot-org/skypilot/pull/9856)); don't abort graceful teardown when command runners are unavailable ([#10604](https://github.com/skypilot-org/skypilot/pull/10604)); guard against a missing `~/.bashrc` and missing Git ([#10245](https://github.com/skypilot-org/skypilot/pull/10245), [#10230](https://github.com/skypilot-org/skypilot/pull/10230)).
### Infrastructure & Cloud Integrations
**Slurm**
- **Submit as authenticated users**, `username_map`, and `quota.queue` / `quota.account` (see Highlights).
- **Container cluster stop/start and autostop** ([#10544](https://github.com/skypilot-org/skypilot/pull/10544), [#10645](https://github.com/skypilot-org/skypilot/pull/10645), [#10652](https://github.com/skypilot-org/skypilot/pull/10652)) and **host path volume mounts** ([#10438](https://github.com/skypilot-org/skypilot/pull/10438)).
- GPU availability from node `AllocTRES`, CPU/memory allocation and usage in the Slurm node-info API, and batched inventory queries over one SSH connection ([#10285](https://github.com/skypilot-org/skypilot/pull/10285), [#10293](https://github.com/skypilot-org/skypilot/pull/10293), [#10425](https://github.com/skypilot-org/skypilot/pull/10425)); best-effort multi-cluster aggregation ([#10284](https://github.com/skypilot-org/skypilot/pull/10284), [#10289](https://github.com/skypilot-org/skypilot/pull/10289)).
- Run skylet under an allocation-owned keeper step ([#10516](https://github.com/skypilot-org/skypilot/pull/10516)); respect custom task CPU demands ([#10447](https://github.com/skypilot-org/skypilot/pull/10447)); fail fast when a task exits nonzero ([#10428](https://github.com/skypilot-org/skypilot/pull/10428)).
- Fixed leaked allocations on terminate ([#10296](https://github.com/skypilot-org/skypilot/pull/10296)), multi-node run-done barrier failures ([#10321](https://github.com/skypilot-org/skypilot/pull/10321)), step-scoped `SLURM_*` env leaking into user scripts ([#10309](https://github.com/skypilot-org/skypilot/pull/10309)), and containerized runs broken by an exported `which` function ([#10716](https://github.com/skypilot-org/skypilot/pull/10716)).
**AWS**
- Skip default security group pre-creation when the user specifies security groups ([#10178](https://github.com/skypilot-org/skypilot/pull/10178)).
**GCP**
- **RTX PRO 6000 Blackwell (G4)** support ([#9634](https://github.com/skypilot-org/skypilot/pull/9634)); federated credentials for GCS COPY ([#10212](https://github.com/skypilot-org/skypilot/pull/10212)).
**Azure**
- **Boot from private Shared Image Gallery images** ([#9843](https://github.com/skypilot-org/skypilot/pull/9843)).
**Nebius**
- **Personalized (per-tenant) pricing** ([#9107](https://github.com/skypilot-org/skypilot/pull/9107), [#10222](https://github.com/skypilot-org/skypilot/pull/10222)), **InfiniBand on B200/B300** ([#10369](https://github.com/skypilot-org/skypilot/pull/10369)), and optional **boot disk encryption** ([#10172](https://github.com/skypilot-org/skypilot/pull/10172)).
- Catalog fetcher switched to billing v1 ([#9829](https://github.com/skypilot-org/skypilot/pull/9829), [#10400](https://github.com/skypilot-org/skypilot/pull/10400)); wait for instance termination before deleting the security group ([#10220](https://github.com/skypilot-org/skypilot/pull/10220)).
**OCI / RunPod**
- OCI: GB200/GB300 NCCL profiles for `network_tier: best` ([#10204](https://github.com/skypilot-org/skypilot/pull/10204)).
- RunPod: corrected region to data center mapping ([#10072](https://github.com/skypilot-org/skypilot/pull/10072)); label account SSH keys with the SkyPilot user ([#9975](https://github.com/skypilot-org/skypilot/pull/9975)).
### User Experience
**Dashboard**
- **Reworked Infra page**: unified table, per-GPU-type summary, and responsive layout ([#10067](https://github.com/skypilot-org/skypilot/pull/10067)), with Slurm clusters broken down by partition, CPU-only and unreachable clusters listed, and progressive per-cluster loading ([#10317](https://github.com/skypilot-org/skypilot/pull/10317), [#10318](https://github.com/skypilot-org/skypilot/pull/10318), [#10329](https://github.com/skypilot-org/skypilot/pull/10329), [#10629](https://github.com/skypilot-org/skypilot/pull/10629)); node table pagination ([#10480](https://github.com/skypilot-org/skypilot/pull/10480)).
- **Clusters page defaults to "My Clusters"** with owner and activity toggles ([#9884](https://github.com/skypilot-org/skypilot/pull/9884), [#10089](https://github.com/skypilot-org/skypilot/pull/10089)).
- **Filters are named in the URL** for clusters, managed jobs, users, volumes, and infra, so filtered views can be bookmarked and shared ([#10455](https://github.com/skypilot-org/skypilot/pull/10455), [#10459](https://github.com/skypilot-org/skypilot/pull/10459), [#10505](https://github.com/skypilot-org/skypilot/pull/10505)).
- Managed jobs: PENDING reason in the status tooltip ([#10202](https://github.com/skypilot-org/skypilot/pull/10202)), recovery count, Started, and Partition on the detail page ([#10004](https://github.com/skypilot-org/skypilot/pull/10004), [#10647](https://github.com/skypilot-org/skypilot/pull/10647)), and summed job-group durations ([#10678](https://github.com/skypilot-org/skypilot/pull/10678)).
- URL-template and scoped external links ([#10090](https://github.com/skypilot-org/skypilot/pull/10090), [#10194](https://github.com/skypilot-org/skypilot/pull/10194)); fenced code blocks rendered in error messages ([#10088](https://github.com/skypilot-org/skypilot/pull/10088)); owning user shown for pools ([#10653](https://github.com/skypilot-org/skypilot/pull/10653)).
- New SkyPilot branding: logo and favicon ([#10181](https://github.com/skypilot-org/skypilot/pull/10181), [#10215](https://github.com/skypilot-org/skypilot/pull/10215), [#10237](https://github.com/skypilot-org/skypilot/pull/10237)).
**CLI**
- `sky api login` works when `SKYPILOT_API_SERVER_ENDPOINT` is set and follows HTTP to HTTPS redirects ([#10404](https://github.com/skypilot-org/skypilot/pull/10404), [#10624](https://github.com/skypilot-org/skypilot/pull/10624)).
- `sky jobs logs` / `sky jobs cancel` address job-group tasks by index ([#10734](https://github.com/skypilot-org/skypilot/pull/10734)); fixed `sky api logs` traceback on 4xx ([#10341](https://github.com/skypilot-org/skypilot/pull/10341)).
### Dependencies
- Lifted the `typing_extensions` cap and dropped `pydantic<2.12` ([#10649](https://github.com/skypilot-org/skypilot/pull/10649)).
- Unpinned the Nebius SDK now that 0.4.3 is loop-aware ([#10320](https://github.com/skypilot-org/skypilot/pull/10320)).
### Documentation & Examples
- **Dynamic job group docs** ([#10732](https://github.com/skypilot-org/skypilot/pull/10732)), **Hugging Face Hub storage guide** ([#10117](https://github.com/skypilot-org/skypilot/pull/10117)), refreshed Sandboxes ([#10109](https://github.com/skypilot-org/skypilot/pull/10109)) and Sky Batch pages ([#10453](https://github.com/skypilot-org/skypilot/pull/10453)).
- **New examples**: Hugging Face storage batch transcription ([#10558](https://github.com/skypilot-org/skypilot/pull/10558)); slime agentic coding-agent RL on Job Groups with Sandboxes ([#10200](https://github.com/skypilot-org/skypilot/pull/10200)), and resilient Ray training ([#10602](https://github.com/skypilot-org/skypilot/pull/10602)) and GB300 NVL72 Ray recovery ([#10644](https://github.com/skypilot-org/skypilot/pull/10644)) with Dynamic Node Set recovery. Sandboxes and Dynamic Node Set recovery are offered in [SkyPilot Platform](https://skypilot.ai/).
- Updated logos and brand assets across docs and README ([#10238](https://github.com/skypilot-org/skypilot/pull/10238), [#10179](https://github.com/skypilot-org/skypilot/pull/10179)); restyled Ask AI widget with dark mode ([#10180](https://github.com/skypilot-org/skypilot/pull/10180)).
### Testing & CI/CD
- Dashboard tests now run in CI ([#10510](https://github.com/skypilot-org/skypilot/pull/10510)); golden snapshot tests for the Kubernetes Ray template ([#10226](https://github.com/skypilot-org/skypilot/pull/10226)).
- Buildkite: global per-test serialization via `concurrency_group` ([#10150](https://github.com/skypilot-org/skypilot/pull/10150)), no auto-retry for exclusive steps ([#10385](https://github.com/skypilot-org/skypilot/pull/10385)), and cancellation mirrored from GitHub ([#10760](https://github.com/skypilot-org/skypilot/pull/10760)); nightly tagging and Slack notifications ([#10192](https://github.com/skypilot-org/skypilot/pull/10192), [#10719](https://github.com/skypilot-org/skypilot/pull/10719)).
- Moved tests off retired AWS p3/V100 instances ([#10098](https://github.com/skypilot-org/skypilot/pull/10098), [#10107](https://github.com/skypilot-org/skypilot/pull/10107), [#10113](https://github.com/skypilot-org/skypilot/pull/10113)); numerous test reliability and flakiness fixes.
## Contributors
Thank you to all contributors who made this release possible!
@DanielZhangQD, @aylei, @zpoint, @kevinmingtarja, @ishankaul1, @SeungjinYang, @lloyd-brown, @rohansonecha, @cg505, @stephenkevn, @Michaelvll, @MadhavJivrajani, @trevanth24, @hopechong, @ryxli, @Anai-Guo, @liuxu623, @romilbhardwaj, @ciprianf, @hentt30, @ahluwalij, @alex000kim, @complynx, @concretevitamin, @davanstrien, @daw3rd, @edmsimplicio, @himanshu1573, @intagliated, @JGSweets, @Jobarion, @Khas-Erdene-Tsogtsaikhan, @klenovda, @kyuds, @nicosuter, @pauldonzier, @pavneeta, @samuelv8, @spiffaz, @typesafeainate, @yash170106065
## New Contributors
* @ciprianf made their first contribution in https://github.com/skypilot-org/skypilot/pull/10072
* @nicosuter made their first contribution in https://github.com/skypilot-org/skypilot/pull/10050
* @spiffaz made their first contribution in https://github.com/skypilot-org/skypilot/pull/10156
* @edmsimplicio made their first contribution in https://github.com/skypilot-org/skypilot/pull/10230
* @yash170106065 made their first contribution in https://github.com/skypilot-org/skypilot/pull/9924
* @pavneeta made their first contribution in https://github.com/skypilot-org/skypilot/pull/10260
* @liuxu623 made their first contribution in https://github.com/skypilot-org/skypilot/pull/10284
* @complynx made their first contribution in https://github.com/skypilot-org/skypilot/pull/10345
* @Anai-Guo made their first contribution in https://github.com/skypilot-org/skypilot/pull/10356
* @ryxli made their first contribution in https://github.com/skypilot-org/skypilot/pull/10436
* @intagliated made their first contribution in https://github.com/skypilot-org/skypilot/pull/9932
* @klenovda made their first contribution in https://github.com/skypilot-org/skypilot/pull/9829
* @himanshu1573 made their first contribution in https://github.com/skypilot-org/skypilot/pull/10369
* @typesafeainate made their first contribution in https://github.com/skypilot-org/skypilot/pull/10172
* @davanstrien made their first contribution in https://github.com/skypilot-org/skypilot/pull/10558
* @daw3rd made their first contribution in https://github.com/skypilot-org/skypilot/pull/10716
## Full Changelog
For a complete list of changes, see the [commit history](https://github.com/skypilot-org/skypilot/compare/v0.13.0...v0.14.0).
Related Repositories
public-apis/public-apis★ 491,196
A collective list of free APIs
NousResearch/hermes-agent★ 256,060
The agent that grows with you
yt-dlp/yt-dlp★ 200,237
A feature-rich command-line audio/video downloader
microsoft/markitdown★ 191,551
Python tool for converting files and office documents to Markdown.
Significant-Gravitas/AutoGPT★ 187,699
AutoGPT is the vision of accessible AI for everyone, to use and to build on. Our mission is to provide the tools, so that you can focus on what matters.