Robotics
LeRobot
Safetensors
smolvla

Model Card for smolvla

SmolVLA is a compact, efficient vision-language-action model that achieves competitive performance at reduced computational costs and can be deployed on consumer-grade hardware.

smolvla architecture

This policy has been trained and pushed to the Hub using LeRobot.

Learn how to train and run it in the LeRobot smolvla guide, or browse the full documentation.

What changed in this revision

Retrained at SmolVLA's documented recipe (batch_size=64, steps=20000, per the LeRobot SmolVLA guide) with image augmentation enabled, replacing a batch_size=8 / 19000-step run that was an ACT-style budget and left this model underfit: it saw 9.9 epochs where the documented recipe sees 83.6.

Read this before deploying - it is a trade, not a clean win. Measured on 6 held-out episodes (2 per task, eval_split=0.1, never seen in training):

original revision this revision ACT-based policy, same data
Open-loop MAE on held-out episodes 5.82 deg 7.08 deg 3.06 deg
Within-chunk jerk (deg/step^2) 1.045 0.658 0.455

The 50-step chunk is produced by one forward pass and executed open loop, so its roughness lands directly on the servos. This revision is 37% smoother, which removes the visible tremor the original exhibited on a real SO-101, and costs about 22% in held-out accuracy.

Training on this dataset overfits: held-out loss rises monotonically from step ~500 while train loss falls to 0.031. Augmentation slows that (0.717 at 20k versus 0.847 without) but does not prevent it. Freezing versus unfreezing the VLM made no measurable difference (held-out loss 0.249 versus 0.264), so backbone capacity is not the binding constraint - dataset size is. 44 episodes across 3 tasks is thin for this model; an ACT-based policy reaches 3.06 deg MAE on exactly the same data. More demonstrations is the path to beating both columns at once.

Known data defect

The follower arm's wrist_roll never tracked the leader during recording: the action column spans 111-163 deg while the recorded state sits frozen at ~87.5 deg (per-episode std 0.00, action/state correlation about 0). Every policy trained on this dataset commands wrist_roll 60-70 deg beyond what the arm can reach, on 100% of timesteps. Inert for task behaviour, but it drives that servo into its stop for the whole rollout.


Model Details

  • License: apache-2.0
  • Fine-tuned from: lerobot/smolvla_base
  • Robot type: so_follower
  • Cameras: front, wrist

Inputs & Outputs

The policy consumes these observation features and produces these action features.

Inputs

Feature Type Shape
observation.state STATE (6,)
observation.images.camera1 VISUAL (3, 256, 256)
observation.images.camera2 VISUAL (3, 256, 256)
observation.images.camera3 VISUAL (3, 256, 256)

Outputs

Feature Type Shape
action ACTION (6,)

Training Dataset

  • Repository: khanhnd61/so101-multi-task-clean
  • Episodes: 44
  • Frames: 15317
  • Frame rate: 30 FPS
  • Task(s): "Put the tape into the box", "Put the tape into the cup", "Put the cup into the box"

Training Configuration

Setting Value
Training steps 20000
Batch size 64
Optimizer adamw
Learning rate 0.0001
Seed 1000
LeRobot version 0.6.1

How to Get Started with the Model

New to LeRobot? These guides cover the full workflow:

The short version to run and train this policy:

Run the policy on your robot

lerobot-rollout \
  --strategy.type=base \
  --robot.type=so_follower \
  --robot.port=<your_robot_port> \
  --robot.cameras="{ <camera_1>: {type: opencv, index_or_path: <index_or_path>, width: 640, height: 480, fps: 30}, <camera_2>: {type: opencv, index_or_path: <index_or_path>, width: 640, height: 480, fps: 30}}" \
  --policy.path=khanhnd61/smolvla_so101-multi-task-clean \
  --task="Put the tape into the box" \
  --duration=60

Replace the remaining <...> placeholders with your own values: --robot.port and the camera names/indices are specific to your machine, and the camera names must match the observation keys this policy was trained on.

When --strategy.type=base is used the script doesn't record the episodes. Skipping duration will make the policy run indefinitely. For more information look at rollout documentation.

Train your own policy

This policy type is usually fine-tuned from the pretrained base model lerobot/smolvla_base:

lerobot-train \
  --dataset.repo_id=${HF_USER}/<dataset> \
  --policy.path=lerobot/smolvla_base \
  --output_dir=outputs/train/<policy_repo_id> \
  --job_name=lerobot_training \
  --policy.device=cuda \
  --policy.repo_id=${HF_USER}/<policy_repo_id> \
  --wandb.enable=true

Writes checkpoints to outputs/train/<policy_repo_id>/checkpoints/.


Evaluation

No evaluation results have been provided for this policy yet.


Citation

If you use this policy, please cite the method linked in the description above, along with LeRobot:

@misc{cadene2024lerobot,
    author = {Cadene, Remi and Alibert, Simon and Soare, Alexander and Gallouedec, Quentin and Zouitine, Adil and Palma, Steven and Kooijmans, Pepijn and Aractingi, Michel and Shukor, Mustafa and Aubakirova, Dana and Russi, Martino and Capuano, Francesco and Pascal, Caroline and Choghari, Jade and Moss, Jess and Wolf, Thomas},
    title = {LeRobot: State-of-the-art Machine Learning for Real-World Robotics in Pytorch},
    howpublished = "\url{https://github.com/huggingface/lerobot}",
    year = {2024}
}
Downloads last month
47
Safetensors
Model size
0.5B params
Tensor type
F32
·
BF16
·
Video Preview
loading

Model tree for khanhnd61/smolvla_so101-multi-task-clean

Dataset used to train khanhnd61/smolvla_so101-multi-task-clean

Paper for khanhnd61/smolvla_so101-multi-task-clean