[ICML 2026π₯π₯π₯] StableVLA: Towards Robust Vision-Language-Action Models without Extra Data
May 18, 2026 Β· View on GitHub
[ICML 2026π₯π₯π₯] StableVLA: Towards Robust Vision-Language-Action Models without Extra Data
Yiyang Fu1, Chubin Zhang2,3, Shukai Gong1, Yufan Deng1, Kaiwei Sun4, Qiyang Min, Qibin Hou5, Yansong Tang2, Jianan Wang3, Daquan Zhou1β
1Peking University β 2Tsinghua University β 3Astribot β 4Nanjing University β 5Nankai University
β Corresponding author
π Paper: https://arxiv.org/abs/TODO
π Project page: https://dagroup-pku.github.io/StableVLA/
π€ HuggingFace: https://huggingface.co/DAGroup-PKU/StableVLA
GitHub: https://github.com/DAGroup-PKU/HumanNet/tree/main/src/model/StableVLA
:loudspeaker: News
- [2026/05] StableVLA is accepted to ICML 2026! π
- [2026/05] We release model weights and training code.
π Table of Contents
- :rocket: Quick Start
- :pencil: Data Preparation
- β Model Weights
- :fire: Training
- :mechanical_arm: Evaluation
- π Results
- π Citation
- :heart: Acknowledgment
:rocket: Quick Start
Conda Environment
conda create -n stablevla python=3.10.16 -y
conda activate stablevla
Install Dependencies
# Install PyTorch (adjust for your CUDA version)
pip install torch==2.2.0 torchvision==0.17.0 torchaudio==2.2.0
# Install package
git clone https://github.com/DAGroup-PKU/HumanNet.git
cd HumanNet/src/model/StableVLA
pip install -e .
pip install packaging ninja
ninja --version; echo $? # Should return exit code "0"
# Install Flash Attention 2
pip install "flash-attn==2.5.5" --no-build-isolation
# If you have trouble, try: pip cache remove flash_attn
# Or download the matching .whl from https://github.com/Dao-AILab/flash-attention/releases/tag/v2.5.5
:pencil: Data Preparation
LIBERO
Clone and install the LIBERO repo and required packages:
git clone https://github.com/Lifelong-Robot-Learning/LIBERO.git
pip install -e LIBERO
pip install -r experiments/robot/libero/libero_requirements.txt
Download the LIBERO RLDS datasets (~10GB total):
git clone git@hf.co:datasets/openvla/modified_libero_rlds
Note: Remove the
modified_prefix from the downloaded folder name.
CALVIN
git clone --recurse-submodules https://github.com/mees/calvin.git
export CALVIN_ROOT=$(pwd)/calvin
cd $CALVIN_ROOT && sh install.sh
# Download CALVIN ABCβD dataset
cd $CALVIN_ROOT/dataset && sh download_data.sh ABC
RLDS format (~50GB): zhouhongyi/calvin_abc_rlds
If you get
AttributeError: 'NoneType' object has no attribute 'eglQueryString', run:sudo apt-get install libgl1-mesa-dev libegl1-mesa-dev libgles2-mesa-dev libglew-dev
Dataset Structure
.
βββ data
β βββ libero
β β βββ libero_spatial_no_noops/ 1.0.0/
β β βββ libero_object_no_noops/ 1.0.0/
β β βββ libero_goal_no_noops/ 1.0.0/
β β βββ libero_10_no_noops/ 1.0.0/
β βββ calvin_abc/ 1.0.0/
β Model Weights
All pretrained weights are on π€ HuggingFace at beikui12345/stablevla:
| Folder | Description |
|---|---|
pretrained_models/ | Pretrained VLM backbone (Fused IB-Adapter projector) |
spatial/ | StableVLA checkpoint for LIBERO-Spatial |
object/ | StableVLA checkpoint for LIBERO-Object |
goal/ | StableVLA checkpoint for LIBERO-Goal |
long/ | StableVLA checkpoint for LIBERO-Long |
Download with:
from huggingface_hub import snapshot_download
# Download everything
snapshot_download(repo_id="beikui12345/stablevla", local_dir="./hf_weights")
# Or download a specific task checkpoint
snapshot_download(repo_id="beikui12345/stablevla", local_dir="outputs/spatial",
allow_patterns="spatial/*")
Place the downloaded folders as follows:
.
βββ pretrained_models/
β βββ stablevla-fusedfan-projector/ # β from pretrained_models/ on HF
βββ outputs/
βββ spatial/ # β from spatial/ on HF
βββ object/
βββ goal/
βββ long/
:fire: Training
StableVLA replaces the standard MLP projector in VLA-Adapter with the Fused IB-Adapter module.
VLM Pretraining (optional β skip if using HF weights above)
torchrun --standalone --nnodes 1 --nproc-per-node 8 scripts/pretrain.py \
--model.type "prism-qwen25-extra-dinosiglip-224px+0_5b+fusedfan-projector" \
--dataset.type "llava-lvis4v-lrv" \
--dataset.dataset_root_dir "data/vlm" \
--run_root_dir "pretrained_models/stablevla-fusedfan-projector" \
--stage "finetune" \
--wandb_project "stablevla" \
--wandb_entity "YOUR_WANDB_ENTITY"
LIBERO Fine-tuning
data_name=libero_spatial_no_noops
# Replace with: libero_object_no_noops | libero_goal_no_noops | libero_10_no_noops
CUDA_VISIBLE_DEVICES=0,1,2,3 torchrun --standalone --nnodes 1 --nproc-per-node 4 \
vla-scripts/finetune_fused.py \
--vlm_path pretrained_models/stablevla-fusedfan-projector \
--config_file_path pretrained_models/configs_fusedfan \
--data_root_dir data/libero \
--dataset_name $data_name \
--run_root_dir outputs \
--use_film False \
--num_images_in_input 2 \
--use_proprio True \
--use_lora True \
--use_fz False \
--use_minivlm True \
--image_aug True \
--num_steps_before_decay 150000 \
--max_steps 150005 \
--save_freq 5000 \
--save_latest_checkpoint_only False \
--merge_lora_during_training True \
--batch_size 16 \
--grad_accumulation_steps 1 \
--learning_rate 2e-4 \
--lora_rank 64 \
--use_pro_version True \
--wandb_entity "YOUR_WANDB_ENTITY" \
--wandb_project "$data_name" \
--run_id_note "stablevla" \
> logs/stablevla--${data_name}.log 2>&1 &
GPU memory guide:
| VRAM | Recommended config |
|---|---|
| 10β12 GB (e.g. RTX 3080) | --batch_size 1 --grad_accumulation_steps 16 |
| 24 GB (e.g. RTX 3090/4090) | --batch_size 4 --grad_accumulation_steps 4 |
| 40β80 GB (e.g. A100, H100) | --batch_size 16 --grad_accumulation_steps 1 |
CALVIN Fine-tuning
CUDA_VISIBLE_DEVICES=0,1,2,3 torchrun --standalone --nnodes 1 --nproc-per-node 4 \
vla-scripts/finetune_fused.py \
--vlm_path pretrained_models/stablevla-fusedfan-projector \
--config_file_path pretrained_models/configs_fusedfan \
--data_root_dir data \
--dataset_name calvin_abc \
--run_root_dir outputs \
--use_film False \
--num_images_in_input 2 \
--use_proprio True \
--use_lora True \
--use_fz False \
--use_minivlm True \
--image_aug True \
--num_steps_before_decay 150000 \
--max_steps 150005 \
--save_freq 5000 \
--save_latest_checkpoint_only False \
--merge_lora_during_training True \
--batch_size 16 \
--grad_accumulation_steps 1 \
--learning_rate 2e-4 \
--lora_rank 64 \
--use_pro_version True \
--wandb_entity "YOUR_WANDB_ENTITY" \
--wandb_project "calvin" \
--run_id_note "stablevla" \
> logs/stablevla--calvin.log 2>&1 &
:mechanical_arm: Evaluation
LIBERO β Clean
CUDA_VISIBLE_DEVICES=0 python experiments/robot/libero/run_libero_eval.py \
--use_proprio True \
--num_images_in_input 2 \
--use_film False \
--pretrained_checkpoint outputs/spatial \
--task_suite_name libero_spatial \
--use_pro_version True \
> eval_logs/spatial_clean.log 2>&1 &
Replace spatial / libero_spatial with object/libero_object, goal/libero_goal, or long/libero_10.
LIBERO β With Visual Corruptions
CUDA_VISIBLE_DEVICES=0 python experiments/robot/libero/run_libero_eval_noise.py \
--use_proprio True \
--num_images_in_input 2 \
--use_film False \
--pretrained_checkpoint outputs/spatial \
--task_suite_name libero_spatial \
--use_pro_version True \
--corruption_type impulse_noise \
--corruption_severity 3 \
> eval_logs/spatial_noise.log 2>&1 &
Supported corruption_type: gaussian_noise, impulse_noise, defocus_blur, fog, brightness, and 15 more from ImageNet-C. corruption_severity: 3, 4, or 5.
CALVIN β Clean
CUDA_VISIBLE_DEVICES=0 python vla-scripts/evaluate_calvin.py \
--pretrained_checkpoint outputs/calvin \
> eval_logs/calvin_clean.log 2>&1 &
CALVIN β With Visual Corruptions
CUDA_VISIBLE_DEVICES=0 python vla-scripts/evaluate_calvin_noise.py \
--pretrained_checkpoint outputs/calvin \
--noise_type impulse_noise \
--noise_severity 3 \
> eval_logs/calvin_noise.log 2>&1 &
π Results
LIBERO Benchmark (Success Rate %)
C = Clean, S3/S4/S5 = Severity 3/4/5. Bold = best, underline = second best.
| Training | Method | Params | Spatial C / S3 / S4 / S5 |
Object C / S3 / S4 / S5 |
Goal C / S3 / S4 / S5 |
Long C / S3 / S4 / S5 |
| OpenX Pretrain | OpenVLA | 7B | 80.0 / 40.9 / 24.6 / 14.7 | 69.6 / 18.2 / 10.4 / 2.7 | 74.0 / 38.7 / 27.0 / 16.3 | 55.5 / 20.5 / 12.4 / 7.0 |
| OpenVLA-OFT | 7B | 92.6 / 89.3 / 84.0 / 72.1 | 98.4 / 82.5 / 69.2 / 52.8 | 96.8 / 94.5 / 84.6 / 70.3 | 94.4 / 77.6 / 61.9 / 40.3 | |
| OpenX+Web Co-train | OpenPiβ0.5 | 3B | 98.4 / 88.3 / 79.0 / 62.4 | 99.4 / 97.1 / 88.4 / 76.4 | 97.2 / 87.2 / 82.5 / 64.2 | 92.0 / 76.1 / 65.6 / 47.7 |
| VLM Direct FT | VLA-Adapter | 0.5B | 96.0 / 93.7 / 83.3 / 58.5 | 96.8 / 71.0 / 44.1 / 29.3 | 97.4 / 79.5 / 64.7 / 47.3 | 94.4 / 63.5 / 41.0 / 26.2 |
| StableVLA (Ours) | 0.5B | 96.2 / 94.4 / 92.1 / 82.0 | 98.8 / 92.4 / 83.6 / 70.2 | 98.0 / 93.4 / 85.0 / 71.9 | 93.6 / 76.3 / 62.4 / 45.3 |
CALVIN Benchmark (Avg. Completed Tasks, max 5)
| Method | Params | Clean | Sev 3 | Sev 4 | Sev 5 |
| VLA-Adapter | 0.5B | 4.14 | 2.56 | 1.89 | 1.44 |
| StableVLA (Ours) | 0.5B | 4.17 | 2.77 | 2.11 | 1.51 |
:heart: Acknowledgment
We thank VLA-Adapter, OpenVLA-OFT, MiniVLA, and RoboDual for their open-sourced work.
:pencil2: Citation
If you find StableVLA helpful, please cite our paper:
@inproceedings{fu2026stablevla,
title = {StableVLA: Towards Robust Vision-Language-Action Models without Extra Data},
author = {Fu, Yiyang and Zhang, Chubin and Gong, Shukai and Deng, Yufan and
Sun, Kaiwei and Min, Qiyang and Hou, Qibin and Tang, Yansong and
Wang, Jianan and Zhou, Daquan},
booktitle = {International Conference on Machine Learning (ICML)},
year = {2026},
}