From c1e3a3258214ae752f6042bcba08827d4780816d Mon Sep 17 00:00:00 2001 From: Maosheng Liao Date: Tue, 7 Jul 2026 02:14:22 -0700 Subject: [PATCH 1/4] toml_config: add [job].upload_reproducible_setup, default False for OSS The VLM base config defaults upload_reproducible_setup=True, so a run launched through the structured-TOML flow attempts the reproducible-setup S3 upload (and wandb save_s3, which interpolate from ${upload_reproducible_setup}) by default. OSS users mostly have no S3 access and no way to turn it off from the TOML. Add a [job].upload_reproducible_setup knob (default False) that maps to the top-level config.upload_reproducible_setup: - JobConfig gains the field (default False). - PATH_REMAPS (vfm + vlm) hoist ("job","upload_reproducible_setup") to the top-level ("upload_reproducible_setup",). - load_experiment_from_toml keeps the validated model and always injects the resolved value into raw before building overrides, so the override is emitted as false even when the TOML omits it (build_hydra_overrides walks the raw dict, so an omitted field would otherwise emit nothing and the base True would win). Users opt back into S3 upload with `upload_reproducible_setup = true`. Docs (sft_config.md) + all example [job] blocks updated; adds tests/toml_config_test.py. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../configs/toml_config/sft_config.py | 20 ++++- .../configs/toml_config/toml_config_helper.py | 6 ++ docs/sft_config.md | 4 +- .../sft_config/action_policy_droid_repro.toml | 1 + examples/toml/sft_config/llava_ov.toml | 1 + .../llava_ov_mapstyle_dataloader.toml | 1 + .../toml/sft_config/videophy2_sft_nano.toml | 1 + examples/toml/sft_config/vision_sft_nano.toml | 1 + .../vision_sft_nano_mapstyle_dataloader.toml | 1 + .../toml/sft_config/vision_sft_super.toml | 1 + tests/toml_config_test.py | 86 +++++++++++++++++++ 11 files changed, 121 insertions(+), 2 deletions(-) create mode 100644 tests/toml_config_test.py diff --git a/cosmos_framework/configs/toml_config/sft_config.py b/cosmos_framework/configs/toml_config/sft_config.py index 9ce57728..04d0efbc 100644 --- a/cosmos_framework/configs/toml_config/sft_config.py +++ b/cosmos_framework/configs/toml_config/sft_config.py @@ -83,6 +83,17 @@ class JobConfig(BaseModel): "'disabled' (no wandb at all)." ), ) + upload_reproducible_setup: bool = Field( + default=False, + description=( + "Upload the reproducible-setup bundle and wandb save_s3 artifacts " + "to S3. Defaults False (OSS: no S3 access). Set True only when S3 " + "upload is configured. Remapped out of [job] to the top-level " + "config.upload_reproducible_setup, overriding the base config value " + "(the VLM base defaults it True). Always emitted by " + "load_experiment_from_toml, so omitting it forces False." + ), + ) # ---------------------------------------------------------------- model @@ -721,7 +732,14 @@ def load_experiment_from_toml( # Validate structure against the pydantic schema (raises ValidationError on # unknown keys because of ``extra="forbid"``). - SFTExperimentConfig.model_validate(raw) + cfg = SFTExperimentConfig.model_validate(raw) + + # ``build_hydra_overrides`` walks the *raw* dict, so an omitted field emits + # no override and the base config's value wins. ``upload_reproducible_setup`` + # must instead default to False (OSS: no S3), overriding the VLM base's True. + # Inject the pydantic-resolved value back into raw so the override is always + # emitted — the default lives in exactly one place (JobConfig.Field). + raw.setdefault("job", {})["upload_reproducible_setup"] = cfg.job.upload_reproducible_setup task = raw.get("job", {}).get("task", "vfm") try: diff --git a/cosmos_framework/configs/toml_config/toml_config_helper.py b/cosmos_framework/configs/toml_config/toml_config_helper.py index 211e9d3b..4d1535c5 100644 --- a/cosmos_framework/configs/toml_config/toml_config_helper.py +++ b/cosmos_framework/configs/toml_config/toml_config_helper.py @@ -47,6 +47,9 @@ # ``model.config.`` in the Hydra tree. ``attn_implementation`` is a # VLM-only knob — skip it on VFM. Other sections pass through. "vfm": { + # [job].upload_reproducible_setup lives at the top-level config field, + # not config.job.* — hoist it out of the job section. + ("job", "upload_reproducible_setup"): ("upload_reproducible_setup",), ("model", "attn_implementation"): None, ("model", "backbone"): None, # VLM-only — VFM has no model.config.backbone # Per-caption token cap lives on the nested SFT dataset, not a top-level @@ -63,6 +66,9 @@ # tasks — so the catch-all ``("model",) -> ("model", "config")`` rule # routes them uniformly. Fields with no VLM analog map to ``None`` (skip). "vlm": { + # [job].upload_reproducible_setup lives at the top-level config field, + # not config.job.* — hoist it out of the job section. + ("job", "upload_reproducible_setup"): ("upload_reproducible_setup",), # No VLM analog — skip these leaves ("model", "max_num_tokens_after_packing"): None, ("model", "joint_attn_implementation"): None, diff --git a/docs/sft_config.md b/docs/sft_config.md index db0bb83b..1329b50e 100644 --- a/docs/sft_config.md +++ b/docs/sft_config.md @@ -78,6 +78,7 @@ Run identity + meta-fields that pick the Hydra config tree to load. | `group` | `""` | W&B sub-label for clustering related runs (e.g. `"sft"`). Flows to `config.job.group`. | | `name` | `""` | W&B run name; forms part of the output dir `$IMAGINAIRE_OUTPUT_ROOT////`. Leave empty (or use `${now:%Y-%m-%d}_${now:%H-%M-%S}`) for auto-timestamped subdir. | | `wandb_mode` | `"disabled"` | `"online"` (real-time, needs `WANDB_API_KEY`), `"offline"` (log locally, sync later via `wandb sync`), or `"disabled"`. | +| `upload_reproducible_setup` | `false` | Upload the reproducible-setup bundle + wandb `save_s3` artifacts to S3. **Defaults `false`** (OSS: no S3 access); set `true` only when S3 upload is configured. Remapped out of `[job]` to the top-level `config.upload_reproducible_setup`, overriding the base config value (the VLM base defaults it `true`). Always emitted by `load_experiment_from_toml`, so omitting it forces `false`. | ## `[model]` @@ -280,6 +281,7 @@ The same TOML key lands at different Hydra paths depending on `[job].task`: | TOML path | VFM (`task="vfm"`) Hydra path | VLM (`task="vlm"`) Hydra path | | ---------------------------------------------------------------------------------------- | ----------------------------------------- | ----------------------------------------- | +| `job.upload_reproducible_setup` | `upload_reproducible_setup` | `upload_reproducible_setup` | | `model.` | `model.config.` | `model.config.` | | `model.parallelism.*` | `model.config.parallelism.*` | `model.config.parallelism.*` | | `model.compile.*` | `model.config.compile.*` | `model.config.compile.*` | @@ -310,7 +312,7 @@ A few useful knobs aren't currently modeled by `SFTExperimentConfig` because the `load_experiment_from_toml(toml_path, extra_overrides)` (in `sft_config.py`) is the end-to-end loader. It: 1. Reads the TOML with `tomllib`. -2. Validates the parsed dict against `SFTExperimentConfig` (raises `ValidationError` on unknown keys). +2. Validates the parsed dict against `SFTExperimentConfig` (raises `ValidationError` on unknown keys), then injects the pydantic-resolved `job.upload_reproducible_setup` back into the raw dict so it is always emitted (defaulting to `false`) even when the TOML omits it. 3. Picks the base config from `[job].task`: `TASK_TO_BASE_CONFIG["vfm"|"vlm"]`. 4. Calls `build_hydra_overrides(raw)` to produce a `["--", "experiment=", "k.p=v", …]` list with per-task remaps applied and MISSING values filtered. `[custom]` is skipped here (it is injected verbatim in step 7, not per-leaf-remapped). 5. Appends `extra_overrides` (CLI tail) so they take precedence over the TOML. diff --git a/examples/toml/sft_config/action_policy_droid_repro.toml b/examples/toml/sft_config/action_policy_droid_repro.toml index 2326d407..98ebb44b 100644 --- a/examples/toml/sft_config/action_policy_droid_repro.toml +++ b/examples/toml/sft_config/action_policy_droid_repro.toml @@ -23,6 +23,7 @@ project = "cosmos3_action" group = "action_sft" name = "action_policy_droid_repro" wandb_mode = "online" +upload_reproducible_setup = false # → config.upload_reproducible_setup. OSS: no S3 upload; set true only with S3 configured. [model] precision = "bfloat16" diff --git a/examples/toml/sft_config/llava_ov.toml b/examples/toml/sft_config/llava_ov.toml index 39c81202..1c9f581b 100644 --- a/examples/toml/sft_config/llava_ov.toml +++ b/examples/toml/sft_config/llava_ov.toml @@ -35,6 +35,7 @@ project = "cosmos3" # matches legacy group = "vlm_llava_ov_demo" name = "pre_exp012_llava_ov" wandb_mode = "disabled" +upload_reproducible_setup = false # → config.upload_reproducible_setup. OSS: no S3 upload; set true only with S3 configured. [model] # VLM-only attention impl (PolicyConfig.attn_implementation). diff --git a/examples/toml/sft_config/llava_ov_mapstyle_dataloader.toml b/examples/toml/sft_config/llava_ov_mapstyle_dataloader.toml index 8a67acea..bb1f8f6e 100644 --- a/examples/toml/sft_config/llava_ov_mapstyle_dataloader.toml +++ b/examples/toml/sft_config/llava_ov_mapstyle_dataloader.toml @@ -46,6 +46,7 @@ project = "cosmos_oss_alignment" group = "vlm_llava_ov_demo" name = "pre_exp012_llava_ov_mapstyle_dataloader" wandb_mode = "online" +upload_reproducible_setup = false # → config.upload_reproducible_setup. OSS: no S3 upload; set true only with S3 configured. [model] attn_implementation = "cosmos" diff --git a/examples/toml/sft_config/videophy2_sft_nano.toml b/examples/toml/sft_config/videophy2_sft_nano.toml index 35b8e785..7cd363bc 100644 --- a/examples/toml/sft_config/videophy2_sft_nano.toml +++ b/examples/toml/sft_config/videophy2_sft_nano.toml @@ -20,6 +20,7 @@ project = "cosmos3" group = "vlm_videophy2_sft" name = "videophy2_sft_nano" wandb_mode = "disabled" +upload_reproducible_setup = false # → config.upload_reproducible_setup. OSS: no S3 upload; set true only with S3 configured. [model] attn_implementation = "cosmos" diff --git a/examples/toml/sft_config/vision_sft_nano.toml b/examples/toml/sft_config/vision_sft_nano.toml index dbb192dc..66da45f8 100644 --- a/examples/toml/sft_config/vision_sft_nano.toml +++ b/examples/toml/sft_config/vision_sft_nano.toml @@ -12,6 +12,7 @@ project = "cosmos3" group = "sft" name = "vision_sft_nano" wandb_mode = "disabled" +upload_reproducible_setup = false # → config.upload_reproducible_setup. OSS: no S3 upload; set true only with S3 configured. [model] max_num_tokens_after_packing = 45056 diff --git a/examples/toml/sft_config/vision_sft_nano_mapstyle_dataloader.toml b/examples/toml/sft_config/vision_sft_nano_mapstyle_dataloader.toml index 5d76be8b..04449a99 100644 --- a/examples/toml/sft_config/vision_sft_nano_mapstyle_dataloader.toml +++ b/examples/toml/sft_config/vision_sft_nano_mapstyle_dataloader.toml @@ -20,6 +20,7 @@ project = "cosmos3" group = "sft" name = "vision_sft_nano_mapstyle_dataloader" wandb_mode = "disabled" +upload_reproducible_setup = false # → config.upload_reproducible_setup. OSS: no S3 upload; set true only with S3 configured. [model] max_num_tokens_after_packing = 45056 diff --git a/examples/toml/sft_config/vision_sft_super.toml b/examples/toml/sft_config/vision_sft_super.toml index 06a1574a..57219499 100644 --- a/examples/toml/sft_config/vision_sft_super.toml +++ b/examples/toml/sft_config/vision_sft_super.toml @@ -12,6 +12,7 @@ project = "cosmos3" group = "sft" name = "vision_sft_super" wandb_mode = "disabled" +upload_reproducible_setup = false # → config.upload_reproducible_setup. OSS: no S3 upload; set true only with S3 configured. [model] max_num_tokens_after_packing = 45056 diff --git a/tests/toml_config_test.py b/tests/toml_config_test.py new file mode 100644 index 00000000..37031997 --- /dev/null +++ b/tests/toml_config_test.py @@ -0,0 +1,86 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: OpenMDW-1.1 + +"""Unit tests for the structured-TOML → Hydra-override flow. + +Focused on ``[job].upload_reproducible_setup`` (the OSS-friendly default-False +knob): it must land at the top-level ``config.upload_reproducible_setup`` field +on both tasks, and must be emitted as ``false`` even when the TOML omits it (so +it overrides the VLM base config's ``True``). +""" + +from __future__ import annotations + +import textwrap + +import pytest + +from cosmos_framework.configs.toml_config.toml_config_helper import build_hydra_overrides + + +@pytest.mark.parametrize("task", ["vfm", "vlm"]) +@pytest.mark.parametrize(("value", "expected"), [(True, "true"), (False, "false")]) +def test_upload_setup_remapped_to_toplevel(task: str, value: bool, expected: str) -> None: + """The knob is hoisted out of ``[job]`` to the top-level config field on + both tasks — never emitted as ``job.upload_reproducible_setup``.""" + overrides = build_hydra_overrides( + {"job": {"task": task, "experiment": "e", "upload_reproducible_setup": value}} + ) + assert f"upload_reproducible_setup={expected}" in overrides + assert not any(o.startswith("job.upload_reproducible_setup") for o in overrides) + + +def _capture_overrides(monkeypatch: pytest.MonkeyPatch, tmp_path, toml_text: str) -> list[str]: + """Run the real ``load_experiment_from_toml`` but stub ``load_config`` so we + exercise only validate → inject → ``build_hydra_overrides`` (no Hydra + compose, which would need the full model config tree).""" + import cosmos_framework.utils.config as config_mod + from cosmos_framework.configs.toml_config.sft_config import load_experiment_from_toml + + captured: dict[str, object] = {} + + def fake_load_config(base_config_path: str, overrides: list[str]): + captured["base"] = base_config_path + captured["overrides"] = overrides + return object() + + monkeypatch.setattr(config_mod, "load_config", fake_load_config) + toml_path = tmp_path / "cfg.toml" + toml_path.write_text(textwrap.dedent(toml_text)) + load_experiment_from_toml(toml_path) + return captured["overrides"] # type: ignore[return-value] + + +@pytest.mark.parametrize("task", ["vfm", "vlm"]) +def test_omitted_knob_forces_false(monkeypatch: pytest.MonkeyPatch, tmp_path, task: str) -> None: + """Omitting the knob still emits ``upload_reproducible_setup=false`` — the + whole point (the VLM base config defaults it ``True``).""" + overrides = _capture_overrides( + monkeypatch, tmp_path, f'[job]\ntask = "{task}"\nexperiment = "e"\n' + ) + assert "upload_reproducible_setup=false" in overrides + + +@pytest.mark.parametrize("task", ["vfm", "vlm"]) +def test_explicit_true_opts_in(monkeypatch: pytest.MonkeyPatch, tmp_path, task: str) -> None: + """Explicitly setting ``true`` in the TOML opts the run back into S3 upload.""" + overrides = _capture_overrides( + monkeypatch, + tmp_path, + f'[job]\ntask = "{task}"\nexperiment = "e"\nupload_reproducible_setup = true\n', + ) + assert "upload_reproducible_setup=true" in overrides + assert "upload_reproducible_setup=false" not in overrides + + +def test_unknown_key_still_rejected(monkeypatch: pytest.MonkeyPatch, tmp_path) -> None: + """The strict schema (extra='forbid') still rejects typos — adding the new + field didn't loosen validation.""" + from pydantic import ValidationError + + with pytest.raises(ValidationError): + _capture_overrides( + monkeypatch, + tmp_path, + '[job]\ntask = "vfm"\nexperiment = "e"\nupload_reproducable_setup = false\n', + ) From e0e298fd665ca239e2ff2e49df0c2ac7f801305d Mon Sep 17 00:00:00 2001 From: Maosheng Liao Date: Tue, 7 Jul 2026 02:29:17 -0700 Subject: [PATCH 2/4] update tests --- tests/toml_config_test.py | 86 --------------------------------------- 1 file changed, 86 deletions(-) delete mode 100644 tests/toml_config_test.py diff --git a/tests/toml_config_test.py b/tests/toml_config_test.py deleted file mode 100644 index 37031997..00000000 --- a/tests/toml_config_test.py +++ /dev/null @@ -1,86 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: OpenMDW-1.1 - -"""Unit tests for the structured-TOML → Hydra-override flow. - -Focused on ``[job].upload_reproducible_setup`` (the OSS-friendly default-False -knob): it must land at the top-level ``config.upload_reproducible_setup`` field -on both tasks, and must be emitted as ``false`` even when the TOML omits it (so -it overrides the VLM base config's ``True``). -""" - -from __future__ import annotations - -import textwrap - -import pytest - -from cosmos_framework.configs.toml_config.toml_config_helper import build_hydra_overrides - - -@pytest.mark.parametrize("task", ["vfm", "vlm"]) -@pytest.mark.parametrize(("value", "expected"), [(True, "true"), (False, "false")]) -def test_upload_setup_remapped_to_toplevel(task: str, value: bool, expected: str) -> None: - """The knob is hoisted out of ``[job]`` to the top-level config field on - both tasks — never emitted as ``job.upload_reproducible_setup``.""" - overrides = build_hydra_overrides( - {"job": {"task": task, "experiment": "e", "upload_reproducible_setup": value}} - ) - assert f"upload_reproducible_setup={expected}" in overrides - assert not any(o.startswith("job.upload_reproducible_setup") for o in overrides) - - -def _capture_overrides(monkeypatch: pytest.MonkeyPatch, tmp_path, toml_text: str) -> list[str]: - """Run the real ``load_experiment_from_toml`` but stub ``load_config`` so we - exercise only validate → inject → ``build_hydra_overrides`` (no Hydra - compose, which would need the full model config tree).""" - import cosmos_framework.utils.config as config_mod - from cosmos_framework.configs.toml_config.sft_config import load_experiment_from_toml - - captured: dict[str, object] = {} - - def fake_load_config(base_config_path: str, overrides: list[str]): - captured["base"] = base_config_path - captured["overrides"] = overrides - return object() - - monkeypatch.setattr(config_mod, "load_config", fake_load_config) - toml_path = tmp_path / "cfg.toml" - toml_path.write_text(textwrap.dedent(toml_text)) - load_experiment_from_toml(toml_path) - return captured["overrides"] # type: ignore[return-value] - - -@pytest.mark.parametrize("task", ["vfm", "vlm"]) -def test_omitted_knob_forces_false(monkeypatch: pytest.MonkeyPatch, tmp_path, task: str) -> None: - """Omitting the knob still emits ``upload_reproducible_setup=false`` — the - whole point (the VLM base config defaults it ``True``).""" - overrides = _capture_overrides( - monkeypatch, tmp_path, f'[job]\ntask = "{task}"\nexperiment = "e"\n' - ) - assert "upload_reproducible_setup=false" in overrides - - -@pytest.mark.parametrize("task", ["vfm", "vlm"]) -def test_explicit_true_opts_in(monkeypatch: pytest.MonkeyPatch, tmp_path, task: str) -> None: - """Explicitly setting ``true`` in the TOML opts the run back into S3 upload.""" - overrides = _capture_overrides( - monkeypatch, - tmp_path, - f'[job]\ntask = "{task}"\nexperiment = "e"\nupload_reproducible_setup = true\n', - ) - assert "upload_reproducible_setup=true" in overrides - assert "upload_reproducible_setup=false" not in overrides - - -def test_unknown_key_still_rejected(monkeypatch: pytest.MonkeyPatch, tmp_path) -> None: - """The strict schema (extra='forbid') still rejects typos — adding the new - field didn't loosen validation.""" - from pydantic import ValidationError - - with pytest.raises(ValidationError): - _capture_overrides( - monkeypatch, - tmp_path, - '[job]\ntask = "vfm"\nexperiment = "e"\nupload_reproducable_setup = false\n', - ) From 5feb803fd71f0085e5a983bc2f98f722a14f5e96 Mon Sep 17 00:00:00 2001 From: Maosheng Liao Date: Tue, 7 Jul 2026 02:31:02 -0700 Subject: [PATCH 3/4] fotmat --- docs/sft_config.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/sft_config.md b/docs/sft_config.md index 1329b50e..241f90fe 100644 --- a/docs/sft_config.md +++ b/docs/sft_config.md @@ -70,15 +70,15 @@ The full pipeline (dataloader class, dataset wiring, model_instance LazyCall, et Run identity + meta-fields that pick the Hydra config tree to load. -| field | default | description | -| ------------ | ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `task` | `"vfm"` | **META** — chooses which `make_config()` to call: `"vfm"` → `cosmos_framework/configs/base/config.py`, `"vlm"` → `cosmos_framework/configs/base/reasoner/config.py`. Also picks the path-remap rules in `toml_config_helper.PATH_REMAPS`. | -| `experiment` | `""` | **META** — names the Hydra experiment LazyDict registered in `ConfigStore` under `experiment/`. Resolved at load time via `experiment=` (e.g. `vision_sft_nano`). | -| `project` | `""` | W&B project (team-level bucket). Flows to `config.job.project`. | -| `group` | `""` | W&B sub-label for clustering related runs (e.g. `"sft"`). Flows to `config.job.group`. | -| `name` | `""` | W&B run name; forms part of the output dir `$IMAGINAIRE_OUTPUT_ROOT////`. Leave empty (or use `${now:%Y-%m-%d}_${now:%H-%M-%S}`) for auto-timestamped subdir. | -| `wandb_mode` | `"disabled"` | `"online"` (real-time, needs `WANDB_API_KEY`), `"offline"` (log locally, sync later via `wandb sync`), or `"disabled"`. | -| `upload_reproducible_setup` | `false` | Upload the reproducible-setup bundle + wandb `save_s3` artifacts to S3. **Defaults `false`** (OSS: no S3 access); set `true` only when S3 upload is configured. Remapped out of `[job]` to the top-level `config.upload_reproducible_setup`, overriding the base config value (the VLM base defaults it `true`). Always emitted by `load_experiment_from_toml`, so omitting it forces `false`. | +| field | default | description | +| --------------------------- | ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `task` | `"vfm"` | **META** — chooses which `make_config()` to call: `"vfm"` → `cosmos_framework/configs/base/config.py`, `"vlm"` → `cosmos_framework/configs/base/reasoner/config.py`. Also picks the path-remap rules in `toml_config_helper.PATH_REMAPS`. | +| `experiment` | `""` | **META** — names the Hydra experiment LazyDict registered in `ConfigStore` under `experiment/`. Resolved at load time via `experiment=` (e.g. `vision_sft_nano`). | +| `project` | `""` | W&B project (team-level bucket). Flows to `config.job.project`. | +| `group` | `""` | W&B sub-label for clustering related runs (e.g. `"sft"`). Flows to `config.job.group`. | +| `name` | `""` | W&B run name; forms part of the output dir `$IMAGINAIRE_OUTPUT_ROOT////`. Leave empty (or use `${now:%Y-%m-%d}_${now:%H-%M-%S}`) for auto-timestamped subdir. | +| `wandb_mode` | `"disabled"` | `"online"` (real-time, needs `WANDB_API_KEY`), `"offline"` (log locally, sync later via `wandb sync`), or `"disabled"`. | +| `upload_reproducible_setup` | `false` | Upload the reproducible-setup bundle + wandb `save_s3` artifacts to S3. **Defaults `false`** (OSS: no S3 access); set `true` only when S3 upload is configured. Remapped out of `[job]` to the top-level `config.upload_reproducible_setup`, overriding the base config value (the VLM base defaults it `true`). Always emitted by `load_experiment_from_toml`, so omitting it forces `false`. | ## `[model]` From ee4f63eab4eb1c054b20cc938236c76cb6200639 Mon Sep 17 00:00:00 2001 From: Cosmos-Framework Release Bot Date: Tue, 7 Jul 2026 19:40:29 -0700 Subject: [PATCH 4/4] Revert examples/toml/sft_config to main Co-Authored-By: Claude Fable 5 --- examples/toml/sft_config/action_policy_droid_repro.toml | 1 - examples/toml/sft_config/llava_ov.toml | 1 - examples/toml/sft_config/llava_ov_mapstyle_dataloader.toml | 1 - examples/toml/sft_config/videophy2_sft_nano.toml | 1 - examples/toml/sft_config/vision_sft_nano.toml | 1 - .../toml/sft_config/vision_sft_nano_mapstyle_dataloader.toml | 1 - examples/toml/sft_config/vision_sft_super.toml | 1 - 7 files changed, 7 deletions(-) diff --git a/examples/toml/sft_config/action_policy_droid_repro.toml b/examples/toml/sft_config/action_policy_droid_repro.toml index 98ebb44b..2326d407 100644 --- a/examples/toml/sft_config/action_policy_droid_repro.toml +++ b/examples/toml/sft_config/action_policy_droid_repro.toml @@ -23,7 +23,6 @@ project = "cosmos3_action" group = "action_sft" name = "action_policy_droid_repro" wandb_mode = "online" -upload_reproducible_setup = false # → config.upload_reproducible_setup. OSS: no S3 upload; set true only with S3 configured. [model] precision = "bfloat16" diff --git a/examples/toml/sft_config/llava_ov.toml b/examples/toml/sft_config/llava_ov.toml index 1c9f581b..39c81202 100644 --- a/examples/toml/sft_config/llava_ov.toml +++ b/examples/toml/sft_config/llava_ov.toml @@ -35,7 +35,6 @@ project = "cosmos3" # matches legacy group = "vlm_llava_ov_demo" name = "pre_exp012_llava_ov" wandb_mode = "disabled" -upload_reproducible_setup = false # → config.upload_reproducible_setup. OSS: no S3 upload; set true only with S3 configured. [model] # VLM-only attention impl (PolicyConfig.attn_implementation). diff --git a/examples/toml/sft_config/llava_ov_mapstyle_dataloader.toml b/examples/toml/sft_config/llava_ov_mapstyle_dataloader.toml index bb1f8f6e..8a67acea 100644 --- a/examples/toml/sft_config/llava_ov_mapstyle_dataloader.toml +++ b/examples/toml/sft_config/llava_ov_mapstyle_dataloader.toml @@ -46,7 +46,6 @@ project = "cosmos_oss_alignment" group = "vlm_llava_ov_demo" name = "pre_exp012_llava_ov_mapstyle_dataloader" wandb_mode = "online" -upload_reproducible_setup = false # → config.upload_reproducible_setup. OSS: no S3 upload; set true only with S3 configured. [model] attn_implementation = "cosmos" diff --git a/examples/toml/sft_config/videophy2_sft_nano.toml b/examples/toml/sft_config/videophy2_sft_nano.toml index 7cd363bc..35b8e785 100644 --- a/examples/toml/sft_config/videophy2_sft_nano.toml +++ b/examples/toml/sft_config/videophy2_sft_nano.toml @@ -20,7 +20,6 @@ project = "cosmos3" group = "vlm_videophy2_sft" name = "videophy2_sft_nano" wandb_mode = "disabled" -upload_reproducible_setup = false # → config.upload_reproducible_setup. OSS: no S3 upload; set true only with S3 configured. [model] attn_implementation = "cosmos" diff --git a/examples/toml/sft_config/vision_sft_nano.toml b/examples/toml/sft_config/vision_sft_nano.toml index 66da45f8..dbb192dc 100644 --- a/examples/toml/sft_config/vision_sft_nano.toml +++ b/examples/toml/sft_config/vision_sft_nano.toml @@ -12,7 +12,6 @@ project = "cosmos3" group = "sft" name = "vision_sft_nano" wandb_mode = "disabled" -upload_reproducible_setup = false # → config.upload_reproducible_setup. OSS: no S3 upload; set true only with S3 configured. [model] max_num_tokens_after_packing = 45056 diff --git a/examples/toml/sft_config/vision_sft_nano_mapstyle_dataloader.toml b/examples/toml/sft_config/vision_sft_nano_mapstyle_dataloader.toml index 04449a99..5d76be8b 100644 --- a/examples/toml/sft_config/vision_sft_nano_mapstyle_dataloader.toml +++ b/examples/toml/sft_config/vision_sft_nano_mapstyle_dataloader.toml @@ -20,7 +20,6 @@ project = "cosmos3" group = "sft" name = "vision_sft_nano_mapstyle_dataloader" wandb_mode = "disabled" -upload_reproducible_setup = false # → config.upload_reproducible_setup. OSS: no S3 upload; set true only with S3 configured. [model] max_num_tokens_after_packing = 45056 diff --git a/examples/toml/sft_config/vision_sft_super.toml b/examples/toml/sft_config/vision_sft_super.toml index 57219499..06a1574a 100644 --- a/examples/toml/sft_config/vision_sft_super.toml +++ b/examples/toml/sft_config/vision_sft_super.toml @@ -12,7 +12,6 @@ project = "cosmos3" group = "sft" name = "vision_sft_super" wandb_mode = "disabled" -upload_reproducible_setup = false # → config.upload_reproducible_setup. OSS: no S3 upload; set true only with S3 configured. [model] max_num_tokens_after_packing = 45056