Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
2c18b12
air: add convert-to-dabs (run YAML -> Databricks Asset Bundle)
vinchenzo-db Jul 31, 2026
0b5b700
air/convert-to-dabs: fix Windows code_source staging (tar drive-letter)
vinchenzo-db Jul 31, 2026
69140b0
air/convert-to-dabs: pure YAML conversion, no code packaging
vinchenzo-db Aug 3, 2026
b424aff
air/convert-to-dabs: clearer git / remote_volume rejection messages
vinchenzo-db Aug 3, 2026
d37fd2d
air/convert-to-dabs: add --force, and name this CLI in the next steps
vinchenzo-db Aug 3, 2026
c7698c9
air/convert-to-dabs: trim the next-steps output
vinchenzo-db Aug 4, 2026
2cf4f20
air/convert-to-dabs: reject include_paths, quote non-string job keys
vinchenzo-db Aug 5, 2026
de4a80f
Merge branch 'main' into air-convert-to-dabs-main
vinchenzo-db Aug 5, 2026
c1c3f18
air/convert-to-dabs: quote the job key locally, revert yamlsaver
vinchenzo-db Aug 5, 2026
9adcf13
air/convert-to-dabs: stop emitting training_config.yaml
vinchenzo-db Aug 5, 2026
d3b3a77
air/convert-to-dabs: emit launch artifacts under generated_artifacts/
vinchenzo-db Aug 5, 2026
ed62059
air/convert-to-dabs: point the out-of-bundle error at sync.paths
vinchenzo-db Aug 6, 2026
cf1ceda
air/convert-to-dabs: always emit max_retries, fix --output-dir help
vinchenzo-db Aug 6, 2026
7230cb5
air/convert-to-dabs: keep emitting training_config.yaml
vinchenzo-db Aug 6, 2026
7ed2589
Re-trigger CI
vinchenzo-db Aug 6, 2026
6e6380f
Merge branch 'main' into air-convert-to-dabs-main
vinchenzo-db Aug 6, 2026
16219ba
air/convert-to-dabs: fix build after main merge (requirementsName rem…
vinchenzo-db Aug 6, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions acceptance/experimental/air/convert-to-dabs/docker.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
experiment_name: docker-test
command: python train.py
compute:
accelerator_type: GPU_1xA10
num_accelerators: 1
environment:
docker_image:
url: myregistry/img:tag
3 changes: 3 additions & 0 deletions acceptance/experimental/air/convert-to-dabs/out.test.toml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

99 changes: 99 additions & 0 deletions acceptance/experimental/air/convert-to-dabs/output.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@

=== convert an AIR run YAML into a DABs bundle (in place, next to the source)
>>> [CLI] experimental air convert-to-dabs train.yaml
Wrote a Databricks Asset Bundle to .:
databricks.yml
generated_artifacts/training_config.yaml
generated_artifacts/command.sh

To deploy and run this workload as a bundle:
1. [CLI] bundle validate
2. [CLI] bundle deploy
3. [CLI] bundle run torchrun-a10-smoke-test

bundle deploy uploads the code source and launch scripts automatically.
To see what it deployed and where: [CLI] bundle summary

Unlike `air run` (which submits an ephemeral run), bundle deploy creates a
persistent job that is not garbage-collected. When you are done, remove the
job and its uploaded files with:
[CLI] bundle destroy

=== emitted databricks.yml (code_source_path points at ./src; no code is copied)
>>> cat databricks.yml
bundle:
name: torchrun-a10-smoke-test
sync:
paths:
- generated_artifacts
targets:
dev:
mode: development
default: true
resources:
jobs:
torchrun-a10-smoke-test:
name: torchrun-a10-smoke-test
tasks:
- task_key: torchrun-a10-smoke-test
environment_key: default
max_retries: 3
ai_runtime_task:
experiment: torchrun-a10-smoke-test
deployments:
- command_path: ./generated_artifacts/command.sh
compute:
accelerator_type: GPU_1xA10
accelerator_count: 1
code_source_path: ./src
environments:
- environment_key: default
spec:
environment_version: "5"
dependencies:
- numpy

=== the generated command.sh carries the run command
>>> cat generated_artifacts/command.sh
torchrun --nproc_per_node=1 train.py
=== the emitted bundle validates
>>> [CLI] bundle validate
Name: torchrun-a10-smoke-test
Target: dev
Workspace:
User: [USERNAME]
Path: /Workspace/Users/[USERNAME]/.bundle/torchrun-a10-smoke-test/dev

Validation OK!

=== re-converting refuses to clobber the generated bundle
>>> [CLI] experimental air convert-to-dabs train.yaml
Error: databricks.yml already exists in .; pass --force to overwrite or remove it

Exit code: 1

=== --force overwrites it
>>> [CLI] experimental air convert-to-dabs train.yaml --force
Wrote a Databricks Asset Bundle to .:
databricks.yml
generated_artifacts/training_config.yaml
generated_artifacts/command.sh

To deploy and run this workload as a bundle:
1. [CLI] bundle validate
2. [CLI] bundle deploy
3. [CLI] bundle run torchrun-a10-smoke-test

bundle deploy uploads the code source and launch scripts automatically.
To see what it deployed and where: [CLI] bundle summary

Unlike `air run` (which submits an ephemeral run), bundle deploy creates a
persistent job that is not garbage-collected. When you are done, remove the
job and its uploaded files with:
[CLI] bundle destroy

=== docker_image is not supported yet
>>> [CLI] experimental air convert-to-dabs docker.yaml --output-dir generated-docker
Error: environment.docker_image is not yet supported by convert-to-dabs

Exit code: 1
20 changes: 20 additions & 0 deletions acceptance/experimental/air/convert-to-dabs/script
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
title "convert an AIR run YAML into a DABs bundle (in place, next to the source)"
trace $CLI experimental air convert-to-dabs train.yaml

title "emitted databricks.yml (code_source_path points at ./src; no code is copied)"
trace cat databricks.yml

title "the generated command.sh carries the run command"
trace cat generated_artifacts/command.sh

title "the emitted bundle validates"
trace $CLI bundle validate

title "re-converting refuses to clobber the generated bundle"
errcode trace $CLI experimental air convert-to-dabs train.yaml

title "--force overwrites it"
trace $CLI experimental air convert-to-dabs train.yaml --force

title "docker_image is not supported yet"
errcode trace $CLI experimental air convert-to-dabs docker.yaml --output-dir generated-docker
1 change: 1 addition & 0 deletions acceptance/experimental/air/convert-to-dabs/src/train.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
print("train")
3 changes: 3 additions & 0 deletions acceptance/experimental/air/convert-to-dabs/test.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# convert-to-dabs writes the bundle in place (next to train.yaml + src/). These are
# generated artifacts, not committed inputs, so exclude them from the repo-diff check.
Ignore = ["databricks.yml", "generated_artifacts", "generated-docker"]
13 changes: 13 additions & 0 deletions acceptance/experimental/air/convert-to-dabs/train.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
experiment_name: torchrun-a10-smoke-test
command: torchrun --nproc_per_node=1 train.py
compute:
accelerator_type: GPU_1xA10
num_accelerators: 1
environment:
version: 5
dependencies:
- numpy
code_source:
type: snapshot
snapshot:
root_path: ./src
13 changes: 7 additions & 6 deletions acceptance/experimental/air/help/output.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,13 @@ Usage:
databricks experimental air [command]

Available Commands:
cancel Cancel one or more runs
get Show status, configuration, and timing details for a specific run
list List your active runs for the current profile (use --all-status for finished runs)
logs Stream or fetch logs for a run
register-image Mirror a Docker image into the workspace registry
run Submit a training workload from a YAML config
cancel Cancel one or more runs
convert-to-dabs Convert an AIR run YAML into a Databricks Asset Bundle
get Show status, configuration, and timing details for a specific run
list List your active runs for the current profile (use --all-status for finished runs)
logs Stream or fetch logs for a run
register-image Mirror a Docker image into the workspace registry
run Submit a training workload from a YAML config

Flags:
-h, --help help for air
Expand Down
1 change: 1 addition & 0 deletions experimental/air/cmd/air.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ experimental and may change in future versions.`,
cmd.AddCommand(newLogsCommand())
cmd.AddCommand(newCancelCommand())
cmd.AddCommand(newRegisterImageCommand())
cmd.AddCommand(newConvertToDabsCommand())

return cmd
}
2 changes: 1 addition & 1 deletion experimental/air/cmd/air_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ func TestNewRegistersAllSubcommands(t *testing.T) {
registered[c.Name()] = true
}

want := []string{"run", "get", "list", "logs", "cancel", "register-image"}
want := []string{"run", "get", "list", "logs", "cancel", "register-image", "convert-to-dabs"}
for _, name := range want {
assert.True(t, registered[name], "subcommand %q is not registered", name)
}
Expand Down
Loading
Loading