vla / workspace /docs /experiments.md
anhtld's picture
auto-sync 2026-07-02T13:37:00Z workspace
d84195e verified
|
Raw
History Blame
5.8 kB
# Experiments
Experiments in DoVLA-CIL focus on whether same-state counterfactual interventions improve action
selection, effect prediction, language controllability, and robustness.
## CausalStress
CausalStress generates controlled toy-backend groups across:
- `minimal_language_change`
- `wrong_target_distractor`
- `near_miss_boundary`
- `physics_shift_placeholder`
- `effect_query`
- `counterfactual_ranking`
- `similar_distractors`
- `spatial_relation_minimal_pairs`
- `negation_and_avoidance`
- `sequential_tasks`
- `irreversible_failure`
- `physics_perturbation_placeholders`
Harder families include red mug vs red cup, blue bowl vs blue plate, same category/different color,
same color/different category, left/right, inside/next-to, behind/front, negation, sequential
skills, out-of-workspace failures, low friction, heavy objects, and sticky drawers.
Metrics:
- `task_success_rate`
- `instruction_switch_accuracy`
- `pairwise_ranking_accuracy`
- `top1_action_selection`
- `ndcg_at_k`
- `effect_prediction_mae`
- `success_prediction_accuracy`
- `regret_calibration_error`
- per-category success, instruction switch, and failure rate
- target-selection confusion matrices
Run:
```bash
python scripts/eval_causalstress.py \
--checkpoint runs/dovla_toy/best.pt \
--backend toy \
--out runs/dovla_toy/causalstress.json \
--num-tasks 20 \
--k 16
```
## Scaling Over K
Scaling experiments keep total record budget fixed as `B = N * K`. For each `K`, the runner chooses
`N = total_records // K`, generates a toy CIL dataset, trains DoVLA, evaluates CausalStress, writes
per-run metrics, aggregates CSVs, creates plots, and fits:
```text
score = alpha + beta_log_k * log(K)
```
Run:
```bash
python scripts/run_scaling.py \
--backend toy \
--tasks builtins \
--out runs/scaling_toy \
--total-records 4096 \
--k-values 1,2,4,8,16,32 \
--epochs 3 \
--seed 0
```
## Baselines
```bash
python scripts/run_baseline.py \
--baseline expert_only_bc \
--dataset data/cil_toy \
--out runs/baselines/expert_only_bc
```
Modes:
- `expert_only_bc`: one best/expert action per group; no ranking/regret.
- `more_independent_demos`: K=1-style independent demonstration comparison.
- `random_negatives`: structured candidates replaced by random-negative labels.
- `cross_state_negatives`: matched-budget reward-ordered pairs from different states of the same
task; this tests whether exact same-state cancellation matters.
- `label_only_counterfactual`: heuristic labels without measured outcomes.
- `world_model_auxiliary`: effect/progress/success auxiliary losses without ranking/regret.
- `no_effect_head`: effect loss removed.
- `no_rank_regret`: ranking and regret removed.
## Reports
Dataset report:
```bash
python scripts/report_dataset.py --dataset data/cil_toy --out reports/cil_toy
```
Evaluation report:
```bash
python scripts/report_eval.py \
--inputs "runs/scaling_toy/*/metrics.json" \
--out reports/scaling_toy
```
Paper artifacts:
```bash
python scripts/make_paper_artifacts.py --runs runs --out paper_artifacts
```
The paper artifact script writes scaling, baseline, ablation, and per-category tables, plus figures
for performance vs K, same-state vs cross-state ranking, physical-outcome vs label-only, success by
failure category, and regret calibration.
## Optional TransferCritic Studies
TransferCritic is a secondary data-curation module for selecting CIL records or groups under a
budget. It compares random, top-reward, task-balanced, and set-conditioned utility selections. See
`docs/transfercritic.md`.
## Optional Retrieval Studies
Critic-gated retrieval is an inference-time extension for retrieving successful, near-miss, and
partial-success CIL exemplars. It compares no retrieval, nearest-neighbor, success-only,
success/failure contrastive, and critic-gated retrieval. See `docs/retrieval.md`.
## Configs
Reproducible YAML configs live under:
- `configs/toy/`
- `configs/baselines/`
- `configs/large/`
The loader supports environment expansion, CLI overrides, and saving resolved configs into run
directories.
## Large-Scale Manifests
Large multi-stage experiment manifests live under `manifests/`:
- `cil_160m.yaml`
- `cil_1b_template.yaml`
- `scaling_k_sweep.yaml`
- `baselines_full.yaml`
Plan a manifest without executing jobs:
```bash
python scripts/run_manifest.py manifests/scaling_k_sweep.yaml --dry-run
```
Emit generic Slurm scripts and save a resolved manifest:
```bash
python scripts/run_manifest.py \
manifests/cil_160m.yaml \
--dry-run \
--emit-slurm \
--out runs/cil_160m_plan
```
The manifest runner redacts secret-looking fields and never emits API keys into planned commands.
Manifests are validated before any files are written: positive record counts, training duration,
loss weights, and unique positive K values are checked locally. Slurm resources use the optional
`scheduler` manifest section and may be overridden while emitting scripts with
`DOVLA_PARTITION`, `DOVLA_ACCOUNT`, `DOVLA_CPUS_PER_TASK`, `DOVLA_GPUS_PER_TASK`,
`DOVLA_MEM`, `DOVLA_TIME`, and `DOVLA_LOG_DIR`. These values are resolved into literal
`#SBATCH` directives because Slurm does not expand shell expressions in directive lines.
Backend planning is explicit. Toy manifests call `generate_cil.py` and may be run with
`--execute-local`. ManiSkill manifests call `generate_maniskill_lattice.py`, multiply
`num_tasks * num_states_per_task` into the physical state-group count, and require
`simulator_params.demo_path` (normally supplied through `MANISKILL_DEMO_PATH`). Genesis remains
a visible placeholder until a task-specific measured-intervention adapter exists. Training loss
weights are forwarded as repeated `--loss-weight NAME=VALUE` arguments and are saved again in the
trainer's resolved config.