[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

Paper Project Page HuggingFace

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

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:

FolderDescription
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:

VRAMRecommended 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 OpenVLA7B 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-OFT7B 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.53B 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-Adapter0.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-Adapter0.5B4.142.561.891.44
StableVLA (Ours)0.5B4.172.772.111.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},
}