smolvla-cucumber-grab-place-peel-doris072426
SmolVLA policy for the cucumber grab → place → peel pipeline, fine-tuned from lerobot/smolvla_base on 653 teleop episodes. Trained 2026-07-24 via Vibe Data Studio.
At a glance
| Architecture | SmolVLA (VLM frozen, expert trained — 100M trainable / 450M total) |
| Dataset | cucumber-grab-place-peel-doris072326-v1-flat @ b57da261 |
| Scale | 653 episodes · 86,156 frames @ 20 fps (~14.9 epochs) |
| Steps / batch / seed | 40,000 / 32 / 42 |
| Learning rate | 1e-4 (SmolVLA preset; cosine decay to 2.5e-6 over 30k, 1k warmup) |
| lerobot | 30da8e68 (fleet pin) |
| Final train loss | 0.041 |
Tasks
Language-conditioned — pass one of these instructions at inference:
| Instruction | Episodes |
|---|---|
| place the cucumber on the middle of the cutting board, aligned vertically in the image, with the back end of the cucumber under the blue gripper | 264 |
| grab the cucumber close to one of the cucumber's end | 201 |
| peel the skin of the cucumber with several strokes, starting close to the blue gripper and moving vertically along the cucumber toward the robot origin | 188 |
Rig
- Robot: SO-101 follower arm + tilt platform — 7-dim action/state:
shoulder_pan, shoulder_lift, elbow_flex, wrist_flex, wrist_roll, gripper, tilt(positions) - Cameras (three, 640×480 @ 20 fps):
base→camera1,top→camera2,wrist→camera3(rename applied at training; feed the same mapping at inference) - Recorded on: mixed-rig corpus — jetson1 + vibepi (see the per-source breakdown under Data provenance)
Variants in this repo
Two matched trainings of the same data, seed, and step count — a controlled A/B of the pod-side video preprocess (512px H.264 re-encode before training):
| Branch | Data pipeline | GPU | Duration | Final loss | W&B |
|---|---|---|---|---|---|
baseline-av1-a100 | original AV1 640×480 | A100-SXM4-80GB | 9h 45m | 0.041 | vds33-35787d3c |
preprocess-512-3090 (= main) | H.264 512×384 (pod transcode) | RTX 3090 | 8h 22m | 0.041 | pod-doris0724-27bc4f |
Paired offline eval (61 shared 50-step windows, original-resolution observations): the two models agree with each other (2.01 MAE, normalized units) more closely than either matches the demonstrations (2.37 / 2.51) — same policy within training noise; the re-encode is training-neutral by all offline measures.
Data provenance
Episodes per task per recording rig (computed by walking the nested collection manifests down to leaf recorded datasets and mapping each kept episode to its source):
| Task | jetson1 | vibepi | Total |
|---|---|---|---|
| grab | 142¹ | 59 | 201 |
| place | 200 | 64 | 264 |
| peel | 117 | 71 | 188 |
| Total | 459 | 194 | 653 |
¹ includes 37 episodes from eval_jetson1-062426-grab-doris — an eval-session dataset
recorded on jetson1, folded into the DAgger training corpus.
Materialized collection cucumber-grab-place-peel-doris072326@v1 (frozen 2026-07-24,
concat of three trimmed DAgger datasets, revisions pinned; leaf recordings and their
rigs resolved by walking the nested meta/vibedata/collection.json manifests):
cucumber-grab-DAgger-iter4-v3-trim@ffa83450(201 eps) ← jetson1-062626-grab-doris-task-unified, cucumber-subtask-grab-DAgger-iter2-task-unified_aux (06-29), vibepi-grab-f/-r-doris071526 (07-15)cucumber-place-DAgger-iter4-doris072326-v2-trim@294c8a6f(264 eps) ← place-DAgger-iter2 (07-09), jetson1-071426-place-doris/-r (07-14), vibepi-place-f/-r-doris072326 (07-23)cucumber-peel-DAgger-iter2-v2-trim@5432cb8d(188 eps) ← peel-DAgger-iter0 (07-17), jetson1-peel[-adaptive]-doris072026 (07-20), vibepi-peel[-adaptive]-doris0721/2226 (07-21/22)
lerobot-train --policy.path=lerobot/smolvla_base \
--policy.repo_id=VibeCuisine/smolvla-cucumber-grab-place-peel-doris072426 \
--dataset.repo_id=VibeCuisine/cucumber-grab-place-peel-doris072326-v1-flat \
--dataset.revision=b57da261ce402b79294e5c8a02117671327778ea \
--batch_size=32 --steps=40000 --policy.device=cuda --seed=42 \
--rename_map='{"observation.images.base": "observation.images.camera1",
"observation.images.top": "observation.images.camera2",
"observation.images.wrist": "observation.images.camera3"}'
--num_workers is appended host-side (clamped to the pod's allocation). The
preprocess-512-3090 variant additionally ran the Studio pod video preprocess
(dataset transcoded on-pod to width-512 H.264, --dataset.root pointed at the
local copy) — nothing differs in the training flags.
Card backported by Vibe Data Studio · run 33 (baseline) + pod-doris0724-27bc4f (preprocess) · 2026-07-25