leepanic commited on
Commit
ad34f4c
·
verified ·
1 Parent(s): 0a042d9

add experiment_cfg/train_config.yaml

Browse files
Files changed (1) hide show
  1. 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