Skip to content

0.21.2

Latest

Choose a tag to compare

@un-def un-def released this 19 Aug 14:51
· 18 commits to master since this release
0dee238

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:8

Commands 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.yml

dstack 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.yml

The 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 0

Events

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 apply is removed. Use dstack preset export followed by dstack apply -f.
  • Presets created before 0.21 can no longer be read; dstack preset suggests 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 create is deprecated in favor of passing the preset configuration to dstack apply.

What's changed

Full Changelog: 0.21.1...0.21.2