Instructions to use Parv-09/smolvla_phi_cubcyl_lang_3cam with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- LeRobot
How to use Parv-09/smolvla_phi_cubcyl_lang_3cam with LeRobot:
# See https://github.com/huggingface/lerobot?tab=readme-ov-file#installation for more details git clone https://github.com/huggingface/lerobot.git cd lerobot pip install -e .[smolvla]
# Launch finetuning on your dataset python lerobot/scripts/train.py \ --policy.path=Parv-09/smolvla_phi_cubcyl_lang_3cam \ --dataset.repo_id=lerobot/svla_so101_pickplace \ --batch_size=64 \ --steps=20000 \ --output_dir=outputs/train/my_smolvla \ --job_name=my_smolvla_training \ --policy.device=cuda \ --wandb.enable=true
# Run the policy using the record function python -m lerobot.record \ --robot.type=so101_follower \ --robot.port=/dev/ttyACM0 \ # <- Use your port --robot.id=my_blue_follower_arm \ # <- Use your robot id --robot.cameras="{ front: {type: opencv, index_or_path: 8, width: 640, height: 480, fps: 30}}" \ # <- Use your cameras --dataset.single_task="Grasp a lego block and put it in the bin." \ # <- Use the same task description you used in your dataset recording --dataset.repo_id=HF_USER/dataset_name \ # <- This will be the dataset name on HF Hub --dataset.episode_time_s=50 \ --dataset.num_episodes=10 \ --policy.path=Parv-09/smolvla_phi_cubcyl_lang_3cam - Notebooks
- Google Colab
- Kaggle
smolvla_phi_cubcyl_lang_3cam
SmolVLA fine-tuned from lerobot/smolvla_base by
Ξ¦ (Physical Hardware Intelligence), Northeastern University Silicon Valley.
This is the 4k-step run. Its sibling is Parv-09/smolvla_phi_cubcyl_lang_3cam_20k.
Same data, same seed, different training length β see the comparison below.
Best checkpoint in this repo: 001500 (eval_loss 0.1494).
π¨ Read before running a rollout
1. You must pass one of the six instructions, verbatim. This model is language-conditioned: the instruction selects the behaviour. LeLab's task field defaults to an EMPTY string and does not auto-fill, so a blank task is off-distribution for everything the model learned.
pick up the red cube and place it in the cardboard box
pick up the red cube and place it in the white bin
pick up the white cube and place it in the cardboard box
pick up the white cube and place it in the white bin
pick up the yellow cylinder and place it in the cardboard box
pick up the yellow cylinder and place it in the white bin
2. Camera order is baked in. smolvla_base was pretrained on camera1/2/3, and make_policy
does not re-derive feature names when a pretrained path is set. Training used an explicit rename,
stored in policy_preprocessor.json and applied automatically:
| dataset key | policy key |
|---|---|
observation.images.wrist |
observation.images.camera1 |
observation.images.front |
observation.images.camera2 |
observation.images.top |
observation.images.camera3 |
Physically reassigning cameras silently feeds the model the wrong views.
Held-out loss
eval_split=0.1 holds out 12 episodes, 2 per instruction, leaving 108 train / 60,281 frames.
| step | 500 | 1000 | 1500 | 2000 | 2500 | 3000 | 3500 | 4000 | |---|---|---|---|---|---|---|---|---|| | eval_loss | 0.1651 | 0.1542 | 0.1494 | 0.1525 | 0.1564 | 0.1537 | 0.1589 | 0.1565 |
The 4k vs 20k comparison
| 4k run | 20k run | |
|---|---|---|
| epochs | 4.25 | 21.23 |
| best checkpoint | 001500 | 002500 |
| best eval_loss | 0.1494 | 0.1659 |
| final eval_loss | 0.1565 | 0.3444 |
| wall clock (H200) | 37m | 2h32m |
The 20k run follows the documented SmolVLA recipe and overfits monotonically from its first measurement: held-out loss rises 0.1659 β 0.3444 while train loss falls 14x (0.324 β 0.023). That recipe assumes ~50 episodes of one task; this dataset saturates in about 2 epochs. The 4k run anneals properly over its own length and wins.
β οΈ Note the two runs are not the same LR schedule. Both configs record warmup 1000 / decay
20000, but LeRobot auto-rescales whenever steps < num_decay_steps, so the 4k run actually ran
~200 warmup with full decay by step 4000. The 4k run is not a prefix of the 20k run.
Training
| Base | lerobot/smolvla_base, 450M |
| Trainable | 99.9M of 450M (train_expert_only, freeze_vision_encoder) |
| Dataset | BrutalCaesar/phi_so101_cubes_cylinder_lang_v1 β 120 eps, 66,873 frames, 30 fps, 6 instructions |
| batch / steps | 64 / 4000 |
| lr / betas / wd / grad clip | 1e-4 / [0.9, 0.95] / 1e-10 / 10.0 |
| chunk_size / n_action_steps | 50 / 50 |
| denoising steps (inference) | 10 |
| image resize | 512x512 padded Β· VLM layers 16 |
| seed | 1000 |
Use with LeLab
Import the bare repo id and every checkpoint appears in the dropdown:
Parv-09/smolvla_phi_cubcyl_lang_3cam
Or pin one directly:
Parv-09/smolvla_phi_cubcyl_lang_3cam@checkpoints/001500
Caveats
- No scored rollouts yet. These are held-out losses, not success rates.
- Not comparable to Ξ¦'s ACT numbers: ACT's
eval_lossis pure L1 with the CVAE latent zeroed; this is a flow-matching regression loss on a different split. - The eval set is 12 episodes, so differences under ~0.005 are inside the noise. The curve here is non-monotonic, which is why 1500-2000 should be treated as a basin, not a sharp optimum.
- Inference latency on Apple Silicon is unmeasured.
Links
- Code and docs: https://github.com/physical-hardware-intelligence/phi