Robotics
LeRobot
English
OpenRAL
rskill
smolvla
vision-language-action
franka_panda
vla
so100
libero
manipulation
Instructions to use OpenRAL/rskill-smolvla-franka_panda-libero_spatial-bf16 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- LeRobot
How to use OpenRAL/rskill-smolvla-franka_panda-libero_spatial-bf16 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=OpenRAL/rskill-smolvla-franka_panda-libero_spatial-bf16 \ --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=OpenRAL/rskill-smolvla-franka_panda-libero_spatial-bf16 - Notebooks
- Google Colab
- Kaggle
| # rSkill manifest β OpenRAL packaging format V1 (CLAUDE.md Β§6.4) | |
| # Wraps: lerobot/smolvla_libero (Apache-2.0) β the paper-matching ckpt | |
| # Base: lerobot/smolvla_base (arxiv:2506.01844) | |
| # | |
| # We previously wrapped HuggingFaceVLA/smolvla_libero, but its config | |
| # does not match the paper: num_vlm_layers=0/32 (paper says 16), | |
| # vlm_model_name=SmolVLM2-500M-Instruct (paper: -Video-Instruct), | |
| # expert_width_multiplier=0.5 (paper: 0.75), pad_language_to=longest | |
| # (paper: max_length). The lerobot/smolvla_libero checkpoint matches | |
| # all five fields exactly. The HuggingFaceVLA checkpoint reproduces at | |
| # ~0.48 on libero_10 (community baseline 0.43β0.56); the lerobot one | |
| # is the artifact behind the paper's 0.71 claim. | |
| # ββ Identity βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| schema_version: "0.1" | |
| name: "OpenRAL/rskill-smolvla-franka_panda-libero_spatial-bf16" | |
| evaluated_tasks: ["libero_spatial", "libero_object", "libero_goal", "libero_10"] # trained on the full LIBERO set (all 4 suites, 40 tasks) | |
| version: "0.1.0" | |
| license: "apache-2.0" | |
| role: "s1" | |
| kind: "vla" # rSkill kind discriminator. "vla" = learnable Vision-Language-Action policy. | |
| # ββ Policy identity ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| model_family: "smolvla" | |
| # ββ Compatibility contract βββββββββββββββββββββββββββββββββββββββββββββββββ | |
| # LIBERO benchmark targets table-top manipulation with a Franka Panda | |
| # arm β the canonical embodiment used under | |
| # `openral sim run --config smolvla_libero_spatial.yaml` (matches the | |
| # pi05-libero-int8 / xvla-libero manifests). | |
| embodiment_tags: | |
| - "franka_panda" | |
| # LIBERO-finetuned SmolVLA expects two RGB camera streams at 224x224 minimum | |
| # (training used 256x256). The runner matches each entry against the robot's | |
| # SensorSpec.vla_feature_key declared in robots/<robot_id>/robot.yaml. | |
| sensors_required: | |
| - modality: "rgb" | |
| vla_feature_key: "observation.images.camera1" | |
| min_width: 224 | |
| min_height: 224 | |
| - modality: "rgb" | |
| vla_feature_key: "observation.images.camera2" | |
| min_width: 224 | |
| min_height: 224 | |
| # Output side. For the canonical franka_panda embodiment the | |
| # loader auto-fills n_dof + vla_action_key from robots/franka_panda/robot.yaml. | |
| actuators_required: | |
| - kind: "joint_position" | |
| control_mode_semantics: | |
| mode: "absolute" | |
| # ββ Runtime / weights ββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| runtime: "pytorch" | |
| quantization: | |
| dtype: "bf16" | |
| backend: "pytorch" | |
| # VRAM footprint per dtype, so the deploy can verify this VLA + its | |
| # paired reward model co-reside on the GPU before loading. bf16 measured at 0.93 GB | |
| # weights at load (RTX 4070); 1.2 GB declared with inference-activation headroom. | |
| min_vram_gb: | |
| bf16: 1.2 | |
| # A VLA emits no success signal of its own, so it runs with a reward / | |
| # progress monitor resident alongside it as the model's completion signal. | |
| # Robometer (NF4, 3.6 GB) is the default; 1.2 + 3.6 = 4.8 GB fits an 8 GB | |
| # card with room to spare. | |
| reward_rskill_name: "OpenRAL/rskill-robometer_4b-any-general-nf4" | |
| # Pin to the HEAD SHA at packaging time for reproducibility (principle 8). | |
| # Update by re-running: tools/rskill_publisher.py --bump-revision | |
| weights_uri: "hf://lerobot/smolvla_libero" | |
| # ββ Preprocessing (all knobs needed to interpret IO) βββββββββββββββββββββββ | |
| # Per-file URIs for the lerobot PolicyProcessorPipeline β closes Gap 1 + Gap 3 | |
| # of the rSkill self-containment audit. The SmolVLA adapter downloads | |
| # exactly these files via hf_hub_download rather than snapshot_download. | |
| processors: | |
| preprocessor_uri: "hf://lerobot/smolvla_libero/policy_preprocessor.json" | |
| postprocessor_uri: "hf://lerobot/smolvla_libero/policy_postprocessor.json" | |
| # Per-checkpoint knobs the processor JSONs don't encode. SmolVLA on | |
| # LIBERO uses the same 180Β° H/W flip + camera1/2 alias remap as the pi05 | |
| # LIBERO checkpoint, and the same 8-D proprio state contract. | |
| image_preprocessing: | |
| flip_180: true | |
| aliases: | |
| top: "image" | |
| wrist: "image2" | |
| state_contract: | |
| # the LIBERO checkpoint trains on 8-D TASK-SPACE proprio | |
| # (eef_pos β eef_axisangle β gripper). The benchmark (`openral sim run`) | |
| # supplies it directly; deploy (`openral deploy sim`) assembles it from live | |
| # TF + JointState via the `libero_eef8d` state-adapter. Without the layout the | |
| # runner falls back to raw joint-space state and the policy never reaches the | |
| # target. The franka deploy sim publishes a static `world -> panda_link0` from | |
| # the sim's robot mount pose (sim_sensor_bridge) so the EE pose is | |
| # read in the same world frame as robosuite's `robot0_eef_pos`. | |
| layout: "libero_eef8d" | |
| dim: 8 | |
| bindings: | |
| # panda_hand_tcp matches robosuite's grip site (the eef the checkpoint saw) | |
| # within ~6 mm; panda_hand is the wrist body ~9 cm above the grasp point. | |
| eef_frame: "panda_hand_tcp" | |
| # World root the HAL publishes for the fixed-base franka (robosuite world). | |
| world_frame: "world" | |
| # The franka deploy HAL exposes ONE parallel-gripper joint (`panda_gripper`, | |
| # ~0.04 m open); the assembler mirrors it to [v, -v] to reconstruct | |
| # robosuite's symmetric two-finger qpos (~[0.039, -0.039]) the checkpoint saw. | |
| gripper_qpos_joints: | |
| - "panda_gripper" | |
| # ββ Execution semantics ββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| chunk_size: 16 | |
| # Half-chunk replan β closed-loop replanning every 25 env steps; paper-faithful | |
| # for the validated 3/3 success run on libero_10/4. Clamped to chunk_size at | |
| # apply_chunk_replay (effective replay length = min(25, 16) = 16). | |
| n_action_steps: 25 | |
| latency_budget: | |
| per_chunk_ms: 150.0 # SmolVLA inference at bf16 on a desktop GPU β 80β120 ms | |
| # Total wall-clock budget for ONE execute_rskill attempt (CLAUDE.md Β§3). A VLA | |
| # never self-terminates, so the deploy runner resolves `deadline_s=0` to this. | |
| # 60 s is generous for a single LIBERO-spatial pick-place at the deploy's | |
| # closed-loop rate; on lapse the goal aborts and the reasoner re-evaluates. | |
| max_execution_s: 60.0 | |
| # ββ Provenance βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| # Headline success rates from skills/smolvla-libero/eval/*.json. The | |
| # per-task breakdown lives in those JSONs; this dict is what | |
| # `ral skill list` renders. | |
| benchmarks: | |
| libero_10: 0.59 | |
| libero_goal: 0.67 | |
| libero_object: 0.78 | |
| libero_spatial: 0.9 | |
| paper_url: "https://arxiv.org/abs/2506.01844" | |
| dataset_uri: "hf://HuggingFaceVLA/libero" | |
| source_repo: "hf://lerobot/smolvla_libero" | |
| description: > | |
| SmolVLA finetuned on the LIBERO task suite (Apache-2.0). Action chunks | |
| of length 16 across two RGB camera views (wrist + overhead) matching | |
| the original LIBERO dataset convention. The lerobot checkpoint wrapped | |
| here matches the paper's reported configuration on all five | |
| architecture fields β see header comment for the rejected sibling. | |
| # Action vocabulary surfaced to the reasoner LLM tool | |
| # palette so it can pick this skill by what it does (action verb + | |
| # object + scene), not just by its slug. | |
| actions: | |
| - "pick" | |
| - "place" | |
| - "open" | |
| - "close" | |
| objects: | |
| - "bowl" | |
| - "cup" | |
| - "drawer" | |
| - "object" | |
| scenes: | |
| - "tabletop" | |
| - "kitchen" | |
| # Per-checkpoint action contract (consumed by the dataset bridge | |
| # to bind the LeRobot v3 `action` feature shape). | |
| action_contract: | |
| dim: 7 | |
| # LIBERO action space is 6-D OSC end-effector delta + gripper. | |
| # Declaring the representation makes deploy-sim dispatch cartesian_delta + | |
| # gripper (via canonical_slots_for_representation) instead of defaulting the | |
| # whole vector to JOINT_POSITION, which the joint-space envelope rejects. | |
| representation: "delta_ee_6d_plus_gripper" | |