Tasks
Node groups
A multi-node task can now define heterogeneous node groups instead of a single homogeneous nodes count. Each group has its own nodes count, resources, commands, and ports, so one run can mix roles and hardware — e.g. a CPU head node with GPU workers:
type: task
name: ray-cluster
python: 3.12
groups:
- nodes: 1
commands:
- pip uninstall -y ray && pip install -U "ray[default]"
- ray start --head --port=6379 --block
resources:
cpu: 2
memory: 4GB..
ports:
- 8265
- nodes: 2
commands:
- pip uninstall -y ray && pip install -U "ray[default]"
- ray start --address=${{ groups[0].nodes[0].IP_ADDRESS }}:6379 --block
resources:
gpu: H100:8Commands in any group can reference the internal IP address of any node in the run via ${{ groups[i].nodes[j].IP_ADDRESS }}. groups[0].nodes[0] is the run's master node, which is what DSTACK_MASTER_NODE_IP resolves to.
Only resources, commands, and ports can be configured per group for now. groups and the top-level nodes are mutually exclusive.
Resources
CPU
An unset resources.cpu.arch in run configurations now means "any architecture supported by the image". Previously it was inferred from the GPU: arm for known NVIDIA superchips such as GH200, x86 otherwise.
In fleet configurations, an unset resources.cpu.arch now means "any architecture".
Presets
dstack apply
dstack apply replaces dstack preset create. It accepts type: preset configurations like any other configuration type.
$ dstack apply -f preset.dstack.ymldstack preset export
dstack preset export replaces dstack preset apply. It writes the preset's service as a plain type: service configuration with its patch files.
$ dstack preset export qwen38-27b -f service.dstack.yml
$ dstack apply -f service.dstack.ymlThe service is then deployed with the regular dstack apply.
Gateways
Delays between service submission and its registration on the gateway, and between a service replica becoming ready and its registration, are gone:
$ dstack event --within-run test-service | grep Service
[2026-08-18 22:28:06] [run test-service, gateway my-gateway] Service assigned to gateway
[2026-08-18 22:28:07] [run test-service, gateway my-gateway] Service registered on gateway replica 0
[2026-08-18 22:30:11] [job test-service-0-0] Service replica ready to receive requests
[2026-08-18 22:30:13] [job test-service-0-0, gateway my-gateway] Service replica registered on gateway replica 0Events
Two new events, Service assigned to gateway and Service assigned to run without a gateway, show which gateway is supposed to serve the service before it is actually registered there.
Backends
AMD Developer Cloud
AMD GPU droplets now use the gpu-amd-base image (ROCm 7.14) instead of digitaloceanai-rocmjupyter (ROCm 6.4), so current ROCm container images work.
Warning
The AMD Developer Cloud changed their API url resulting in 401 Client Error: Unauthorized. This update fixes this by migrating to the new API url (https://api.devcloud.amd.com). Update to this version to ensure the amddevcloud backend works.
Breaking changes
dstack preset applyis removed. Usedstack preset exportfollowed bydstack apply -f.- Presets created before 0.21 can no longer be read;
dstack presetsuggests deleting or recreating them. Presets and sessions created by 0.21.x are upgraded on read and rewritten in the new format on save.
Deprecations
dstack preset createis deprecated in favor of passing the preset configuration todstack apply.
What's changed
- [Presets] Typed models and stored format overhaul by @peterschmidt85 in #4150
- Fix outdated ROCm driver on DigitalOcean AMD GPU droplets by @peterschmidt85 in #4151
- Don't process running job if other jobs in replica are not provisioned by @un-def in #4149
- Change CPU arch default value/validation by @un-def in #4136
- Handle gateway collect stats and other errors by @r4victor in #4153
- Support Heterogenous Node Groups by @Bihan in #4094
- [Presets] CLI refactoring by @peterschmidt85 in #4152
- Add gateway assignment events by @jvstme in #4155
- [chore]: Gateway replica naming cleanup by @jvstme in #4156
- Update amddevcloud API url by @r4victor in #4158
- Document heterogeneous node groups for tasks by @Bihan in #4154
- [Internal] Rework runner/.justfile as a module by @un-def in #4139
- Speed up service registration on gateway by @jvstme in #4166
- [Internal] Preset service serialization format by @peterschmidt85 in #4162
- Bump gpuhunt==0.1.30 by @r4victor in #4159
- [runner] Remove
BASH_FUNC_*%%variables by @un-def in #4168
Full Changelog: 0.21.1...0.21.2