add experiment_cfg/train_config.yaml
Browse files- experiment_cfg/train_config.yaml +111 -0
experiment_cfg/train_config.yaml
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# GR00T N1.7 CubeStack 3-CLIENT FL arm — the GR00T twin of
|
| 2 |
+
# smolvla_cubestack_fl_3client.yaml / pi05_cubestack_fl_3client.yaml.
|
| 3 |
+
#
|
| 4 |
+
# SAME colour-pair non-IID partition as those two arms (each client owns one
|
| 5 |
+
# colour pair, both stacking directions, on its OWN robot, blind to the 3rd
|
| 6 |
+
# colour):
|
| 7 |
+
# c0 (harry, bare Cube_*) Green/Orange -> blind to Blue
|
| 8 |
+
# c1 (zhekai, _manuka) Green/Blue -> blind to Orange
|
| 9 |
+
# c2 (kevin, _kevin) Orange/Blue -> blind to Green
|
| 10 |
+
# Expressed with the `explicit_tasks` scheme (each CubeStack dataset carries
|
| 11 |
+
# exactly one distinct task string), so the split is DECLARED rather than
|
| 12 |
+
# derived from task_round_robin's seeded shuffle — it must reproduce the other
|
| 13 |
+
# two policies' split exactly.
|
| 14 |
+
#
|
| 15 |
+
# SCOPE: action-head-only (~1.62B federated) — backbone frozen
|
| 16 |
+
# (tune_llm/tune_visual false). This is NVIDIA's own new-embodiment recipe
|
| 17 |
+
# (train projector + diffusion head) and matches every GR00T row in the paper.
|
| 18 |
+
# `tune_projector` stays ON by default and MUST NOT be disabled: the embodiment
|
| 19 |
+
# projector slot ships at random init for any non-posttrained embodiment.
|
| 20 |
+
#
|
| 21 |
+
# DATA: the Cube_* repos are LeRobot v3.0, which GR00T's loader cannot read
|
| 22 |
+
# (it requires v2.x meta/episodes.jsonl + per-episode parquet/mp4). These paths
|
| 23 |
+
# point at the v2.1 conversion produced by
|
| 24 |
+
# `scripts/convert_cubestack_v30_to_v21.py` (see slurm/convert_cubestack_groot.sh).
|
| 25 |
+
#
|
| 26 |
+
# RUNTIME: flower, NOT LocalRunner — multi-client GR00T on one node OOMs the
|
| 27 |
+
# 115GB host at the client-to-client transition (measured, job 5473891).
|
| 28 |
+
name: groot_cubestack_fl3_fedavg_headonly
|
| 29 |
+
seed: 42
|
| 30 |
+
device: auto
|
| 31 |
+
|
| 32 |
+
backend:
|
| 33 |
+
name: groot
|
| 34 |
+
pretrained_path: nvidia/GR00T-N1.7-3B
|
| 35 |
+
optim:
|
| 36 |
+
name: adamw
|
| 37 |
+
lr: 1.0e-4
|
| 38 |
+
weight_decay: 1.0e-5
|
| 39 |
+
betas: [0.9, 0.95]
|
| 40 |
+
scheduler: cosine
|
| 41 |
+
warmup_steps: 1000
|
| 42 |
+
decay_steps: 12500 # per-client budget: 50 rounds x 250 local steps
|
| 43 |
+
decay_lr: 1.0e-5
|
| 44 |
+
extra:
|
| 45 |
+
embodiment_tag: NEW_EMBODIMENT # SO-101; GR00T ships no config for it -> declared below
|
| 46 |
+
modality_config:
|
| 47 |
+
video:
|
| 48 |
+
delta_indices: [0]
|
| 49 |
+
modality_keys: [front, wrist]
|
| 50 |
+
state:
|
| 51 |
+
delta_indices: [0]
|
| 52 |
+
modality_keys: [single_arm, gripper]
|
| 53 |
+
action:
|
| 54 |
+
delta_indices: 16 # shorthand for list(range(16)) = the action horizon
|
| 55 |
+
modality_keys: [single_arm, gripper]
|
| 56 |
+
language:
|
| 57 |
+
delta_indices: [0]
|
| 58 |
+
modality_keys: [annotation.human.task_description]
|
| 59 |
+
state_dropout_prob: 0.2
|
| 60 |
+
dtype: bfloat16
|
| 61 |
+
gradient_checkpointing: true
|
| 62 |
+
local_files_only: true
|
| 63 |
+
tune_llm: false # action-head-only: backbone frozen
|
| 64 |
+
tune_visual: false
|
| 65 |
+
|
| 66 |
+
data:
|
| 67 |
+
name: groot
|
| 68 |
+
batch_size: 32
|
| 69 |
+
num_workers: 8 # MEASURED: each spawn worker ~4GB baseline (fresh torch+gr00t import); 16 hit the 115GB cap at 87GB
|
| 70 |
+
extra:
|
| 71 |
+
video_backend: pyav
|
| 72 |
+
dataloader_mp_context: spawn # GR00T + CUDA: fork segfaults
|
| 73 |
+
episode_sampling_rate: 1.0
|
| 74 |
+
shard_size: 32
|
| 75 |
+
lazy_episode_datapoints: true # sampling-PRESERVING speed fix (global shuffle intact)
|
| 76 |
+
episode_cache_size: 2 # ~230MB/episode at 256-edge
|
| 77 |
+
prefetch_factor: 2
|
| 78 |
+
# Order matters: `explicit_tasks` maps task name -> client, but list_episodes
|
| 79 |
+
# walks these paths in order to build the global episode index.
|
| 80 |
+
dataset_paths:
|
| 81 |
+
- /lus/lfs1aip2/projects/u6nf/zhekai.u6nf/groot-cubestack-data-256/Cube_Green_on_Orange
|
| 82 |
+
- /lus/lfs1aip2/projects/u6nf/zhekai.u6nf/groot-cubestack-data-256/Cube_Orange_on_Green
|
| 83 |
+
- /lus/lfs1aip2/projects/u6nf/zhekai.u6nf/groot-cubestack-data-256/Cube_Green_on_Blue_manuka
|
| 84 |
+
- /lus/lfs1aip2/projects/u6nf/zhekai.u6nf/groot-cubestack-data-256/Cube_Blue_on_Green_manuka
|
| 85 |
+
- /lus/lfs1aip2/projects/u6nf/zhekai.u6nf/groot-cubestack-data-256/Cube_Orange_on_Blue_kevin
|
| 86 |
+
- /lus/lfs1aip2/projects/u6nf/zhekai.u6nf/groot-cubestack-data-256/Cube_Blue_on_Orange_kevin
|
| 87 |
+
partitioning:
|
| 88 |
+
scheme: explicit_tasks
|
| 89 |
+
num_clients: 3
|
| 90 |
+
seed: 42
|
| 91 |
+
# NOTE kevin's two prompts are phrased differently from harry's/manuka's
|
| 92 |
+
# ("Put orange cube on the blue cube." vs "Put the ... on top of the ...").
|
| 93 |
+
# Kept VERBATIM: the pi0.5 and SmolVLA CubeStack arms trained on these exact
|
| 94 |
+
# strings, and rewording here would break comparability with them.
|
| 95 |
+
client_task_names:
|
| 96 |
+
- ["Put the green cube on top of the orange cube.", "Put the orange cube on top of the green cube."]
|
| 97 |
+
- ["Put the green cube on top of the blue cube.", "Put the blue cube on top of the green cube."]
|
| 98 |
+
- ["Put orange cube on the blue cube.", "Put blue cube on the orange cube."]
|
| 99 |
+
|
| 100 |
+
fl:
|
| 101 |
+
strategy:
|
| 102 |
+
name: fedavg
|
| 103 |
+
rounds: 50
|
| 104 |
+
local_steps: 250
|
| 105 |
+
min_clients: 3
|
| 106 |
+
execution: flower
|
| 107 |
+
save_every_n_rounds: 10
|
| 108 |
+
persist_client_state: true # warm Adam per client; cold Adam every round
|
| 109 |
+
# was a measured GR00T quality gap
|
| 110 |
+
client_state_keep: 2 # ~20GB per client per save; keep the last 2
|
| 111 |
+
output_dir: outputs/groot_cubestack_fl_3client
|