Buckets:
| # Usage | |
| Copy-pasteable path from a fresh checkout to a scored benchmark. Every command assumes the repo root | |
| as cwd. **Always set `OMP_NUM_THREADS=4`** — without it the training loop oversubscribes threads and | |
| slows down by an order of magnitude. | |
| --- | |
| ## 0. Environments | |
| Four separate runtimes; they cannot be merged (conflicting pins). See `envs/README.md`. | |
| | env | file | used for | | |
| |---|---|---| | |
| | `onf-core` | `envs/onf-core.yml` | the `onf` package: graph build/train, artifacts, tests | | |
| | `stablevla` | `envs/stablevla.yml` | the StableVLA policy server | | |
| | libero-plus | via `scripts/setup_external.sh` | the simulator client | | |
| | gr00t | separate conda env, path given by `GR00T_PY` | the GR00T-N1.7 policy server | | |
| ```bash | |
| conda env create -f envs/onf-core.yml | |
| pip install -e . # inside onf-core | |
| bash scripts/setup_external.sh # links LIBERO-plus and the vendored deps into external/ | |
| ``` | |
| Data and checkpoints are **not** downloaded by the setup script. Point the repo at them with: | |
| ```bash | |
| export ONF_DATA=/path/to/data # demo hdf5 + per-suite fwm/ artifacts | |
| export ONF_OUTPUTS=/path/to/outputs # graph artifacts land here | |
| export ONF_RESULTS=/path/to/results # rollout mp4s land here | |
| ``` | |
| `onf.config.Paths` resolves everything from these three; nothing else is hardcoded. | |
| --- | |
| ## 1. Build the demonstration graph | |
| ```bash | |
| OMP_NUM_THREADS=4 python -m onf.graph build --suite long | |
| ``` | |
| Writes `g_nodes.npz` + `g_edges.npz` into `$ONF_OUTPUTS/long/<run>/artifacts/`, and points | |
| `$ONF_OUTPUTS/long/latest` at it. Use `--suite all` for all four suites, or | |
| `--limit-demos 8 --limit-tasks 2` for a fast smoke build. | |
| ## 2. Train the retrieval head | |
| ```bash | |
| OMP_NUM_THREADS=4 python -m onf.graph train --suite long | |
| ``` | |
| Writes `g_head.npz` next to the graph it trained on. Roughly one hour per suite on one GPU. Add | |
| `--epochs 1` for a smoke run. | |
| ## 3. Fit the sentinel artifacts | |
| ```bash | |
| OMP_NUM_THREADS=4 python scripts/build_sentinel_artifacts.py \ | |
| "$ONF_OUTPUTS/long/latest/artifacts" --suite long | |
| ``` | |
| Fits the transition kernel (`π`, `β`, `leak`), the three null banks and the basin geometry into | |
| `g_track.npz`, plus a `sentinel_artifacts.json` provenance sidecar. | |
| > **t=0 needs steps 1–2; t>0 needs 1–3.** A missing `g_track.npz` is a hard error at launch, not a | |
| > silent fallback. Today only `long` has a trained head and a fitted tracker; `object`, `spatial` and | |
| > `goal` need steps 2–3 run once each before they can be benchmarked. | |
| --- | |
| ## 4. Benchmark | |
| Three modes exist, and only three: `base` (frozen policy, no recovery), `entry` (t=0), `sentinel` | |
| (t>0). They are defined in one place, `evals/common/modes.sh`. | |
| Result and log names share one grammar: | |
| ``` | |
| results/plus_{bench}/{axis}/{policy}_{mode}_{suite}_{axis}/ # rollout mp4s + run.json | |
| logs/{utc_timestamp}_{policy}_{mode}_{suite}_{axis}/ # server.log + client_shard*.log | |
| ``` | |
| ### StableVLA | |
| ```bash | |
| # smoke first (12 episodes per regime) | |
| OMP_NUM_THREADS=4 python scripts/run_sr.py --rung R1 --gpus 2,3 | |
| # the full 4 suites x 7 axes grid | |
| OMP_NUM_THREADS=4 python scripts/run_sr.py --rung R4 --gpus 2,3 | |
| ``` | |
| Useful flags: `--dry-run` (print the schedule and exit), `--check-env` (validate paths/ports only), | |
| `--resume` (skip cells already complete in the ledger), `--mode <mode>` (override the per-axis default | |
| from `configs/sr_ladder.yaml`), and `--cells suite:axis[,...]` — on its own it builds ad hoc full-axis | |
| cells; combined with `--rung` it runs a **subset** of that rung, keeping each cell's own episode | |
| filter, expected count, comparators and gate: | |
| ```bash | |
| # just the two `long` smoke cells (12 episodes each), one per regime | |
| python scripts/run_sr.py --rung R1 --cells long:Robot_Initial_States,long:Sensor_Noise --gpus 2,3 | |
| ``` | |
| ### GR00T-N1.7 | |
| ```bash | |
| GR00T_PY=/path/to/gr00t/env/bin/python \ | |
| OMP_NUM_THREADS=4 python evals/gr00t/run_gr00t.py \ | |
| --suites object,spatial,goal,long --mode sentinel --gpus 2,3 | |
| ``` | |
| Refuses to start if `g_track.npz` is missing, and refuses to write into a result directory that | |
| already holds rollouts unless `--resume`/`--force` — re-running a cell in place would otherwise leave | |
| both the success and the failure mp4 of a flipped episode and inflate `n`. | |
| ### Score | |
| ```bash | |
| # success-rate grid; --methods takes name:tag_prefix pairs | |
| python evals/libero_plus/score.py --suites long \ | |
| --methods base:stablevla_base entry:stablevla_entry sentinel:stablevla_sentinel | |
| # paired McNemar between two arms of one suite x axis | |
| python evals/libero_plus/mcnemar.py --suite 10 --axis Sensor_Noise \ | |
| --tags stablevla_base_long_Sensor_Noise stablevla_sentinel_long_Sensor_Noise | |
| ``` | |
| McNemar is only meaningful for a **deterministic** policy (StableVLA). GR00T-N1.7 is stochastic | |
| (~11.2% episode churn); compare its arms only within one session, and read the sign, not the digits. | |
| --- | |
| ## 5. Reproducibility | |
| ```bash | |
| OMP_NUM_THREADS=4 PYTHONPATH=src pytest tests/ -q | |
| OMP_NUM_THREADS=4 PYTHONPATH=src pytest tests/test_parity.py -q # must be 2 passed | |
| ``` | |
| `tests/test_parity.py` is the golden bit-parity net: it replays 64 recorded t=0 retrievals and 64 t>0 | |
| tracker steps against the real trained artifacts and asserts every float is **exactly** equal (via | |
| `float.hex()`, not `approx`) to `tests/golden/parity.json`. It skips cleanly when the artifacts are | |
| absent, so a fresh clone never fails it. | |
| Every result directory also carries a `run.json` recording policy, mode, suite, axis, expected | |
| episode count, graph dir, `graph_hash`, head mtime, git commit and the full mode env — so any number | |
| can be traced back to the exact code and artifacts that produced it. | |
| ## GPU etiquette on this box | |
| GPUs 0 and 1 belong to another user. Use `--gpus 2,3` only. | |
Xet Storage Details
- Size:
- 5.76 kB
- Xet hash:
- 38e30ac795062bca59b12f12a766e67792a01e55b8e1ccbe7295649e02b97fc5
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.