makepluscode commited on
Commit
9d692bd
·
verified ·
1 Parent(s): b933573

Add SmolVLA fine-tuned from smolvla_base, 30k steps on pick_red

Browse files
README.md ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: apache-2.0
3
+ base_model: lerobot/smolvla_base
4
+ datasets:
5
+ - makepluscode/pick_red
6
+ library_name: lerobot
7
+ pipeline_tag: robotics
8
+ tags:
9
+ - robotics
10
+ - lerobot
11
+ - smolvla
12
+ - so101
13
+ - pick-and-place
14
+ ---
15
+
16
+ # pick_red_30k
17
+
18
+ SmolVLA fine-tuned from `lerobot/smolvla_base` on
19
+ [`makepluscode/pick_red`](https://huggingface.co/datasets/makepluscode/pick_red)
20
+ for the SO-ARM 101 red-block pick-and-place task. Trained through LeLab.
21
+
22
+ Companion checkpoint for Part 4 of the book *VLA 로보틱스 입문서*.
23
+
24
+ ## Training
25
+
26
+ | | |
27
+ |---|---|
28
+ | Base checkpoint | `lerobot/smolvla_base` |
29
+ | Dataset | `makepluscode/pick_red` — 50 episodes, 27,346 frames |
30
+ | Steps | 30,000 |
31
+ | Batch size | 8 |
32
+ | Optimizer | AdamW, lr 1e-4, cosine decay with warmup |
33
+ | Start loss | 0.450 (step 250) |
34
+ | Final loss | 0.065 |
35
+ | Loss plateau | from ~25,000 steps |
36
+ | Hardware | RTX 3060 12GB, CUDA 12.6 |
37
+ | Wall time | ~3 h 35 min |
38
+ | LeRobot | 0.5.2 (`82dffde`) |
39
+
40
+ `train_config.json` records `policy.pretrained_path` pointing at the
41
+ `lerobot/smolvla_base` snapshot, and `load_vlm_weights: true` — the vision and
42
+ language weights come from the pretrained base rather than being randomly
43
+ initialised.
44
+
45
+ ## Camera key mapping
46
+
47
+ The base checkpoint expects `camera1`/`camera2`/`camera3`, while the dataset
48
+ records `top`/`wrist`. Training used:
49
+
50
+ ```
51
+ observation.images.top -> observation.images.camera1
52
+ observation.images.wrist -> observation.images.camera2
53
+ ```
54
+
55
+ ## Task string
56
+
57
+ The same sentence is stored in the dataset and must be supplied at inference:
58
+
59
+ ```
60
+ 빨간 블록을 집어서 노란색 매트에 놓는다.
61
+ ```
62
+
63
+ ## Evaluation
64
+
65
+ Evaluated on the real SO-ARM 101 with the block placed at a single fixed start
66
+ position — the same condition the demonstrations were collected under. Results
67
+ are in-distribution and should not be read as evidence of visual or positional
68
+ generalisation.
config.json ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "type": "smolvla",
3
+ "n_obs_steps": 1,
4
+ "input_features": {
5
+ "observation.state": {
6
+ "type": "STATE",
7
+ "shape": [
8
+ 6
9
+ ]
10
+ },
11
+ "observation.images.camera1": {
12
+ "type": "VISUAL",
13
+ "shape": [
14
+ 3,
15
+ 256,
16
+ 256
17
+ ]
18
+ },
19
+ "observation.images.camera2": {
20
+ "type": "VISUAL",
21
+ "shape": [
22
+ 3,
23
+ 256,
24
+ 256
25
+ ]
26
+ },
27
+ "observation.images.camera3": {
28
+ "type": "VISUAL",
29
+ "shape": [
30
+ 3,
31
+ 256,
32
+ 256
33
+ ]
34
+ }
35
+ },
36
+ "output_features": {
37
+ "action": {
38
+ "type": "ACTION",
39
+ "shape": [
40
+ 6
41
+ ]
42
+ }
43
+ },
44
+ "device": "cuda",
45
+ "use_amp": false,
46
+ "use_peft": false,
47
+ "push_to_hub": false,
48
+ "repo_id": null,
49
+ "private": null,
50
+ "tags": null,
51
+ "license": null,
52
+ "pretrained_path": "C:\\Users\\bginess\\.cache\\huggingface\\hub\\models--lerobot--smolvla_base\\snapshots\\c83c3163b8ca9b7e67c509fffd9121e66cb96205",
53
+ "chunk_size": 50,
54
+ "n_action_steps": 50,
55
+ "normalization_mapping": {
56
+ "VISUAL": "IDENTITY",
57
+ "STATE": "MEAN_STD",
58
+ "ACTION": "MEAN_STD"
59
+ },
60
+ "max_state_dim": 32,
61
+ "max_action_dim": 32,
62
+ "resize_imgs_with_padding": [
63
+ 512,
64
+ 512
65
+ ],
66
+ "empty_cameras": 0,
67
+ "adapt_to_pi_aloha": false,
68
+ "use_delta_joint_actions_aloha": false,
69
+ "tokenizer_max_length": 48,
70
+ "num_steps": 10,
71
+ "use_cache": true,
72
+ "freeze_vision_encoder": true,
73
+ "train_expert_only": true,
74
+ "train_state_proj": true,
75
+ "optimizer_lr": 0.0001,
76
+ "optimizer_betas": [
77
+ 0.9,
78
+ 0.95
79
+ ],
80
+ "optimizer_eps": 1e-08,
81
+ "optimizer_weight_decay": 1e-10,
82
+ "optimizer_grad_clip_norm": 10.0,
83
+ "scheduler_warmup_steps": 1000,
84
+ "scheduler_decay_steps": 30000,
85
+ "scheduler_decay_lr": 2.5e-06,
86
+ "vlm_model_name": "HuggingFaceTB/SmolVLM2-500M-Video-Instruct",
87
+ "load_vlm_weights": true,
88
+ "add_image_special_tokens": false,
89
+ "attention_mode": "cross_attn",
90
+ "prefix_length": 0,
91
+ "pad_language_to": "max_length",
92
+ "num_expert_layers": 0,
93
+ "num_vlm_layers": 16,
94
+ "self_attn_every_n_layers": 2,
95
+ "expert_width_multiplier": 0.75,
96
+ "min_period": 0.004,
97
+ "max_period": 4.0,
98
+ "rtc_config": null,
99
+ "compile_model": false,
100
+ "compile_mode": "max-autotune"
101
+ }
model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d6841a78f1c1cafce3f1a6261b03133d155a20e00354ac090ccc3580717e8f7f
3
+ size 906712520
policy_postprocessor.json ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "policy_postprocessor",
3
+ "steps": [
4
+ {
5
+ "registry_name": "unnormalizer_processor",
6
+ "config": {
7
+ "eps": 1e-08,
8
+ "features": {
9
+ "action": {
10
+ "type": "ACTION",
11
+ "shape": [
12
+ 6
13
+ ]
14
+ }
15
+ },
16
+ "norm_map": {
17
+ "VISUAL": "IDENTITY",
18
+ "STATE": "MEAN_STD",
19
+ "ACTION": "MEAN_STD"
20
+ }
21
+ },
22
+ "state_file": "policy_postprocessor_step_0_unnormalizer_processor.safetensors"
23
+ },
24
+ {
25
+ "registry_name": "device_processor",
26
+ "config": {
27
+ "device": "cpu",
28
+ "float_dtype": null
29
+ }
30
+ }
31
+ ]
32
+ }
policy_postprocessor_step_0_unnormalizer_processor.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c8aebdabe6593e25d0b8961bebaf6505ad435d099a8f0a90bf4fe798b114668a
3
+ size 7536
policy_preprocessor.json ADDED
@@ -0,0 +1,90 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "policy_preprocessor",
3
+ "steps": [
4
+ {
5
+ "registry_name": "rename_observations_processor",
6
+ "config": {
7
+ "rename_map": {
8
+ "observation.images.top": "observation.images.camera1",
9
+ "observation.images.wrist": "observation.images.camera2"
10
+ }
11
+ }
12
+ },
13
+ {
14
+ "registry_name": "to_batch_processor",
15
+ "config": {}
16
+ },
17
+ {
18
+ "registry_name": "smolvla_new_line_processor",
19
+ "config": {}
20
+ },
21
+ {
22
+ "registry_name": "tokenizer_processor",
23
+ "config": {
24
+ "max_length": 48,
25
+ "task_key": "task",
26
+ "padding_side": "right",
27
+ "padding": "max_length",
28
+ "truncation": true,
29
+ "tokenizer_name": "HuggingFaceTB/SmolVLM2-500M-Video-Instruct"
30
+ }
31
+ },
32
+ {
33
+ "registry_name": "device_processor",
34
+ "config": {
35
+ "device": "cuda",
36
+ "float_dtype": null
37
+ }
38
+ },
39
+ {
40
+ "registry_name": "normalizer_processor",
41
+ "config": {
42
+ "eps": 1e-08,
43
+ "features": {
44
+ "observation.state": {
45
+ "type": "STATE",
46
+ "shape": [
47
+ 6
48
+ ]
49
+ },
50
+ "observation.images.camera1": {
51
+ "type": "VISUAL",
52
+ "shape": [
53
+ 3,
54
+ 256,
55
+ 256
56
+ ]
57
+ },
58
+ "observation.images.camera2": {
59
+ "type": "VISUAL",
60
+ "shape": [
61
+ 3,
62
+ 256,
63
+ 256
64
+ ]
65
+ },
66
+ "observation.images.camera3": {
67
+ "type": "VISUAL",
68
+ "shape": [
69
+ 3,
70
+ 256,
71
+ 256
72
+ ]
73
+ },
74
+ "action": {
75
+ "type": "ACTION",
76
+ "shape": [
77
+ 6
78
+ ]
79
+ }
80
+ },
81
+ "norm_map": {
82
+ "VISUAL": "IDENTITY",
83
+ "STATE": "MEAN_STD",
84
+ "ACTION": "MEAN_STD"
85
+ }
86
+ },
87
+ "state_file": "policy_preprocessor_step_5_normalizer_processor.safetensors"
88
+ }
89
+ ]
90
+ }
policy_preprocessor_step_5_normalizer_processor.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c8aebdabe6593e25d0b8961bebaf6505ad435d099a8f0a90bf4fe798b114668a
3
+ size 7536
train_config.json ADDED
@@ -0,0 +1,242 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "dataset": {
3
+ "repo_id": "makepluscode/pick_red",
4
+ "root": null,
5
+ "episodes": null,
6
+ "image_transforms": {
7
+ "enable": false,
8
+ "max_num_transforms": 3,
9
+ "random_order": false,
10
+ "tfs": {
11
+ "brightness": {
12
+ "weight": 1.0,
13
+ "type": "ColorJitter",
14
+ "kwargs": {
15
+ "brightness": [
16
+ 0.8,
17
+ 1.2
18
+ ]
19
+ }
20
+ },
21
+ "contrast": {
22
+ "weight": 1.0,
23
+ "type": "ColorJitter",
24
+ "kwargs": {
25
+ "contrast": [
26
+ 0.8,
27
+ 1.2
28
+ ]
29
+ }
30
+ },
31
+ "saturation": {
32
+ "weight": 1.0,
33
+ "type": "ColorJitter",
34
+ "kwargs": {
35
+ "saturation": [
36
+ 0.5,
37
+ 1.5
38
+ ]
39
+ }
40
+ },
41
+ "hue": {
42
+ "weight": 1.0,
43
+ "type": "ColorJitter",
44
+ "kwargs": {
45
+ "hue": [
46
+ -0.05,
47
+ 0.05
48
+ ]
49
+ }
50
+ },
51
+ "sharpness": {
52
+ "weight": 1.0,
53
+ "type": "SharpnessJitter",
54
+ "kwargs": {
55
+ "sharpness": [
56
+ 0.5,
57
+ 1.5
58
+ ]
59
+ }
60
+ },
61
+ "affine": {
62
+ "weight": 1.0,
63
+ "type": "RandomAffine",
64
+ "kwargs": {
65
+ "degrees": [
66
+ -5.0,
67
+ 5.0
68
+ ],
69
+ "translate": [
70
+ 0.05,
71
+ 0.05
72
+ ]
73
+ }
74
+ }
75
+ }
76
+ },
77
+ "revision": null,
78
+ "use_imagenet_stats": true,
79
+ "video_backend": "pyav",
80
+ "return_uint8": false,
81
+ "streaming": false
82
+ },
83
+ "env": null,
84
+ "policy": {
85
+ "type": "smolvla",
86
+ "n_obs_steps": 1,
87
+ "input_features": {
88
+ "observation.state": {
89
+ "type": "STATE",
90
+ "shape": [
91
+ 6
92
+ ]
93
+ },
94
+ "observation.images.camera1": {
95
+ "type": "VISUAL",
96
+ "shape": [
97
+ 3,
98
+ 256,
99
+ 256
100
+ ]
101
+ },
102
+ "observation.images.camera2": {
103
+ "type": "VISUAL",
104
+ "shape": [
105
+ 3,
106
+ 256,
107
+ 256
108
+ ]
109
+ },
110
+ "observation.images.camera3": {
111
+ "type": "VISUAL",
112
+ "shape": [
113
+ 3,
114
+ 256,
115
+ 256
116
+ ]
117
+ }
118
+ },
119
+ "output_features": {
120
+ "action": {
121
+ "type": "ACTION",
122
+ "shape": [
123
+ 6
124
+ ]
125
+ }
126
+ },
127
+ "device": "cuda",
128
+ "use_amp": false,
129
+ "use_peft": false,
130
+ "push_to_hub": false,
131
+ "repo_id": null,
132
+ "private": null,
133
+ "tags": null,
134
+ "license": null,
135
+ "pretrained_path": "C:\\Users\\bginess\\.cache\\huggingface\\hub\\models--lerobot--smolvla_base\\snapshots\\c83c3163b8ca9b7e67c509fffd9121e66cb96205",
136
+ "chunk_size": 50,
137
+ "n_action_steps": 50,
138
+ "normalization_mapping": {
139
+ "VISUAL": "IDENTITY",
140
+ "STATE": "MEAN_STD",
141
+ "ACTION": "MEAN_STD"
142
+ },
143
+ "max_state_dim": 32,
144
+ "max_action_dim": 32,
145
+ "resize_imgs_with_padding": [
146
+ 512,
147
+ 512
148
+ ],
149
+ "empty_cameras": 0,
150
+ "adapt_to_pi_aloha": false,
151
+ "use_delta_joint_actions_aloha": false,
152
+ "tokenizer_max_length": 48,
153
+ "num_steps": 10,
154
+ "use_cache": true,
155
+ "freeze_vision_encoder": true,
156
+ "train_expert_only": true,
157
+ "train_state_proj": true,
158
+ "optimizer_lr": 0.0001,
159
+ "optimizer_betas": [
160
+ 0.9,
161
+ 0.95
162
+ ],
163
+ "optimizer_eps": 1e-08,
164
+ "optimizer_weight_decay": 1e-10,
165
+ "optimizer_grad_clip_norm": 10.0,
166
+ "scheduler_warmup_steps": 1000,
167
+ "scheduler_decay_steps": 30000,
168
+ "scheduler_decay_lr": 2.5e-06,
169
+ "vlm_model_name": "HuggingFaceTB/SmolVLM2-500M-Video-Instruct",
170
+ "load_vlm_weights": true,
171
+ "add_image_special_tokens": false,
172
+ "attention_mode": "cross_attn",
173
+ "prefix_length": 0,
174
+ "pad_language_to": "max_length",
175
+ "num_expert_layers": 0,
176
+ "num_vlm_layers": 16,
177
+ "self_attn_every_n_layers": 2,
178
+ "expert_width_multiplier": 0.75,
179
+ "min_period": 0.004,
180
+ "max_period": 4.0,
181
+ "rtc_config": null,
182
+ "compile_model": false,
183
+ "compile_mode": "max-autotune"
184
+ },
185
+ "reward_model": null,
186
+ "output_dir": "E:\\LeLab\\outputs\\smolvla_makepluscode_pick_red_2026-07-25_23-14-30\\run",
187
+ "job_name": "smolvla",
188
+ "resume": false,
189
+ "seed": 1000,
190
+ "cudnn_deterministic": false,
191
+ "num_workers": 4,
192
+ "batch_size": 8,
193
+ "prefetch_factor": 4,
194
+ "persistent_workers": true,
195
+ "steps": 30000,
196
+ "eval_freq": 0,
197
+ "log_freq": 250,
198
+ "tolerance_s": 0.0001,
199
+ "save_checkpoint": true,
200
+ "save_freq": 1000,
201
+ "use_policy_training_preset": true,
202
+ "optimizer": {
203
+ "type": "adamw",
204
+ "lr": 0.0001,
205
+ "weight_decay": 1e-10,
206
+ "grad_clip_norm": 10.0,
207
+ "betas": [
208
+ 0.9,
209
+ 0.95
210
+ ],
211
+ "eps": 1e-08
212
+ },
213
+ "scheduler": {
214
+ "type": "cosine_decay_with_warmup",
215
+ "num_warmup_steps": 1000,
216
+ "num_decay_steps": 30000,
217
+ "peak_lr": 0.0001,
218
+ "decay_lr": 2.5e-06
219
+ },
220
+ "eval": {
221
+ "n_episodes": 10,
222
+ "batch_size": 10,
223
+ "use_async_envs": false
224
+ },
225
+ "wandb": {
226
+ "enable": false,
227
+ "disable_artifact": false,
228
+ "project": "lerobot",
229
+ "entity": null,
230
+ "notes": null,
231
+ "run_id": null,
232
+ "mode": null,
233
+ "add_tags": true
234
+ },
235
+ "peft": null,
236
+ "sample_weighting": null,
237
+ "rename_map": {
238
+ "observation.images.top": "observation.images.camera1",
239
+ "observation.images.wrist": "observation.images.camera2"
240
+ },
241
+ "checkpoint_path": null
242
+ }