Downloads · 30 days
14
23% of all-time downloads
shawshank1104/smolvla_bunv2
smolvla_bunv2 is a machine learning model from shawshank1104. Use it for the machine learning task on the model card, and read the license before you ship it in a product.
Written for the coding assistant on the NVIDIA Jetson AGX Thor. Everything from the smolvlabunmerged README still applies (contract, pins, inference code, VLM cache, verification). This file lists only what is differe…
Downloads · 30 days
14
23% of all-time downloads
All-time downloads
61
Public
Parameters
450M
907 MB on disk
Likes
0
Public
Click a slice to open those files.
.safetensors907 MB · 100%
How the weights are stored.
BF16447M · 99%
From the Hugging Face model README
shawshank1104/smolvla_bunv2 — SmolVLA fine-tuned on the demo-site data. Deploy THIS one.Written for the coding assistant on the NVIDIA Jetson AGX Thor. Everything from the smolvla_bun_merged README still applies (contract, pins, inference code, VLM cache, verification). This file lists only what is different, plus two inference-side changes that are required for reliable grasping.
At the demo site the previous model (smolvla_bun_merged) aligned the arm correctly but did not grip. Offline analysis on held-out grasp events reproduced it: the policy closed the gripper (joint 8) on only 2 of 5 approaches, often stopping half-way (0.45, 0.84) or not at all (0.05). Two causes: (1) the close decision depends on a fine visual cue the earlier data covered thinly; (2) with 50 executed steps per chunk the closing time is committed 1.7 s ahead, so the policy cannot react to contact.
| smolvla_bun_merged | smolvla_bunv2 (this) | |
|---|---|---|
| Init | lerobot/smolvla_base | smolvla_bun_merged checkpoint (warm start) |
| Data | bun_merged, 95 episodes | bun_merged_v2 = bun_merged + 30 on-site episodes (shawshank1104/bunv2) included twice → 155 episodes, 154,675 frames, 54 % on-site |
| Held out | 10 bun episodes | 3 on-site episodes (shawshank1104/bunv2_heldout), never trained on |
| Steps / batch / lr | 20k / 64 / 1e-4 | 8k / 64 / 5e-5 with 500-step warm-up |
| Task strings | same two | same two (bunv2's strings were relabeled to match: "pick up the bun and put it in the tray", "pick up all the buns and put them in the tray") |
Results (gripper closure on the 3 held-out on-site episodes, and verification numbers) are in the Results section at the bottom, appended after training.
from lerobot.configs.policies import PreTrainedConfig
from lerobot.policies.smolvla.modeling_smolvla import SmolVLAPolicy
from lerobot.policies.factory import make_pre_post_processors
PATH = "/data/checkpoints/smolvla_bunv2/pretrained_model"
cfg = PreTrainedConfig.from_pretrained(PATH)
cfg.n_action_steps = 25 # chunk_size stays 50; execute the first 25, then re-infer
cfg.device = "cuda"
policy = SmolVLAPolicy.from_pretrained(PATH, config=cfg).to("cuda").eval()
preprocessor, postprocessor = make_pre_post_processors(policy.config, pretrained_path=PATH,
preprocessor_overrides={"device_processor": {"device": "cuda"}})
Effect: the policy sees the bun under the fingers 0.8 s later at the latest and can commit the close. Cost: one inference per 25 frames (~0.5 s on the Thor per call, once every 0.83 s of motion) — still fits, but do a warm-up inference at startup and keep the loop at 30 Hz. If the Thor cannot sustain it (visible stutter at every chunk boundary), fall back to 50 and rely on change 2 alone.
In the demos joint 8 is binary: 0 = open, 1 = closed, almost never in between. A half-closed command is never what the operator did. After postprocessor(...) and before sending to the arm:
GRIPPER = 7 # index of right_j8.pos in the 8-dim action
a = action.clone()
a[..., GRIPPER] = torch.where(a[..., GRIPPER] > 0.5, torch.ones_like(a[..., GRIPPER]), torch.zeros_like(a[..., GRIPPER]))
Use 0.5 as the threshold. If the gripper still releases early during transport, lower it to 0.4; if it closes on nothing, raise to 0.6. Keep the other seven joints untouched.
Same cameras and keys, RGB, 30 Hz, policy.reset() per episode, task string exactly one of the two above. For a multi-bun demo use "pick up all the buns and put them in the tray" — 25 of the 33 on-site episodes were recorded under that task.
docker compose -f docker-compose.vla.yml exec vla hf download shawshank1104/smolvla_bunv2 --local-dir /data/checkpoints/smolvla_bunv2/pretrained_model
docker compose -f docker-compose.vla.yml exec vla python3 /data/checkpoints/smolvla_bunv2/pretrained_model/verify_policy.py /data/checkpoints/smolvla_bunv2/pretrained_model cuda shawshank1104/bun_merged_v2
Expected numbers: see Results below (must match to the 3rd decimal).
shawshank1104/smolvla_bun_merged (aligns, weak grasp) — only with change 2 applied.Gripper closure on 3 held-out on-site episodes, per checkpoint (baseline smolvla_bun_merged: 2/5 closes):
checkpoints: closing events 5 | policy closes gripper: 4/5 | close timing vs operator (frames, +late): median -4 | arm joints MAE during approach (rad): 0.054
checkpoints: closing events 5 | policy closes gripper: 4/5 | close timing vs operator (frames, +late): median 0 | arm joints MAE during approach (rad): 0.057
checkpoints: closing events 5 | policy closes gripper: 4/5 | close timing vs operator (frames, +late): median 0 | arm joints MAE during approach (rad): 0.059
checkpoints: closing events 5 | policy closes gripper: 4/5 | close timing vs operator (frames, +late): median -1 | arm joints MAE during approach (rad): 0.059
Verification on bun_merged_v2 training frames (Thor must reproduce):
first-step MAE / std (mean over joints): 0.043 50-step: 0.095
finite outputs: True latency per chunk on cuda: median 235.4 ms
fingerprint (sum of first-step preds): 30.1566