Distribute Arena Experiment Runs with exact outputs#929
Conversation
🤖 Isaac Lab-Arena Review BotSummaryThis PR fans a Pi0 Arena Experiment out into one independently scheduled OSMO group per Run (each Pi0 Run getting its own dedicated policy-server task), plus a CPU-only aggregation group that stages every runner’s workflow-local output and builds one combined Design, Boundaries & Scope
Findings🔵 Improvement: osmo/workflows/arena_experiment_workflow.py:24 — Test CoverageStrong. New VerdictShip it — the one design note (vestigial |
Greptile SummaryThis PR distributes Arena Experiment Runs across independently scheduled OSMO groups: each Run gets its own OSMO group (plus a dedicated Pi0 policy-server task for Pi0 Runs), and a final CPU-only aggregation group copies per-run outputs and generates one combined
Confidence Score: 3/5The run-distribution logic is well-tested and the CLI change is backward-compatible, but the aggregation task embeds OSMO template tokens inside a JSON file that the Python script reads as paths — if OSMO does not resolve tokens in arbitrary file contents, the aggregation step will always fail at runtime. The per-run group fanout, Pi0 server pairing, and --experiment_output_directory plumbing are all correct and thoroughly unit-tested. The aggregation design in ExperimentResultsTask introduces an unverified assumption: {{input:...}} OSMO tokens are written into a JSON file via files[].contents, and aggregate_experiment_results.py reads those values as filesystem paths. Whether OSMO resolves template tokens in all files[].contents entries — not only the recognized entry script — is critical to the design but is not documented or tested end-to-end. If the assumption does not hold, every distributed experiment run will fail at the aggregation step. osmo/tasks/experiment_results_task.py — specifically the _get_files_to_create method that embeds {{input:...}} tokens into the JSON mapping file. Important Files Changed
Sequence Diagram%%{init: {'theme': 'neutral'}}%%
sequenceDiagram
participant S as Submit Script
participant W as Pi0ArenaExperimentWorkflow
participant RG0 as OSMO Group: arena-run-0
participant RG1 as OSMO Group: arena-run-1
participant RGN as OSMO Group: arena-run-N (local policy)
participant AG as OSMO Group: arena-aggregation
S->>W: submit_workflow()
W->>W: _get_group_dicts() — one group per Run
W->>RG0: "group {experiment-runner-0 (lead), policy-server-0}"
W->>RG1: "group {experiment-runner-1 (lead), policy-server-1}"
W->>RGN: "group {experiment-runner-N (lead, no server)}"
W->>AG: "group {aggregate-results (lead, resource=aggregation, gpu=0)}"
Note over RG0: experiment-runner-0 writes
Note over RG1: experiment-runner-1 writes
Note over RGN: experiment-runner-N writes
RG0-->>AG: OSMO stages input:experiment-runner-0
RG1-->>AG: OSMO stages input:experiment-runner-1
RGN-->>AG: OSMO stages input:experiment-runner-N
AG->>AG: aggregate_experiment_results.py copies run dirs
AG->>AG: build_report → index.html
AG->>AG: publish output to Swift
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
sequenceDiagram
participant S as Submit Script
participant W as Pi0ArenaExperimentWorkflow
participant RG0 as OSMO Group: arena-run-0
participant RG1 as OSMO Group: arena-run-1
participant RGN as OSMO Group: arena-run-N (local policy)
participant AG as OSMO Group: arena-aggregation
S->>W: submit_workflow()
W->>W: _get_group_dicts() — one group per Run
W->>RG0: "group {experiment-runner-0 (lead), policy-server-0}"
W->>RG1: "group {experiment-runner-1 (lead), policy-server-1}"
W->>RGN: "group {experiment-runner-N (lead, no server)}"
W->>AG: "group {aggregate-results (lead, resource=aggregation, gpu=0)}"
Note over RG0: experiment-runner-0 writes
Note over RG1: experiment-runner-1 writes
Note over RGN: experiment-runner-N writes
RG0-->>AG: OSMO stages input:experiment-runner-0
RG1-->>AG: OSMO stages input:experiment-runner-1
RGN-->>AG: OSMO stages input:experiment-runner-N
AG->>AG: aggregate_experiment_results.py copies run dirs
AG->>AG: build_report → index.html
AG->>AG: publish output to Swift
|
c668507 to
f94eb15
Compare
2c82715 to
004ae32
Compare
351cd05 to
e92abed
Compare
Signed-off-by: Clemens Volk <cvolk@nvidia.com>
Signed-off-by: Clemens Volk <cvolk@nvidia.com>
Split run and aggregation group creation into focused helpers. Use explicit names for task, resource, and configuration values. Signed-off-by: Clemens Volk <cvolk@nvidia.com>
Pass canonical Run directories from OSMO to a generic aggregator instead of discovering results by filename. Keep the OSMO adapter responsible for translating task outputs into exact Run paths. Signed-off-by: Clemens Volk <cvolk@nvidia.com>
Keep the straightforward Run-directory composition visible in the OSMO adapter and aggregator instead of sharing a behavior-free helper. Signed-off-by: Clemens Volk <cvolk@nvidia.com>
Discover each Run below its staged Experiment Runner output before aggregation. Keep OSMO staging and serialization concerns out of the generic Run output aggregator. Signed-off-by: Clemens Volk <cvolk@nvidia.com>
The output-copying operation currently has only one caller. Keep it next to the staged-output resolver and consolidate its coverage in the OSMO end-to-end test instead of presenting it as a reusable Arena API. Signed-off-by: Clemens Volk <cvolk@nvidia.com>
Distinguish workflow-local runner outputs from externally published output. Document the per-Run staged directory contract and the final Experiment layout built by the CPU task. Signed-off-by: Clemens Volk <cvolk@nvidia.com>
Use separate terms for OSMO's staged task view, each runner's timestamped Experiment output, and the final combined Experiment directory. Signed-off-by: Clemens Volk <cvolk@nvidia.com>
Separate the workflow-construction task definition from the Python program embedded and executed inside the final OSMO task. Signed-off-by: Clemens Volk <cvolk@nvidia.com>
Signed-off-by: Clemens Volk <cvolk@nvidia.com>
Signed-off-by: Clemens Volk <cvolk@nvidia.com>
Signed-off-by: Clemens Volk <cvolk@nvidia.com>
Signed-off-by: Clemens Volk <cvolk@nvidia.com>
Signed-off-by: Clemens Volk <cvolk@nvidia.com>
Keep the unresolved legacy chunk output behavior explicit while validating and creating the selected output directory before starting Isaac Sim. Signed-off-by: Clemens Volk <cvolk@nvidia.com>
Name the final OSMO task and runtime script after their actual responsibility: copying staged Run directories into one Experiment output and generating its report. Signed-off-by: Clemens Volk <cvolk@nvidia.com>
Use concrete Experiment Runner output terminology at the OSMO boundary. Reserve collection for copying Run directories and building for producing the complete Experiment output and report. Signed-off-by: Clemens Volk <cvolk@nvidia.com>
Leave the GR00T and OpenPI quickstarts focused on local execution. Document the complete OSMO workflow separately in a follow-up. Signed-off-by: Clemens Volk <cvolk@nvidia.com>
Signed-off-by: Clemens Volk <cvolk@nvidia.com>
e92abed to
91f22cb
Compare
Signed-off-by: Clemens Volk <cvolk@nvidia.com>
Require each task instance to receive an explicit name and keep host references tied to workflow topology. Rename the output-collection task to reflect its role. Signed-off-by: Clemens Volk <cvolk@nvidia.com>
Signed-off-by: Clemens Volk <cvolk@nvidia.com>
Signed-off-by: Clemens Volk <cvolk@nvidia.com>
Summary
Run every Arena Run independently on OSMO and publish one Experiment report.
Detailed description
--output_base_dirbehavior used by existing local commands. OSMO instead passes--experiment_output_directoryso each Experiment Runner writes to the exact directory owned by its task.build-experiment-outputtask collects the Run directories, generatesindex.html, and publishes one complete Experiment output. If any Run fails, the workflow fails and no combined report is published; retries and partial reports remain out of scope.Run it on OSMO
This submits the nine Runs in the OpenPI Experiment. The Experiment Runner uses the default
nvcr.io/nvstaging/isaac-amr/isaaclab_arena:latestimage./isaac-sim/python.sh -m osmo.submit_arena_experiment \ --experiment_cfg isaaclab_arena_environments/experiment_configs/droid_pnp_srl_openpi_experiment.yaml \ --policy_server pi0 \ osmo.workflow_name=arena-parallel-test \ osmo.pool=isaac-dev-l40-03 \ osmo.platform=ovx-l40 \ osmo.memory=120Gi \ experiment_runner.image=nvcr.io/nvstaging/isaac-amr/isaaclab_arena:osmo_parallel