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

Add model card

Browse files
Files changed (1) hide show
  1. README.md +220 -1
README.md CHANGED
@@ -1,3 +1,222 @@
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 β€” V5 Full
20
+
21
+ SmolVLA fine-tuned on all four tasks using SmolVLA's default settings β€” notably with the **vision encoder frozen**. Superseded by [V6 Full](https://huggingface.co/Project-IRA/TPSoSe2026_SmolVLA_LeRobot_SO101_Finetuning_V6_Full).
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 | **100000** |
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
+ **Works, but noticeably worse than V6.** Best checkpoint **100000**.
40
+
41
+ The characteristic failure was the arm missing objects entirely with no directed motion toward them β€” the expected symptom when the vision encoder never adapts to the scene. This diagnosis is what motivated V6.
42
+
43
+ ## Training
44
+
45
+ SLURM job 2163390. **Single L40S GPU.**
46
+
47
+ | Setting | Value |
48
+ |---|---|
49
+ | Base | `lerobot/smolvla_base` |
50
+ | Dataset | 930-episode merged set |
51
+ | Steps | **100000, completed** (`--save_freq=5000`); best at **100000** |
52
+ | Batch size | 64 |
53
+ | Vision encoder | **frozen** (SmolVLA default) |
54
+ | Image augmentation | off |
55
+ | AMP | off |
56
+ | Parameters | 99,880,992 trainable of 450,046,176 total |
57
+ | Camera keys | **renamed** β€” `wrist_left`->`camera1`, `desk_view`->`camera2` |
58
+ | SLURM | `--gres=gpu:L40S:1 --cpus-per-task=16 --mem=92G --time=42:00:00` |
59
+
60
+ ```bash
61
+ lerobot-train \
62
+ --policy.path=lerobot/smolvla_base \
63
+ --dataset.repo_id=TPSoSe2026_Dataset_Full_Merged_Final_LeRobot_SO101 \
64
+ --batch_size=64 --steps=100000 --save_freq=5000 \
65
+ --num_workers=16 --tolerance_s=0.01 \
66
+ --output_dir=outputs/train/smolvla_full \
67
+ --job_name=smolvla_full \
68
+ --policy.device=cuda --policy.push_to_hub=false --wandb.enable=false \
69
+ --rename_map='{"observation.images.wrist_left": "observation.images.camera1", "observation.images.desk_view": "observation.images.camera2"}'
70
+ ```
71
+
72
+ Kept for comparison β€” the frozen/unfrozen vision encoder contrast against V6 is the
73
+ clearest ablation in the project.
74
+
75
+ ## Usage
76
+
77
+ > [!CAUTION]
78
+ > **This model expects renamed camera keys.** Training used
79
+ > `--rename_map` to remap the dataset's camera features:
80
+ >
81
+ > | Dataset feature | What the policy expects | Physical camera |
82
+ > |---|---|---|
83
+ > | `observation.images.wrist_left` | `observation.images.camera1` | wrist |
84
+ > | `observation.images.desk_view` | `observation.images.camera2` | desk |
85
+ >
86
+ > If you feed this policy `wrist_left` / `desk_view` it will fail or silently misbehave.
87
+ > Name your cameras `camera1` (wrist) and `camera2` (desk) at inference time, or apply the
88
+ > same `--rename_map` when re-training. **The Pi0.5 models do not do this** β€” they use the
89
+ > native `wrist_left` / `desk_view` names.
90
+
91
+ > [!IMPORTANT]
92
+ > **Model files are nested under `outputs_V5/`**, so `from_pretrained` on the repo ID
93
+ > will not work:
94
+ >
95
+ > ```
96
+ > outputs_V5/train/smolvla_full/checkpoints/<step>/pretrained_model/
97
+ > ```
98
+ >
99
+ > **Checkpoints present:** every 5000 steps from `005000` to `100000`.
100
+ > Use **`100000`**. Repo total ~27.7 GB.
101
+ >
102
+ > ```bash
103
+ > hf download Project-IRA/TPSoSe2026_SmolVLA_LeRobot_SO101_Finetuning_V5_Full \
104
+ > --include 'outputs_V5/train/smolvla_full/checkpoints/100000/pretrained_model/*' \
105
+ > --local-dir ./smolvla_v5
106
+ > ```
107
+
108
+ ```python
109
+ import torch
110
+ from lerobot.policies.smolvla.modeling_smolvla import SmolVLAPolicy
111
+
112
+ policy = SmolVLAPolicy.from_pretrained("Project-IRA/TPSoSe2026_SmolVLA_LeRobot_SO101_Finetuning_V5_Full")
113
+ policy = policy.to("cuda").eval()
114
+ ```
115
+
116
+ On-robot rollout:
117
+
118
+ ```bash
119
+ lerobot-record \
120
+ --robot.type=so101_follower \
121
+ --robot.port=/dev/ttyACM0 \
122
+ --robot.id=$ROBOT_ID \
123
+ --robot.cameras='{
124
+ camera1: {type: opencv, index_or_path: /dev/v4l/by-path/$WRIST_PATH, width: 640, height: 480, fps: 30},
125
+ camera2: {type: opencv, index_or_path: /dev/v4l/by-path/$DESK_PATH, width: 640, height: 480, fps: 30}
126
+ }' \
127
+ --policy.path=Project-IRA/TPSoSe2026_SmolVLA_LeRobot_SO101_Finetuning_V5_Full \
128
+ --dataset.repo_id=$HF_USER/eval_run \
129
+ --dataset.single_task="Sort the lego by color" \
130
+ --episodes=10
131
+ ```
132
+
133
+ > Use one of the exact training prompts (see the dataset card) as the task string.
134
+ > Both cameras run at **640x480** at inference time even though `desk_view` was
135
+ > recorded at 800x600.
136
+
137
+ ## Robot setup
138
+
139
+ | | |
140
+ |---|---|
141
+ | Robot | SO-101 follower arm (6-DOF), `robot_type: so_follower` |
142
+ | Teleoperation | SO-101 leader arm |
143
+ | Control frequency | 30 fps |
144
+ | State / action space | 6-dim: `shoulder_pan.pos`, `shoulder_lift.pos`, `elbow_flex.pos`, `wrist_flex.pos`, `wrist_roll.pos`, `gripper.pos` |
145
+ | Camera `observation.images.desk_view` | 800x600, h264 (recording) |
146
+ | Camera `observation.images.wrist_left` | 640x480, h264 (recording) |
147
+
148
+ > **Inference note:** both cameras are run at **640x480 during inference**, not at their
149
+ > recording resolutions, to reduce the payload sent to the inference server.
150
+
151
+ ## Environment notes
152
+
153
+ All training ran on a SLURM cluster with L40S GPUs. Two environment details were required
154
+ and are easy to miss when reproducing:
155
+
156
+ - **ffmpeg libraries for torchcodec.** A minimal conda env supplies the shared libraries
157
+ that `torchcodec` discovers at runtime:
158
+ `export LD_LIBRARY_PATH=$CONDA_PREFIX/envs/ffmpeg_libs_v8/lib:<venv>/lib/python3.12/site-packages/nvidia/npp/lib:$LD_LIBRARY_PATH`
159
+ - **`--tolerance_s=0.01`** on every run, to accommodate timestamp jitter in the recorded
160
+ episodes.
161
+
162
+ Multi-GPU runs additionally set `PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True`.
163
+ Datasets and the virtualenv were copied to node-local `/scratch` before training rather
164
+ than read from shared storage.
165
+
166
+ No Weights & Biases logging was enabled for any run (`--wandb.enable=false`), so there are
167
+ no public training curves β€” the `job.*.err` SLURM logs are the record.
168
+
169
+ ## Tasks and prompts
170
+
171
+ The model is conditioned on English natural-language instructions. Prompt phrasing was
172
+ varied roughly every 10 episodes during recording, giving 93 distinct prompts in the
173
+ merged dataset. **Use one of the training prompts verbatim** for best results β€” the full
174
+ lists are on the [dataset card](https://huggingface.co/datasets/Project-IRA/TPSoSe2026_Dataset_Full_Merged_Final_LeRobot_SO101_V1).
175
+
176
+ ## Limitations
177
+
178
+ - **Behaviour cloning.** The policy imitates teleoperated demonstrations and has no notion
179
+ of recovery beyond what was demonstrated. It is susceptible to covariate shift and can
180
+ fail to recover from states outside the demonstration distribution.
181
+ - **Recovery data is incidental, not systematic.** Recovery behaviour appears in the data
182
+ only where the operator happened to make and correct a mistake during recording; no
183
+ recovery episodes were scripted deliberately.
184
+ - **Single environment.** All data comes from one lab desk with one lighting setup, one
185
+ camera geometry, and one set of physical objects. Expect degradation elsewhere.
186
+ - **Prompt sensitivity.** Language conditioning was trained on a fixed set of phrasings
187
+ (listed in the dataset card). Prompts far from those phrasings may behave unpredictably.
188
+ - **No formal evaluation.** Quality assessments below are qualitative, from operators
189
+ observing rollouts on the physical arm. There are no success-rate numbers.
190
+ - **Not safety-rated.** Supervise all physical execution and keep the workspace clear.
191
+
192
+ ## Upstream licensing & attribution
193
+
194
+ This model is a derivative work of Apache-2.0 licensed components:
195
+
196
+ | Component | Upstream | License |
197
+ |---|---|---|
198
+ | LeRobot framework | https://github.com/huggingface/lerobot | Apache-2.0 |
199
+ | `lerobot/smolvla_base` | https://huggingface.co/lerobot/smolvla_base | Apache-2.0 |
200
+
201
+ Apache-2.0 permits relicensing derivative works. We retain the upstream copyright
202
+ notices, license text, and NOTICE files for the incorporated material, as Apache-2.0
203
+ Section 4 requires. The upstream components remain under Apache-2.0 β€” only this
204
+ project's own contributions (the fine-tuned weights and training configuration) are
205
+ offered under **CC BY-SA 4.0**.
206
+
207
+ **CC BY-SA 4.0** was chosen because it is share-alike: derivatives must be released under
208
+ the same licence, so this work cannot be taken closed-source. The project's *source code*
209
+ lives in a separate repository under its own licence β€” see
210
+ https://github.com/Project-IRA/interactive-robotic-arm.
211
+
212
+ ## Citation
213
+
214
+ ```bibtex
215
+ @misc{project_ira_2026,
216
+ title = {Project-IRA: Interactive Robotic Arm},
217
+ author = {Baten, Cleo and Keppler, Bela and Sapper, Jonas},
218
+ year = {2026},
219
+ howpublished = {\url{https://huggingface.co/Project-IRA}},
220
+ note = {Code: \url{https://github.com/Project-IRA/interactive-robotic-arm}}
221
+ }
222
+ ```