Instructions to use RoboDyna/X-VLA-RoboDyna with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use RoboDyna/X-VLA-RoboDyna with Transformers:
# Load model directly from transformers import AutoModel model = AutoModel.from_pretrained("RoboDyna/X-VLA-RoboDyna", trust_remote_code=True, device_map="auto") - Notebooks
- Google Colab
- Kaggle
X-VLA-RoboDyna
X-VLA-0.9B fine-tuned on
RoboDyna Benchmark v2 β
a dual-arm (ur5-wsg) benchmark of dynamic manipulation: moving targets, rolling and
falling objects, closing time windows, conveyor belts and distractors.
Trained on all 4,050 episodes / 35 tasks (1.37M frames, 16.67 Hz, three RGB views).
Status
No rollout evaluation has been run yet β this card reports no success rate. What is verified is training convergence and that the checkpoint loads and is self-contained. Treat it as a trained baseline, not a benchmarked result.
Usage
from transformers import AutoModel, AutoProcessor
model = AutoModel.from_pretrained("RoboDyna/X-VLA-RoboDyna", trust_remote_code=True)
processor = AutoProcessor.from_pretrained("RoboDyna/X-VLA-RoboDyna", trust_remote_code=True)
# X-VLA serves over HTTP; see the upstream X-VLA repo for the client side.
model.run(processor, host="0.0.0.0", port=8000)
Pass domain_id = 19 β the soft-prompt slot this model was trained under (see below).
Action space β read this before deploying
The model emits X-VLA's 20-D ee6d vector, absolute end-effector pose (no deltas),
laid out as:
[0:3] arm0 xyz [3:9] arm0 rot6d [9] arm0 gripper
[10:13] arm1 xyz [13:19] arm1 rot6d [19] arm1 gripper
arm0 = left, arm1 = right. Conventions that must match on the decode side:
- rot6d is the first two columns of the rotation matrix, flattened row-major, i.e.
interleaved:
c1 = v[0::2],c2 = v[1::2]. Slicing it asv[0:3]/v[3:6]is wrong. - Gripper is 1 = closed (X-VLA convention). RoboDyna's raw
observation.endposegripper is 1 = open, so it was inverted during training; invert back when replaying against the dataset. Gripper channels are logits β apply sigmoid (the model'spostprocessdoes this). - Source quaternions in
observation.endposeare scalar-first (wxyz), per the SAPIEN/RoboTwin generator (transforms3d.mat2quat). This was confirmed against the dataset's own recorded wrist-camera extrinsics: for the correct order,R_cam(t)^T @ R_endpose(t)is constant to 0.013 deg, versus 4.64 deg for scalar-last.
The action chunk is 30 steps sampled at the native 16.67 Hz control rate (~1.8 s).
Note the RoboDyna dataset's action column is 14-D joint space; this model does not
use it. X-VLA's EE6DActionSpace hard-codes its channel indices, so joint vectors cannot
be padded into the 20-D slot β the model is trained from observation.endpose instead.
Training
| Base | 2toINF/X-VLA-Pt (0.9B) |
| Hardware | 8 Γ H200 |
| Global batch | 256 (32/GPU), bf16, DDP |
| Steps | 30,000 (~5 h 45 m) |
| LR | 1e-4, learning_coef 0.1 (VLM + soft prompts at 1e-5) |
| Schedule | 1k freeze + 2k warmup, cosine to 0.1Γ, grad-clip 1.0 |
| Domain id | 19 β a soft-prompt slot unused by pretraining |
Loss (median per 5k block): 1.466 β 0.258 β 0.182 β 0.134 β 0.110 β 0.114. Final 2k steps: median 0.105. Flat over the last two blocks, i.e. converged within the 30k budget.
The soft-prompt bank moved only at index 19 (drift 1.4e-3); domains 0β18 are bit-identical to the base checkpoint, so pretrained cross-embodiment prompts are uncontaminated.
Contents
Includes the trust_remote_code modeling files (modeling_xvla.py, configuration_xvla.py,
transformer.py, action_hub.py, processing_xvla.py, and the Florence-2 pair), so the repo
loads standalone.
Citation
@article{zheng2025x,
title = {X-VLA: Soft-Prompted Transformer as Scalable Cross-Embodiment Vision-Language-Action Model},
author = {Zheng, Jinliang and Li, Jianxiong and Wang, Zhihao and Liu, Dongxiu and Kang, Xirui
and Feng, Yuchun and Zheng, Yinan and Zou, Jiayin and Chen, Yilun and Zeng, Jia and others},
journal = {arXiv preprint arXiv:2510.10274},
year = {2025}
}
- Downloads last month
- -