Robotics
LeRobot
Safetensors
so101
so-101
vision-language-action
imitation-learning
smolvla
flow-matching
batencle commited on
Commit
aac5259
Β·
verified Β·
1 Parent(s): bb4704a

Add model card

Browse files
Files changed (1) hide show
  1. README.md +237 -1
README.md CHANGED
@@ -1,3 +1,239 @@
1
  ---
2
- license: gpl-3.0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
+ library_name: lerobot
3
+ pipeline_tag: robotics
4
+ license: cc-by-sa-4.0
5
+ base_model: lerobot/smolvla_base
6
+ tags:
7
+ - robotics
8
+ - lerobot
9
+ - so101
10
+ - so-101
11
+ - vision-language-action
12
+ - imitation-learning
13
+ - smolvla
14
+ - flow-matching
15
+ datasets:
16
+ - Project-IRA/TPSoSe2026_Dataset_Full_Merged_Final_LeRobot_SO101_V1
17
  ---
18
+
19
+ # SmolVLA SO-101 Multi-Task β€” V6 Full
20
+
21
+ SmolVLA (~450M) fine-tuned on all four tasks, with the vision encoder unfrozen and image augmentation enabled. The best SmolVLA model in the project β€” though still meaningfully behind Pi0.5.
22
+
23
+
24
+
25
+ Part of **[Project-IRA](https://huggingface.co/Project-IRA)** β€” Interactive Robotic Arm.
26
+ Code: https://github.com/Project-IRA/interactive-robotic-arm
27
+
28
+ | | |
29
+ |---|---|
30
+ | Base model | [`lerobot/smolvla_base`](https://huggingface.co/lerobot/smolvla_base) |
31
+ | Robot | SO-101 follower (6-DOF) |
32
+ | Training data | [`Project-IRA/TPSoSe2026_Dataset_Full_Merged_Final_LeRobot_SO101_V1`](https://huggingface.co/datasets/Project-IRA/TPSoSe2026_Dataset_Full_Merged_Final_LeRobot_SO101_V1) |
33
+ | Recommended checkpoint | around 150000 (**not systematically tested**) |
34
+ | Inputs | `camera1` (wrist) + `camera2` (desk) images β€” **renamed keys, see Usage** β€” 6-dim joint state, English instruction |
35
+ | Outputs | 6-dim continuous action chunks |
36
+
37
+ ## Quality
38
+
39
+ **OK-ish.** Roughly the same quality as the single-task [V2 Lego](https://huggingface.co/Project-IRA/TPSoSe2026_SmolVLA_LeRobot_SO101_Finetuning_V2_Lego) model, but across *most* tasks rather than just Lego β€” so the multi-task generalisation worked, at the same per-task quality level.
40
+
41
+ Quality was assessed around checkpoint **150000**, but checkpoints were **not compared systematically** for this run β€” 150000 is a rough indication, not a validated optimum. Checkpoints exist every 10000 steps to 200000 plus `last`, so it is worth trying several.
42
+
43
+ For comparison, Pi0.5 on the same dataset works *really well* at checkpoint 8000. SmolVLA at ~450M parameters appears capacity-limited for this four-task set.
44
+
45
+ ## Training
46
+
47
+ SLURM job 2164957. **Single L40S GPU.**
48
+
49
+ | Setting | Value |
50
+ |---|---|
51
+ | Base | `lerobot/smolvla_base` |
52
+ | Dataset | 930-episode merged set |
53
+ | Steps | **200000, completed** (`--save_freq=10000`); assessed around 150000 |
54
+ | Batch size | 64 |
55
+ | Vision encoder | **unfrozen** (`--policy.freeze_vision_encoder=false`) |
56
+ | Image augmentation | **on** (`--dataset.image_transforms.enable=true`) |
57
+ | AMP | **on** (`--policy.use_amp=true`) |
58
+ | Parameters | 99,880,992 trainable of 450,046,176 total |
59
+ | Camera keys | **renamed** β€” `wrist_left`->`camera1`, `desk_view`->`camera2` |
60
+ | SLURM | `--gres=gpu:L40S:1 --cpus-per-task=16 --mem=92G --time=52:00:00` |
61
+
62
+ ```bash
63
+ lerobot-train \
64
+ --policy.path=lerobot/smolvla_base \
65
+ --dataset.repo_id=TPSoSe2026_Dataset_Full_Merged_Final_LeRobot_SO101 \
66
+ --dataset.image_transforms.enable=true \
67
+ --policy.freeze_vision_encoder=false \
68
+ --policy.use_amp=true \
69
+ --batch_size=64 --steps=200000 --save_freq=10000 \
70
+ --num_workers=16 --tolerance_s=0.01 \
71
+ --output_dir=outputs/train/smolvla_full_v2 \
72
+ --job_name=smolvla_full_v2 \
73
+ --policy.device=cuda --policy.push_to_hub=false --wandb.enable=false \
74
+ --rename_map='{"observation.images.wrist_left": "observation.images.camera1", "observation.images.desk_view": "observation.images.camera2"}'
75
+ ```
76
+
77
+ ### What changed vs V5
78
+
79
+ V5 used SmolVLA's defaults, where **the vision encoder is frozen** β€” the model's "eyes"
80
+ stayed locked to their pretrained state and could not adapt to our bricks, lighting and
81
+ camera angles. V6 unfroze it, added image augmentation and AMP, and doubled the step
82
+ count from 100k to 200k.
83
+
84
+ ### A caveat on `freeze_vision_encoder=false`
85
+
86
+ Unfreezing raised trainable parameters only modestly: the run logs report
87
+ `num_learnable_params=99880992` of `num_total_params=450046176` β€” the **same ~100M as the
88
+ frozen V5 run**. SmolVLA is a SmolVLM2-500M backbone plus a smaller action expert, and
89
+ most of the backbone stays frozen regardless of this flag. Do not expect this setting
90
+ alone to make all 450M parameters trainable.
91
+
92
+ ## Usage
93
+
94
+ > [!CAUTION]
95
+ > **This model expects renamed camera keys.** Training used
96
+ > `--rename_map` to remap the dataset's camera features:
97
+ >
98
+ > | Dataset feature | What the policy expects | Physical camera |
99
+ > |---|---|---|
100
+ > | `observation.images.wrist_left` | `observation.images.camera1` | wrist |
101
+ > | `observation.images.desk_view` | `observation.images.camera2` | desk |
102
+ >
103
+ > If you feed this policy `wrist_left` / `desk_view` it will fail or silently misbehave.
104
+ > Name your cameras `camera1` (wrist) and `camera2` (desk) at inference time, or apply the
105
+ > same `--rename_map` when re-training. **The Pi0.5 models do not do this** β€” they use the
106
+ > native `wrist_left` / `desk_view` names.
107
+
108
+ > [!IMPORTANT]
109
+ > **Model files are nested under `outputs_V6/`**, so `from_pretrained` on the repo ID
110
+ > will not work:
111
+ >
112
+ > ```
113
+ > outputs_V6/train/smolvla_full_v2/checkpoints/<step>/pretrained_model/
114
+ > ```
115
+ >
116
+ > **Checkpoints present:** every 10000 steps from `010000` to `200000`, plus `last`.
117
+ > Repo total ~27.7 GB.
118
+ >
119
+ > ```bash
120
+ > hf download Project-IRA/TPSoSe2026_SmolVLA_LeRobot_SO101_Finetuning_V6_Full \
121
+ > --include 'outputs_V6/train/smolvla_full_v2/checkpoints/150000/pretrained_model/*' \
122
+ > --local-dir ./smolvla_v6
123
+ > ```
124
+
125
+ ```python
126
+ import torch
127
+ from lerobot.policies.smolvla.modeling_smolvla import SmolVLAPolicy
128
+
129
+ policy = SmolVLAPolicy.from_pretrained("Project-IRA/TPSoSe2026_SmolVLA_LeRobot_SO101_Finetuning_V6_Full")
130
+ policy = policy.to("cuda").eval()
131
+ ```
132
+
133
+ On-robot rollout:
134
+
135
+ ```bash
136
+ lerobot-record \
137
+ --robot.type=so101_follower \
138
+ --robot.port=/dev/ttyACM0 \
139
+ --robot.id=$ROBOT_ID \
140
+ --robot.cameras='{
141
+ camera1: {type: opencv, index_or_path: /dev/v4l/by-path/$WRIST_PATH, width: 640, height: 480, fps: 30},
142
+ camera2: {type: opencv, index_or_path: /dev/v4l/by-path/$DESK_PATH, width: 640, height: 480, fps: 30}
143
+ }' \
144
+ --policy.path=Project-IRA/TPSoSe2026_SmolVLA_LeRobot_SO101_Finetuning_V6_Full \
145
+ --dataset.repo_id=$HF_USER/eval_run \
146
+ --dataset.single_task="Sort the lego by color" \
147
+ --episodes=10
148
+ ```
149
+
150
+ > Use one of the exact training prompts (see the dataset card) as the task string.
151
+ > Both cameras run at **640x480** at inference time even though `desk_view` was
152
+ > recorded at 800x600.
153
+
154
+ ## Robot setup
155
+
156
+ | | |
157
+ |---|---|
158
+ | Robot | SO-101 follower arm (6-DOF), `robot_type: so_follower` |
159
+ | Teleoperation | SO-101 leader arm |
160
+ | Control frequency | 30 fps |
161
+ | State / action space | 6-dim: `shoulder_pan.pos`, `shoulder_lift.pos`, `elbow_flex.pos`, `wrist_flex.pos`, `wrist_roll.pos`, `gripper.pos` |
162
+ | Camera `observation.images.desk_view` | 800x600, h264 (recording) |
163
+ | Camera `observation.images.wrist_left` | 640x480, h264 (recording) |
164
+
165
+ > **Inference note:** both cameras are run at **640x480 during inference**, not at their
166
+ > recording resolutions, to reduce the payload sent to the inference server.
167
+
168
+ ## Environment notes
169
+
170
+ All training ran on a SLURM cluster with L40S GPUs. Two environment details were required
171
+ and are easy to miss when reproducing:
172
+
173
+ - **ffmpeg libraries for torchcodec.** A minimal conda env supplies the shared libraries
174
+ that `torchcodec` discovers at runtime:
175
+ `export LD_LIBRARY_PATH=$CONDA_PREFIX/envs/ffmpeg_libs_v8/lib:<venv>/lib/python3.12/site-packages/nvidia/npp/lib:$LD_LIBRARY_PATH`
176
+ - **`--tolerance_s=0.01`** on every run, to accommodate timestamp jitter in the recorded
177
+ episodes.
178
+
179
+ Multi-GPU runs additionally set `PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True`.
180
+ Datasets and the virtualenv were copied to node-local `/scratch` before training rather
181
+ than read from shared storage.
182
+
183
+ No Weights & Biases logging was enabled for any run (`--wandb.enable=false`), so there are
184
+ no public training curves β€” the `job.*.err` SLURM logs are the record.
185
+
186
+ ## Tasks and prompts
187
+
188
+ The model is conditioned on English natural-language instructions. Prompt phrasing was
189
+ varied roughly every 10 episodes during recording, giving 93 distinct prompts in the
190
+ merged dataset. **Use one of the training prompts verbatim** for best results β€” the full
191
+ lists are on the [dataset card](https://huggingface.co/datasets/Project-IRA/TPSoSe2026_Dataset_Full_Merged_Final_LeRobot_SO101_V1).
192
+
193
+ ## Limitations
194
+
195
+ - **Behaviour cloning.** The policy imitates teleoperated demonstrations and has no notion
196
+ of recovery beyond what was demonstrated. It is susceptible to covariate shift and can
197
+ fail to recover from states outside the demonstration distribution.
198
+ - **Recovery data is incidental, not systematic.** Recovery behaviour appears in the data
199
+ only where the operator happened to make and correct a mistake during recording; no
200
+ recovery episodes were scripted deliberately.
201
+ - **Single environment.** All data comes from one lab desk with one lighting setup, one
202
+ camera geometry, and one set of physical objects. Expect degradation elsewhere.
203
+ - **Prompt sensitivity.** Language conditioning was trained on a fixed set of phrasings
204
+ (listed in the dataset card). Prompts far from those phrasings may behave unpredictably.
205
+ - **No formal evaluation.** Quality assessments below are qualitative, from operators
206
+ observing rollouts on the physical arm. There are no success-rate numbers.
207
+ - **Not safety-rated.** Supervise all physical execution and keep the workspace clear.
208
+
209
+ ## Upstream licensing & attribution
210
+
211
+ This model is a derivative work of Apache-2.0 licensed components:
212
+
213
+ | Component | Upstream | License |
214
+ |---|---|---|
215
+ | LeRobot framework | https://github.com/huggingface/lerobot | Apache-2.0 |
216
+ | `lerobot/smolvla_base` | https://huggingface.co/lerobot/smolvla_base | Apache-2.0 |
217
+
218
+ Apache-2.0 permits relicensing derivative works. We retain the upstream copyright
219
+ notices, license text, and NOTICE files for the incorporated material, as Apache-2.0
220
+ Section 4 requires. The upstream components remain under Apache-2.0 β€” only this
221
+ project's own contributions (the fine-tuned weights and training configuration) are
222
+ offered under **CC BY-SA 4.0**.
223
+
224
+ **CC BY-SA 4.0** was chosen because it is share-alike: derivatives must be released under
225
+ the same licence, so this work cannot be taken closed-source. The project's *source code*
226
+ lives in a separate repository under its own licence β€” see
227
+ https://github.com/Project-IRA/interactive-robotic-arm.
228
+
229
+ ## Citation
230
+
231
+ ```bibtex
232
+ @misc{project_ira_2026,
233
+ title = {Project-IRA: Interactive Robotic Arm},
234
+ author = {Baten, Cleo and Keppler, Bela and Sapper, Jonas},
235
+ year = {2026},
236
+ howpublished = {\url{https://huggingface.co/Project-IRA}},
237
+ note = {Code: \url{https://github.com/Project-IRA/interactive-robotic-arm}}
238
+ }
239
+ ```