kabilanKB commited on
Commit
7511d13
·
verified ·
1 Parent(s): ead09e0

Add ACT + M3 checkpoint (step 20,000) and model card

Browse files
Files changed (4) hide show
  1. README.md +105 -0
  2. config.json +69 -0
  3. model.safetensors +3 -0
  4. train_config.json +175 -0
README.md ADDED
@@ -0,0 +1,105 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: apache-2.0
3
+ library_name: lerobot
4
+ pipeline_tag: robotics
5
+ tags:
6
+ - LeRobot
7
+ - act
8
+ - yamlab
9
+ - bimanual
10
+ - yam
11
+ - isaac-sim
12
+ - simulation
13
+ - modality-masking
14
+ datasets:
15
+ - kabilanKB/yam_put_pot
16
+ ---
17
+
18
+ # ACT + M3 for bimanual YAM: PutPotOnCooktop
19
+
20
+ An [ACT](https://arxiv.org/abs/2304.13705) policy for the simulated bimanual YAM robot, trained
21
+ on [`kabilanKB/yam_put_pot`](https://huggingface.co/datasets/kabilanKB/yam_put_pot) with M3
22
+ modality masking, adapted from "Robust Bimanual Vision-Language-Action Models via Embarrassingly
23
+ Simple Modality Masking" ([arXiv 2608.22419](https://arxiv.org/abs/2608.22419)).
24
+
25
+ The task is PutPotOnCooktop in Isaac Sim 6 / Isaac Lab 3: both arms grasp a pot by its handles,
26
+ lift it and place it on a cooktop.
27
+
28
+ Code: [kabilankb/Isaac-Lab-3-and-add-SO-101-leader-teleoperation](https://github.com/kabilankb/Isaac-Lab-3-and-add-SO-101-leader-teleoperation)
29
+ (see `ACT_M3.md`).
30
+
31
+ > **This is an early research checkpoint.** It completes the task in roughly one episode in
32
+ > four, and M3 masking showed no measurable benefit over plain ACT in the evaluation below.
33
+
34
+ ## Model
35
+
36
+ | | |
37
+ |---|---|
38
+ | Inputs | Three 320×240 RGB cameras (`top_rgb`, `left_rgb`, `right_rgb`) and the 14-value joint state |
39
+ | Output | Chunk of 100 actions × 14 joint-position targets (6 joints + gripper per arm) |
40
+ | Backbone | ImageNet-pretrained ResNet-18, shared across cameras |
41
+ | Transformer | 4 encoder layers, 4 decoder layers, width 512, 8 heads, VAE latent 32 |
42
+ | Size | 68M parameters |
43
+
44
+ M3 is applied during training only; this checkpoint is an ordinary ACT checkpoint.
45
+
46
+ - **Wrist-camera masking:** for 30% of training samples, both wrist cameras are hidden from
47
+ attention together. The top camera is never hidden.
48
+ - **Query masking:** each of the 100 action queries is hidden from the others with probability
49
+ 0.1, and the visible ones are rescaled by 1/0.9.
50
+ - The paper's language masking does not apply, since ACT has no language input.
51
+
52
+ ## Training
53
+
54
+ | | |
55
+ |---|---|
56
+ | Data | `kabilanKB/yam_put_pot`: 20 MimicGen episodes, 7,779 frames at 30 FPS, domain randomization on |
57
+ | Steps / batch size | 20,000 / 32 (about 82 passes over the data) |
58
+ | Optimizer | AdamW, learning rate 1e-5 |
59
+ | Seed | 1000 (single run) |
60
+ | Final training loss | 0.041 |
61
+
62
+ ## Evaluation
63
+
64
+ PutPotOnCooktop-v0 with `pot_000` / `cooktop_000`, plain scene (no domain randomization),
65
+ 25 actions executed per prediction, 900-step limit, 50 episodes, 10 parallel environments.
66
+
67
+ | Model | Full task succeeded | Pot lifted |
68
+ |---|---|---|
69
+ | ACT + M3 (this checkpoint) | 11 of 50 (22%) | 13 of 50 (26%) |
70
+ | Plain ACT, same settings | 12 of 50 (24%) | 15 of 50 (30%) |
71
+
72
+ - The two models are indistinguishable on this test.
73
+ - The rates are slightly optimistic: the run stopped at the first 50 finished episodes, and
74
+ successes finish sooner than timeouts.
75
+ - Not tested: randomized or cluttered scenes, which is where the paper claims M3 helps.
76
+ - The dataset is small (two demonstrations per pot and cooktop pair); more data is the most
77
+ likely way to raise the success rate.
78
+
79
+ ## Usage
80
+
81
+ Requires the LeRobot v2.0 fork used by YAMLab (`RogerDAI1217/lerobot`, branch `lerobotv2.0`).
82
+ Its `config.json` has no `type` key, so pass the config explicitly:
83
+
84
+ ```python
85
+ import draccus
86
+ from huggingface_hub import snapshot_download
87
+ from lerobot.common.policies.act.configuration_act import ACTConfig
88
+ from lerobot.common.policies.act.modeling_act import ACTPolicy
89
+
90
+ ckpt = snapshot_download("kabilanKB/yam_put_pot_act_m3")
91
+ with draccus.config_type("json"):
92
+ config = draccus.parse(ACTConfig, f"{ckpt}/config.json", args=[])
93
+ config.n_action_steps = 25
94
+ policy = ACTPolicy.from_pretrained(ckpt, config=config)
95
+ ```
96
+
97
+ To run it in the simulator, download the checkpoint and use `scripts/eval/eval_act.py` from the
98
+ code repository:
99
+
100
+ ```bash
101
+ D=yamlab_datasets/tasks_data/PutPotOnCooktop/objects
102
+ python scripts/eval/eval_act.py --checkpoint <downloaded folder> --n_action_steps 25 \
103
+ --task PutPotOnCooktop-v0 --asset pot=$D/Pot/pot_000 --asset cooktop=$D/Cooktop/cooktop_000 \
104
+ --num_episodes 5 --enable_gripper_clamp --enable_cameras --viz kit
105
+ ```
config.json ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "n_obs_steps": 1,
3
+ "normalization_mapping": {
4
+ "VISUAL": "MEAN_STD",
5
+ "STATE": "MEAN_STD",
6
+ "ACTION": "MEAN_STD"
7
+ },
8
+ "input_features": {
9
+ "observation.state": {
10
+ "type": "STATE",
11
+ "shape": [
12
+ 14
13
+ ]
14
+ },
15
+ "observation.images.top_rgb": {
16
+ "type": "VISUAL",
17
+ "shape": [
18
+ 3,
19
+ 240,
20
+ 320
21
+ ]
22
+ },
23
+ "observation.images.left_rgb": {
24
+ "type": "VISUAL",
25
+ "shape": [
26
+ 3,
27
+ 240,
28
+ 320
29
+ ]
30
+ },
31
+ "observation.images.right_rgb": {
32
+ "type": "VISUAL",
33
+ "shape": [
34
+ 3,
35
+ 240,
36
+ 320
37
+ ]
38
+ }
39
+ },
40
+ "output_features": {
41
+ "action": {
42
+ "type": "ACTION",
43
+ "shape": [
44
+ 14
45
+ ]
46
+ }
47
+ },
48
+ "chunk_size": 100,
49
+ "n_action_steps": 100,
50
+ "vision_backbone": "resnet18",
51
+ "pretrained_backbone_weights": "ResNet18_Weights.IMAGENET1K_V1",
52
+ "replace_final_stride_with_dilation": false,
53
+ "pre_norm": false,
54
+ "dim_model": 512,
55
+ "n_heads": 8,
56
+ "dim_feedforward": 3200,
57
+ "feedforward_activation": "relu",
58
+ "n_encoder_layers": 4,
59
+ "n_decoder_layers": 4,
60
+ "use_vae": true,
61
+ "latent_dim": 32,
62
+ "n_vae_encoder_layers": 4,
63
+ "temporal_ensemble_coeff": null,
64
+ "dropout": 0.1,
65
+ "kl_weight": 10.0,
66
+ "optimizer_lr": 1e-05,
67
+ "optimizer_weight_decay": 0.0001,
68
+ "optimizer_lr_backbone": 1e-05
69
+ }
model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:5300c356ad22abe27869d5fa8cff56c28ef51f39d572851d717cb1861c22d340
3
+ size 271391216
train_config.json ADDED
@@ -0,0 +1,175 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "dataset": {
3
+ "repo_id": "yam_put_pot",
4
+ "episodes": null,
5
+ "image_transforms": {
6
+ "enable": false,
7
+ "max_num_transforms": 3,
8
+ "random_order": false,
9
+ "tfs": {
10
+ "brightness": {
11
+ "weight": 1.0,
12
+ "type": "ColorJitter",
13
+ "kwargs": {
14
+ "brightness": [
15
+ 0.8,
16
+ 1.2
17
+ ]
18
+ }
19
+ },
20
+ "contrast": {
21
+ "weight": 1.0,
22
+ "type": "ColorJitter",
23
+ "kwargs": {
24
+ "contrast": [
25
+ 0.8,
26
+ 1.2
27
+ ]
28
+ }
29
+ },
30
+ "saturation": {
31
+ "weight": 1.0,
32
+ "type": "ColorJitter",
33
+ "kwargs": {
34
+ "saturation": [
35
+ 0.5,
36
+ 1.5
37
+ ]
38
+ }
39
+ },
40
+ "hue": {
41
+ "weight": 1.0,
42
+ "type": "ColorJitter",
43
+ "kwargs": {
44
+ "hue": [
45
+ -0.05,
46
+ 0.05
47
+ ]
48
+ }
49
+ },
50
+ "sharpness": {
51
+ "weight": 1.0,
52
+ "type": "SharpnessJitter",
53
+ "kwargs": {
54
+ "sharpness": [
55
+ 0.5,
56
+ 1.5
57
+ ]
58
+ }
59
+ }
60
+ }
61
+ },
62
+ "local_files_only": true,
63
+ "use_imagenet_stats": false,
64
+ "video_backend": "pyav"
65
+ },
66
+ "env": null,
67
+ "policy": {
68
+ "type": "act",
69
+ "n_obs_steps": 1,
70
+ "normalization_mapping": {
71
+ "VISUAL": "MEAN_STD",
72
+ "STATE": "MEAN_STD",
73
+ "ACTION": "MEAN_STD"
74
+ },
75
+ "input_features": {
76
+ "observation.state": {
77
+ "type": "STATE",
78
+ "shape": [
79
+ 14
80
+ ]
81
+ },
82
+ "observation.images.top_rgb": {
83
+ "type": "VISUAL",
84
+ "shape": [
85
+ 3,
86
+ 240,
87
+ 320
88
+ ]
89
+ },
90
+ "observation.images.left_rgb": {
91
+ "type": "VISUAL",
92
+ "shape": [
93
+ 3,
94
+ 240,
95
+ 320
96
+ ]
97
+ },
98
+ "observation.images.right_rgb": {
99
+ "type": "VISUAL",
100
+ "shape": [
101
+ 3,
102
+ 240,
103
+ 320
104
+ ]
105
+ }
106
+ },
107
+ "output_features": {
108
+ "action": {
109
+ "type": "ACTION",
110
+ "shape": [
111
+ 14
112
+ ]
113
+ }
114
+ },
115
+ "chunk_size": 100,
116
+ "n_action_steps": 100,
117
+ "vision_backbone": "resnet18",
118
+ "pretrained_backbone_weights": "ResNet18_Weights.IMAGENET1K_V1",
119
+ "replace_final_stride_with_dilation": false,
120
+ "pre_norm": false,
121
+ "dim_model": 512,
122
+ "n_heads": 8,
123
+ "dim_feedforward": 3200,
124
+ "feedforward_activation": "relu",
125
+ "n_encoder_layers": 4,
126
+ "n_decoder_layers": 4,
127
+ "use_vae": true,
128
+ "latent_dim": 32,
129
+ "n_vae_encoder_layers": 4,
130
+ "temporal_ensemble_coeff": null,
131
+ "dropout": 0.1,
132
+ "kl_weight": 10.0,
133
+ "optimizer_lr": 1e-05,
134
+ "optimizer_weight_decay": 0.0001,
135
+ "optimizer_lr_backbone": 1e-05
136
+ },
137
+ "output_dir": "outputs/act_m3_fast",
138
+ "job_name": "act",
139
+ "resume": false,
140
+ "device": "cuda",
141
+ "use_amp": false,
142
+ "seed": 1000,
143
+ "num_workers": 4,
144
+ "batch_size": 32,
145
+ "steps": 20000,
146
+ "eval_freq": 20000,
147
+ "log_freq": 100,
148
+ "save_checkpoint": true,
149
+ "save_freq": 5000,
150
+ "use_policy_training_preset": true,
151
+ "optimizer": {
152
+ "type": "adamw",
153
+ "lr": 1e-05,
154
+ "weight_decay": 0.0001,
155
+ "grad_clip_norm": 10.0,
156
+ "betas": [
157
+ 0.9,
158
+ 0.999
159
+ ],
160
+ "eps": 1e-08
161
+ },
162
+ "scheduler": null,
163
+ "eval": {
164
+ "n_episodes": 50,
165
+ "batch_size": 50,
166
+ "use_async_envs": false
167
+ },
168
+ "wandb": {
169
+ "enable": false,
170
+ "disable_artifact": false,
171
+ "project": "lerobot",
172
+ "entity": null,
173
+ "notes": null
174
+ }
175
+ }