defaults: - system: go2 - model: quadruped_world_model - loss: world_model - heads: all - _self_ run_name: data: dataset_name: num_train_workers: 8 num_test_workers: 4 prefetch_factor: 2 # Reference dataset size the run's "realised paper-scale fraction" is taken # against, logged as part of the run fingerprint. It is a config value rather # than a constant in code because "the paper's scale" is a claim about a # specific table, and a claim like that should be visible and editable. paper_scale_steps: 25000000 training: num_epochs: 2 max_steps: # will train until num_epochs, or max_steps (if given), whichever is first eval_interval: 10000 # evaluates and checkpoints at this interval learning_rate: 0.0002 warmup_steps: 10000 decay_steps: 400000 end_learning_rate: 0.0001 batch_size: 512 training_data_ratio: 0.998 # portion of dataset to use for training; the rest is used for evaluation seed: 42 # Clip gradients to this global norm. Null is upstream's and the paper's # behaviour: `grad_norm` is logged, never applied. See bead UWLab-436.19 -- # the manipulation run diverges without it, and clipping bounds the rate of # the runaway while `model.encoder.latent_norm` removes its cause. grad_clip_norm: checkpoint: # create a checkpoint in this directory with the given run name, if resume_checkpoint is not set enabled: True # keeps this many most recent checkpoints; leave blank to keep all max_to_keep: 3 # if non-empty, resume from this checkpoint resume_checkpoint: # Read-only diagnostics run at every `training.eval_interval`. Nothing under # this block can change the training gradient: every forward it does is # `deterministic=True` and none of it owns an optimizer over the world model. eval: # Held-out batches folded into the streaming metrics (reward/value r2, latent # rollout error, BC error, latent variance). Bounded so the diagnostics cost # does not scale with the size of the test split. max_batches: 8 # Points kept for the predicted-vs-actual next-latent scatter. scatter_points: 5000 episodes: # The episode-level probe: `eval/value_auc_success` and the paper's Fig. 5 # curves. Disables itself with a printed reason when the processed dataset # has no `episode_ids.hdf5` (the quadruped processor writes none). enabled: True # Whole episodes to reserve from BOTH splits, so the AUC has no step-level # leak. 0 keeps upstream's chunk-level `random_split` bit-identical, at the # cost of an AUC measured on episodes the model has seen other steps of. holdout: 0 num_auc_episodes: 32 num_curve_episodes: 4 # Where in an episode the "matched timestep" sits. Matched by PROGRESS, not # by absolute step: a successful insertion terminates early, so comparing at # absolute step k would measure episode length rather than value. match_frac: 0.5 # Every n-th held-out chunk along a Fig. 5 curve. curve_stride: 5 batch_size: 32 success: # The processed dataset carries no success flag, so the label is derived. # `episode_return` | `final_reward`. metric: episode_return # Null splits at the median of the probed episodes -- needs no knowledge # of the reward scale and balances the classes, but is not comparable # across runs. Set an absolute value once a generation run's reward scale # is known. threshold: diagnostics: # PNG + npz written to //step_/ at every eval. enabled: True dirname: diagnostics decoder_probe: # OPTIONAL and VISUALISATION ONLY (paper Fig. 9). A separate MLP with its # own optimizer, fed stop_gradient latents. It is never a training loss: # paper Table I measures reconstruction-as-an-objective at 0.90 -> 0.32 # manipulation success. enabled: False hidden_size: 128 learning_rate: 0.001 steps_per_eval: 20 wandb: # METRICS ONLY. No artifacts, no checkpoint upload, no source snapshot -- # checkpoints stay on local disk and are moved to Drive/HF by hand at the end. # Enforced in code by simdist/utils/wandb_utils.py and by # tests/test_wandb_metrics_only.py, which fails if an upload API appears # anywhere in the package. log: False project: simdist_train_model entity: # online | offline | disabled mode: online # Local wandb run directory; null uses wandb's default (./wandb). dir: