Hi everyone,
I’m currently working on fine-tuning SmolVLA and π₀ using RLBench. The robot setup is a Franka Emika Panda (7DoF + gripper), and I’ve already collected custom LeRobot datasets for a pick-and-place task (available on my Hugging Face) with 500 demo episodes.
I’ve successfully fine-tuned OpenVLA using its official repository, where the action space is defined as ΔEEF pose (Euler rotation) + gripper, and the state as ΔEEF pose (quaternion rotation) + gripper, using a single observation image (left shoulder), reaching around 22% success rate.
However, when trying to fine-tune SmolVLA, despite the training running without issues (loss converges and wandb plots look fine), the evaluation yields 0% success. I suspect I’m misunderstanding how to correctly define the state and action spaces for SmolVLA in this context.
Since RLBench is not one of the officially supported envs, I created an evaluation script (you can find it here), similar to the examples provided in Robot Learning: A Tutorial (thanks @fracapuano for the amazing work!).
For example, I started the finetuning using:
python src/lerobot/scripts/lerobot_train.py \
--policy.path=HuggingFaceVLA/smolvla_libero \
--policy.repo_id=RonPlusSign/smolvla_PutRubbishInBin \
--dataset.repo_id=RonPlusSign/RLBench-LeRobot-v3-PutRubbishInBin \
--batch_size=32 \
--output_dir=outputs/train/smolvla_finetuned_rubbish \
--policy.device=cuda \
--wandb.enable=true \
--save_freq=10000 \
--steps=60000
I also tested smaller finetunings (e.g. 5k, 10k, 20k steps).
Here are some specific points I’d like to clarify:
-
What are the exact action and state spaces used in SmolVLA and π₀ pretraining? (ΔEEF pose, absolute EEF pose, joint positions, joint velocities, ... and angle representations e.g. quaternion or Euler).
-
Regarding camera inputs: does the naming or number of cameras affect the model performance? Should I stick to the exact names provided in the config.json file, such as observation.images.image and observation.images.image2 (front/wrist), similar to pretraining? Or is it fine to use different camera names and/or add extra views? Is there a way to override the existing input and output features or this means that the pretrain would be wasted?
-
The base model lerobot/smolvla_base is pretrained on the SO100/SO101 robot, so I assume it might not transfer well to Franka Panda tasks — is that correct?
-
Would it make more sense to start from a model trained on Franka, e.g. HuggingFaceVLA/smolvla_libero, or it's still a different type of embodiment (it seems with 6DoF+gripper, which is not my case)?
-
Are the datasets HuggingFaceVLA/libero and/or HuggingFaceVLA/smol-libero the ones used for pretraining HuggingFaceVLA/smolvla_libero?
-
In HuggingFaceVLA/smol-libero the actions have dimension 7, which doesn’t clearly map to 7 joint angles + gripper. Are these absolute joint positions, EEF poses, or something else? Does LIBERO use a 6DoF or 7DoF Franka setup? If 6DoF, which joint is excluded?
Any guidance on these points (or pointers to where this information is documented) would be very helpful — I’ve been trying to align my setup with the pretrained models but haven’t found clear references for these details.
Thanks a lot for your time and for maintaining this project!
Hi everyone,
I’m currently working on fine-tuning SmolVLA and π₀ using RLBench. The robot setup is a Franka Emika Panda (7DoF + gripper), and I’ve already collected custom LeRobot datasets for a pick-and-place task (available on my Hugging Face) with 500 demo episodes.
I’ve successfully fine-tuned OpenVLA using its official repository, where the action space is defined as ΔEEF pose (Euler rotation) + gripper, and the state as ΔEEF pose (quaternion rotation) + gripper, using a single observation image (left shoulder), reaching around 22% success rate.
However, when trying to fine-tune SmolVLA, despite the training running without issues (loss converges and wandb plots look fine), the evaluation yields 0% success. I suspect I’m misunderstanding how to correctly define the state and action spaces for SmolVLA in this context.
Since RLBench is not one of the officially supported envs, I created an evaluation script (you can find it here), similar to the examples provided in Robot Learning: A Tutorial (thanks @fracapuano for the amazing work!).
For example, I started the finetuning using:
python src/lerobot/scripts/lerobot_train.py \ --policy.path=HuggingFaceVLA/smolvla_libero \ --policy.repo_id=RonPlusSign/smolvla_PutRubbishInBin \ --dataset.repo_id=RonPlusSign/RLBench-LeRobot-v3-PutRubbishInBin \ --batch_size=32 \ --output_dir=outputs/train/smolvla_finetuned_rubbish \ --policy.device=cuda \ --wandb.enable=true \ --save_freq=10000 \ --steps=60000I also tested smaller finetunings (e.g. 5k, 10k, 20k steps).
Here are some specific points I’d like to clarify:
What are the exact action and state spaces used in SmolVLA and π₀ pretraining? (ΔEEF pose, absolute EEF pose, joint positions, joint velocities, ... and angle representations e.g. quaternion or Euler).
Regarding camera inputs: does the naming or number of cameras affect the model performance? Should I stick to the exact names provided in the
config.jsonfile, such asobservation.images.imageandobservation.images.image2(front/wrist), similar to pretraining? Or is it fine to use different camera names and/or add extra views? Is there a way to override the existing input and output features or this means that the pretrain would be wasted?The base model lerobot/smolvla_base is pretrained on the SO100/SO101 robot, so I assume it might not transfer well to Franka Panda tasks — is that correct?
Would it make more sense to start from a model trained on Franka, e.g. HuggingFaceVLA/smolvla_libero, or it's still a different type of embodiment (it seems with 6DoF+gripper, which is not my case)?
Are the datasets HuggingFaceVLA/libero and/or HuggingFaceVLA/smol-libero the ones used for pretraining HuggingFaceVLA/smolvla_libero?
In HuggingFaceVLA/smol-libero the actions have dimension 7, which doesn’t clearly map to 7 joint angles + gripper. Are these absolute joint positions, EEF poses, or something else? Does LIBERO use a 6DoF or 7DoF Franka setup? If 6DoF, which joint is excluded?
Any guidance on these points (or pointers to where this information is documented) would be very helpful — I’ve been trying to align my setup with the pretrained models but haven’t found clear references for these details.
Thanks a lot for your time and for maintaining this project!