Instructions to use xijiazhao/VLA-finetuned with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- LeRobot
How to use xijiazhao/VLA-finetuned with LeRobot:
- Notebooks
- Google Colab
- Kaggle
VLA finetunes on UR10e multi-task manipulation
Four vision-language-action policies finetuned on the same real-robot dataset, so their representations can be compared under a common protocol. Each is shipped both as the LoRA adapter it was trained as and as a merged, directly-loadable checkpoint (except the full finetune, which is already a full model).
Dataset
bag100/ur10e-multitask β a real UR10e arm, not simulation.
| episodes | 285 train / 50 held-out val |
| frames | 51,215 train / 9,201 val |
| tasks | 7 |
| rate | 15 fps |
| cameras | 3 Γ 180Γ320 (exterior_1 overhead = primary, wrist, exterior_2) |
| state | 7 = 6 joint positions (rad) + gripper [0,1] |
| action | 7 = 6 joint velocities (Β±0.9 rad/s) + gripper |
Split is seed-0 and identical across every model here. Normalization statistics were computed on the train split alone.
Models
All four ran 20,000 optimizer steps on the same split.
| folder | base | trainable | recipe |
|---|---|---|---|
smolvla-ur10e-lora (+-merged) |
SmolVLA 0.45 B | LoRA r=32 Ξ±=64 on expert q/v + projections | bs 32/GPU, lr 1e-4 |
smolvla-ur10e-full |
SmolVLA 0.45 B | all 0.45 B | bs 16/GPU, lr 5e-5 |
xvla-ur10e-lora (+-merged) |
X-VLA 0.89 B (lerobot/xvla-libero) |
13.6 M (1.5 %) β LoRA r=32 Ξ±=64 dr=0.05 on the policy-transformer blocks, plus soft_prompt_hub trained in full |
bs 16, eff. batch 64, lr 1e-4 |
groot-ur10e-lora (+-merged) |
GR00T N1.5-3B | 328 M / 2.72 B (10.8 %) β LoRA r=64 Ξ±=128 + projectors | bs 16/GPU |
groot-ur10e-full |
GR00T N1.5-3B | β1.5 B / 2.72 B β vision tower + action head, Eagle LLM frozen | bs 8/GPU |
xvla-ur10e-full |
X-VLA 0.89 B | all 879.5 M | bs 16/GPU, eff. batch 64, lr 5e-5 |
Three of the seven are full finetunes (smolvla-ur10e-full, groot-ur10e-full, xvla-ur10e-full);
the rest are LoRA. Every LoRA arm ships both the adapter and a pre-merged standalone checkpoint, so
nothing here requires fetching a base model to run.
X-VLA is the one architecture present as a matched LoRA/full pair trained on identical data with the same effective batch, which makes it the cleanest comparison in the repo β once either arm has a held-out score.
X-VLA's soft prompts are its cross-embodiment mechanism; pure LoRA would have frozen the UR10e
domain at its LIBERO value, so they are in modules_to_save. Its action_mode is auto
(AutoActionSpace), not the base's ee6d.
Held-out evaluation
Chunked open-loop replay on the 50 held-out episodes. nMSE = per-dim MSE Γ· per-dim variance of the held-out actions, averaged: 1.0 = no better than predicting the dataset mean, 0 = perfect.
| model | nMSE β | joints | gripper | MAE (rad/s) | grip-acc |
|---|---|---|---|---|---|
smolvla-ur10e-full |
0.2916 | 0.3300 | 0.0612 | 0.0440 | 96.2 % |
groot-ur10e-full |
0.3146 | 0.3599 | 0.0430 | 0.0407 | 97.6 % |
groot-ur10e-lora |
0.3613 | 0.4111 | 0.0625 | 0.0451 | 97.0 % |
smolvla-ur10e-lora |
0.3849 | 0.4361 | 0.0775 | 0.0535 | 95.9 % |
xvla-ur10e-full |
not yet measured | β | β | β | β |
xvla-ur10e-lora |
not yet measured | β | β | β | β |
| control: train-mean action | 1.0004 | 1.0003 | 1.0012 | 0.1296 | 54.8 % |
| control: constant zero | 1.2082 | 1.0151 | 2.3662 | 0.1417 | 45.2 % |
| control: un-finetuned base, zero-shot | 1.6242 | 1.7199 | 1.0501 | 0.1717 | 43.8 % |
The zero-shot control matters: an un-finetuned base checkpoint on these episodes scores worse than emitting zeros, so clearing 1.0 is informative rather than automatic.
Neither X-VLA arm has a held-out number yet, so both sit unscored above. Their training losses:
| step | 100 | 4K | 8K | 12K | 16K | 20K |
|---|---|---|---|---|---|---|
xvla-ur10e-lora |
1.187 | 0.215 | 0.146 | 0.124 | 0.106 | 0.115 |
xvla-ur10e-full |
1.103 | 0.041 | 0.019 | 0.011 | 0.007 | 0.006 |
The LoRA arm flattens from ~14K steps and ends marginally above its own 16K minimum; the full arm reaches ~19Γ lower loss and was still descending at 20K. On 285 episodes that gap is equally consistent with a better fit and with memorization β training loss cannot separate them, and the open-loop replay that would has not been run for either. Treat it as a statement about optimization, not generalization.
No success rate was measured for any model here β these are open-loop trajectory metrics, not task success.
Loading
Merged checkpoints (LeRobot policies):
from lerobot.policies.smolvla.modeling_smolvla import SmolVLAPolicy
from lerobot.policies.factory import make_pre_post_processors
policy = SmolVLAPolicy.from_pretrained("smolvla-ur10e-lora-merged")
pre, post = make_pre_post_processors(
policy_cfg=policy.config, pretrained_path="smolvla-ur10e-lora-merged",
preprocessor_overrides={"device_processor": {"device": "cuda"}})
action = post(policy.select_action(pre(batch))) # -> (B, 7)
XVLAPolicy for the X-VLA folders. The processor pipeline is not optional β normalization, key
renaming and language tokenization all live in policy_preprocessor.json +
policy_*_normalizer_processor.safetensors, not inside the policy. Calling select_action on a raw
dict skips all of it.
GR00T folders need the Isaac-GR00T codebase; experiment_cfg/metadata.json carries the
new_embodiment normalization statistics that Gr00tPolicy reads at inference.
Gotchas
config.jsondeclares a staleobservation.statewidth. SmolVLA says 6, X-VLA says 8; the real state is 7. The value is inherited from each base checkpoint and is inert at runtime β the saved 7-dim normalizer statistics are what the pipeline actually broadcasts against β but building an input tensor fromconfig.input_features["observation.state"]will produce a confusing shape error. Trust the stats, not the config. Theactionshape (7) is correct everywhere.- X-VLA's preprocessor downloads
facebook/bart-largefor its tokenizer step at load time. UnderHF_HUB_OFFLINE=1with a cold cache it fails. - LeRobot's checkpoint writer omits the
"type"discriminator thatPreTrainedConfig.from_pretrainedrequires; it has been written back into everyconfig.jsonhere. - X-VLA needs a LeRobot revision that includes the
xvlapolicy.
Both full finetunes beat their LoRA twins here, on a dataset (285 episodes) small enough that the opposite would not have been surprising. The 0.45 B SmolVLA also beats the 2.72 B GR00T on nMSE, so parameter count is not what orders this table.
Not included
Two finetunes on the same dataset are deliberately absent: Ο0.5 LoRA (open-loop nMSE 0.6404) and an OpenVLA-OFT LoRA (7.65 B, 20,000 steps, completed) β both exist and are archived, just not published here.