Benchmark Config Reference#
A benchmark YAML is a standalone pipeline config plus, optionally, a
benchmark: block. The loader parses the file twice: once as the shared
pipeline config (task: / skills: / llm: / policies: / trials: …)
and once for the benchmark: block, whose presence selects the shape:
Grid mode —
benchmark:present: sweepmodes × (family, variation) × policiescells.Suites mode — no
benchmark:block: the pipeline’s ownsuites:list is the cell axis.
A YAML with neither a benchmark: block nor a suites: list raises at load.
For semantics (gating, resume, outputs, GPU spread) see the
benchmarking guide; for the checked-in
configs see examples/benchmark.
Warning
base: YAML inheritance is rejected with an error — inline every key.
Benchmark YAMLs must be standalone.
Grid mode: the benchmark: block#
benchmark:
families: [posvar]
variations: [pos_var, permutation, basket_swap, all]
modes: [llm_generation, llm_plus_policy, policy_only]
n_tasks: 10
n_seeds: 50
num_workers: 8
policies: []
record_video: false
output_dir: ../../benchmark_runs/posvar
gate_threshold: 0.90
mode_overrides:
llm_plus_policy:
workflow_dir: path/to/steered_policy_template
num_workers: 4
Key |
Type |
Default |
Notes |
|---|---|---|---|
|
list of str |
|
Families to sweep — see Families and variations. Unknown names raise at load. |
|
list of str |
null |
In-family variation filter; null means every variation of each selected family. Unknown names raise at load. |
|
list of str |
all 3 |
Subset of |
|
int |
|
Task count when |
|
list of int |
null |
Explicit task subset; overrides |
|
int |
|
Trials per task. Seed |
|
int |
|
Per-cell parallelism, passed to |
|
list of str |
|
The A/B axis: policy-skill names (e.g. |
|
bool |
|
Record + collate trial videos into |
|
path |
|
Run-dir parent; relative paths resolve against the YAML’s directory. Ignored in suites mode (which uses |
|
float |
|
Wins over a top-level |
|
bool |
|
Parsed and stored but never read by the harness — an inert marker. |
|
mapping |
|
Per-mode knobs, below. |
Families and variations#
Each (family, variation) pair maps to a registered suite; the grid sweeps
the union over the selected families.
Family |
Variation |
Suite |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
The four posvar suites carry 10 tasks × 50 baked init-state rows each
(all is the union of the perturbation kinds). libero_pro deliberately
omits an object variation — it would duplicate libero/object.
mode_overrides.<mode>#
Per-mode overrides of the top-level grid sizing; an omitted key (or null)
inherits the top-level value.
Key |
Type |
Default |
Notes |
|---|---|---|---|
|
int |
inherit |
|
|
int |
inherit |
Throttle policy modes when sharing one inference endpoint (posvar uses |
|
path |
null |
The workflow template directory. Required for |
|
str |
null |
Which policy skill fills the template’s |
|
float |
null |
Parsed but not consumed by any built-in mode — inert. |
|
mapping |
|
Forwarded verbatim to the mode (no built-in mode reads more keys). |
Workflow template placeholders#
Template-driven modes copy workflow_dir per task and substitute {{key}}
tokens in workflow.json:
Placeholder |
Value |
|---|---|
|
Target object phrase parsed from the LIBERO prompt |
|
Same as |
|
Container phrase from the prompt; falls back to |
|
Resolved policy-skill name (e.g. |
Target/container come from matching the prompt against the pick-and-place
grammar pick (up) (the) <target> and place it in (the) <container>. An
unparseable prompt is a hard error only when the template actually contains a
{{target token — a template that only parameterizes {{policy_id}} is fine
with any prompt.
Suites mode: the suites: list#
Without a benchmark: block, each suites: entry is one benchmark cell; all
remaining cells launch concurrently, each bounded by its own num_workers.
task: "auto"
gate_threshold: 0.90
suites:
- suite_name: libero_object_all_variance
task_ids: [0]
task_prompts:
0: "Pick up the alphabet soup can and put it in the basket."
objects:
target: "alphabet soup can with a blue and yellow label"
expected_label: "Alphabet Soup"
shape_hint: "metal cylinder about 7 cm wide, wrapped in a blue-and-yellow label"
num_workers: 1
trials:
trials_per_generation: 50
num_workers: 25
task_timeout_secs: 900
record_video: true
output_dir: ../../benchmark_runs/grocery_acceptance
Per-suite keys (a null override means “use the top-level trials: value”):
Key |
Type |
Default |
Notes |
|---|---|---|---|
|
str |
|
Registered suite name. Duplicate names across entries get |
|
mapping int→str |
|
Per-task language prompts; tasks not listed fall back to |
|
list of int |
null |
Per-suite task subset. |
|
int |
null |
Per-suite trial count override. |
|
int |
null |
Per-suite trial-watchdog override. |
|
int |
null |
Per-suite worker-pool bound; also sets the cell’s GPU device-slot offset (cells are staggered by the cumulative |
|
mapping str→str |
|
Arbitrary string pairs, consumed twice: appended to the codegen prompt as structured object hints, and substituted as |
The objects: keys are free-form; the acceptance config’s convention is
target (the perception phrase), expected_label (the success label), and
shape_hint (a geometry cue) so codegen writes unambiguous perception
prompts for the LIBERO grocery assets.
Suites-mode specifics:
the run dir lives under
trials.output_dir(there is nobenchmark.output_dir);gate_thresholdis read from the top level;--families/--modesCLI flags are rejected (exit 2);policy preflight is skipped — workers boot exactly what each workflow references;
summary rows report mode
llm_generationwith familysuitesand the cell name as the variation.
Validation, rejected and inert keys#
Input |
Behavior |
|---|---|
|
|
Neither |
|
Unknown family / variation / mode |
|
|
Config error. |
Nonexistent |
|
|
Parsed, never read — inert marker. |
|
Parsed, resolved, never consumed — inert. |
Checked-in configs#
Config |
Shape |
What it is |
|---|---|---|
grid |
1 cell: |
|
grid |
4 posvar variations × 3 modes × 10 tasks × 50 seeds, policy modes throttled to 4 workers |
|
suites |
Nightly smoke: tasks 0–1 × 10 trials = 20 trials, gated at 0.9 |
|
suites |
The release gate: 10 curated suites × 50 trials = 500 trials, gated at 0.90 |
See the benchmarking guide for how to run them and read the outputs.