EnsembleVLA: Ensemble Learning for Vision-Language Action Models (ICML 2026)

July 16, 2026 · View on GitHub

EnsembleVLA: Ensemble Learning for Vision-Language Action Models (ICML 2026)

Mingchen Song1 2, Xiang Deng1 3, Jie Wei1, Dongmei Jiang2, Liqiang Nie1, Weili Guan1 3
1Harbin Institute of Technology, Shenzhen   2PengCheng Laboratory   3Shenzhen Loop Area Institute


ICML 2026 Paper GitHub Hugging Face

📖 Introduction

Recent Vision-Language-Action (VLA) models have demonstrated strong capabilities in robotic manipulation, yet how to effectively ensemble heterogeneous VLAs remains largely underexplored. Unlike discriminative predictors, generative action policies often represent high-dimensional and multimodal action distributions, which makes conventional ensemble strategies such as voting or direct action averaging insufficient for robust policy composition.

We propose EnsembleVLA, an energy-based framework for principled composition of diverse VLA policies. EnsembleVLA formulates diffusion-based and flow-based VLA models under a unified energy perspective, where additive energy aggregation naturally induces policy composition at the distribution level. This formulation allows multiple pretrained policies to remain frozen while being aggregated into a stronger ensemble policy that can exploit their complementary action modes.

Building on this compositional view, EnsembleVLA introduces learnable composition weights for dynamic policy balancing, together with a confidence-aware gating mechanism that modulates bounded residual corrections. The resulting policy maintains compatibility with the RoboTwin2 rollout interface: each base policy is queried under its own observation and language context, and the composed action is executed in the simulator for stable task completion.

EnsembleVLA overview

⚙️ Environment Setup

This project should be installed on top of a working RoboTwin2 environment. Please first follow the official RoboTwin2 documentation for installation, asset download, configuration files, and policy evaluation:

A typical setup is:

git clone https://github.com/MingC715/EnsembleVLA.git
cd EnsembleVLA

conda create -n RoboTwin python=3.10 -y
conda activate RoboTwin

mkdir -p external
git clone https://github.com/RoboTwin-Platform/RoboTwin.git external/RoboTwin
cd external/RoboTwin
bash script/_install.sh
bash script/_download_assets.sh
python script/update_embodiment_config_path.py
cd ../..

After RoboTwin2 is installed, make the assets visible to this repository and check that the task, camera, and embodiment configuration files point to your local installation:

ln -s /path/to/RoboTwin/assets assets

Recommended runtime variables for headless GPU evaluation are:

export PYOPENGL_PLATFORM=egl
export MUJOCO_GL=egl
export SAPIEN_OFFSCREEN_ONLY=1
export NVIDIA_DRIVER_CAPABILITIES=compute,utility,graphics
export TORCH_EXTENSIONS_DIR=${TORCH_EXTENSIONS_DIR:-$HOME/.cache/torch_extensions}

The base policy backends should be available under policy/:

policy/DP/       # Diffusion Policy backend
policy/DP3/      # 3D Diffusion Policy backend
policy/pi05/     # pi0.5 / openpi backend

Then install the EnsembleVLA composition/evaluation dependencies and the base policy backends you plan to use:

# EnsembleVLA composition & evaluation dependencies
pip install -r policy/Ensemble-Policy-easy/requirements.txt

# Base policy backends (install the ones you evaluate):
pip install -e policy/DP                        # Diffusion Policy (DP)
pip install -e policy/DP3/3D-Diffusion-Policy   # 3D Diffusion Policy (DP3)
pip install -e policy/pi05                       # pi0.5 / openpi

For backend-specific setup, also follow the RoboTwin2 policy pages and the corresponding upstream repositories.

📦 Checkpoints

We release both the lightweight EnsembleVLA heads and the required base policy checkpoints on Hugging Face: mingchens/EnsembleVLA. After downloading the release assets, place or symlink them under best_checkpoint/ using the layout below.

Download with Git LFS:

git lfs install
git clone https://huggingface.co/mingchens/EnsembleVLA hf_assets
rsync -a hf_assets/best_checkpoint/ best_checkpoint/

Expected best-checkpoint layout:

best_checkpoint/
+-- dp+dp3/<task>/
|   +-- ensemble_checkpoint/best.pt
|   +-- base_dp/<ckpt>.ckpt
|   +-- base_dp3/<ckpt>.ckpt
+-- dp+pi0.5/<task>/
    +-- ensemble_checkpoint/best.pt
    +-- base_dp/<ckpt>.ckpt
    +-- base_pi05_checkpoint_dir/
        +-- model.safetensors
        +-- metadata.pt
        +-- assets/<task>/norm_stats.json

Only inference checkpoints are required for evaluation. Raw optimizer states, training logs, and rollout logs are not required.

DP + DP3 Checkpoints

TaskEnsemble policy checkpointBase DP checkpointBase DP3 checkpoint
beat_block_hammerbest_checkpoint/dp+dp3/beat_block_hammer/ensemble_checkpoint/best.ptbest_checkpoint/dp+dp3/beat_block_hammer/base_dp/base_dp.ckptbest_checkpoint/dp+dp3/beat_block_hammer/base_dp3/base_dp3.ckpt
open_laptopbest_checkpoint/dp+dp3/open_laptop/ensemble_checkpoint/best.ptbest_checkpoint/dp+dp3/open_laptop/base_dp/base_dp.ckptbest_checkpoint/dp+dp3/open_laptop/base_dp3/base_dp3.ckpt
click_alarmclockbest_checkpoint/dp+dp3/click_alarmclock/ensemble_checkpoint/best.ptbest_checkpoint/dp+dp3/click_alarmclock/base_dp/base_dp.ckptbest_checkpoint/dp+dp3/click_alarmclock/base_dp3/base_dp3.ckpt
move_playingcard_awaybest_checkpoint/dp+dp3/move_playingcard_away/ensemble_checkpoint/best.ptbest_checkpoint/dp+dp3/move_playingcard_away/base_dp/base_dp.ckptbest_checkpoint/dp+dp3/move_playingcard_away/base_dp3/base_dp3.ckpt
place_bread_skilletbest_checkpoint/dp+dp3/place_bread_skillet/ensemble_checkpoint/best.ptbest_checkpoint/dp+dp3/place_bread_skillet/base_dp/base_dp.ckptbest_checkpoint/dp+dp3/place_bread_skillet/base_dp3/base_dp3.ckpt
dump_bin_bigbinbest_checkpoint/dp+dp3/dump_bin_bigbin/ensemble_checkpoint/best.ptbest_checkpoint/dp+dp3/dump_bin_bigbin/base_dp/base_dp.ckptbest_checkpoint/dp+dp3/dump_bin_bigbin/base_dp3/base_dp3.ckpt
handover_blockbest_checkpoint/dp+dp3/handover_block/ensemble_checkpoint/best.ptbest_checkpoint/dp+dp3/handover_block/base_dp/base_dp.ckptbest_checkpoint/dp+dp3/handover_block/base_dp3/base_dp3.ckpt
stack_bowls_threebest_checkpoint/dp+dp3/stack_bowls_three/ensemble_checkpoint/best.ptbest_checkpoint/dp+dp3/stack_bowls_three/base_dp/base_dp.ckptbest_checkpoint/dp+dp3/stack_bowls_three/base_dp3/base_dp3.ckpt

DP + pi0.5 Checkpoints

TaskEnsemble policy checkpointBase DP checkpointBase pi0.5 checkpoint
beat_block_hammerbest_checkpoint/dp+pi0.5/beat_block_hammer/ensemble_checkpoint/best.ptbest_checkpoint/dp+pi0.5/beat_block_hammer/base_dp/base_dp.ckptbest_checkpoint/dp+pi0.5/beat_block_hammer/base_pi05_checkpoint_dir/base_pi05_checkpoint_dir.safetensors
open_laptopbest_checkpoint/dp+pi0.5/open_laptop/ensemble_checkpoint/best.ptbest_checkpoint/dp+pi0.5/open_laptop/base_dp/base_dp.ckptbest_checkpoint/dp+pi0.5/open_laptop/base_pi05_checkpoint_dir/base_pi05_checkpoint_dir.safetensors
click_alarmclockbest_checkpoint/dp+pi0.5/click_alarmclock/ensemble_checkpoint/best.ptbest_checkpoint/dp+pi0.5/click_alarmclock/base_dp/base_dp.ckptbest_checkpoint/dp+pi0.5/click_alarmclock/base_pi05_checkpoint_dir/base_pi05_checkpoint_dir.safetensors
move_playingcard_awaybest_checkpoint/dp+pi0.5/move_playingcard_away/ensemble_checkpoint/best.ptbest_checkpoint/dp+pi0.5/move_playingcard_away/base_dp/base_dp.ckptbest_checkpoint/dp+pi0.5/move_playingcard_away/base_pi05_checkpoint_dir/base_pi05_checkpoint_dir.safetensors
place_bread_skilletbest_checkpoint/dp+pi0.5/place_bread_skillet/ensemble_checkpoint/best.ptbest_checkpoint/dp+pi0.5/place_bread_skillet/base_dp/base_dp.ckptbest_checkpoint/dp+pi0.5/place_bread_skillet/base_pi05_checkpoint_dir/base_pi05_checkpoint_dir.safetensors
dump_bin_bigbinbest_checkpoint/dp+pi0.5/dump_bin_bigbin/ensemble_checkpoint/best.ptbest_checkpoint/dp+pi0.5/dump_bin_bigbin/base_dp/base_dp.ckptbest_checkpoint/dp+pi0.5/dump_bin_bigbin/base_pi05_checkpoint_dir/base_pi05_checkpoint_dir.safetensors
handover_blockbest_checkpoint/dp+pi0.5/handover_block/ensemble_checkpoint/best.ptbest_checkpoint/dp+pi0.5/handover_block/base_dp/base_dp.ckptbest_checkpoint/dp+pi0.5/handover_block/base_pi05_checkpoint_dir/base_pi05_checkpoint_dir.safetensors
stack_bowls_threebest_checkpoint/dp+pi0.5/stack_bowls_three/ensemble_checkpoint/best.ptbest_checkpoint/dp+pi0.5/stack_bowls_three/base_dp/base_dp.ckptbest_checkpoint/dp+pi0.5/stack_bowls_three/base_pi05_checkpoint_dir/base_pi05_checkpoint_dir.safetensors

Each pi0.5 base also needs metadata.pt and the assets/ folder from the same base_pi05_checkpoint_dir/ (both on Hugging Face).

See docs/checkpoints.md for the full checkpoint manifest.

🧪 Evaluation

DP + DP3 example:

conda activate RoboTwin
bash policy/Ensemble-Policy-easy/eval_wlearn.sh \
  beat_block_hammer DP DP3 0 best L515 100 0 100 base base \
  best_checkpoint/dp+dp3/beat_block_hammer/ensemble_checkpoint

DP + pi0.5 example:

conda activate RoboTwin
bash policy/Ensemble-Policy-easy/eval_wlearn.sh \
  click_alarmclock DP pi05 0 best L515 100 0 100 100 1000 \
  best_checkpoint/dp+pi0.5/click_alarmclock/ensemble_checkpoint

Arguments:

task policy1 policy2 gpu ensemble_ckpt camera data_num seed test_num policy1_ckpt policy2_ckpt output_dir [composition_mode] [policy2_use_pytorch]

For DP + pi0.5 evaluation, pass the released composition mode argument used by eval_wlearn.sh and set policy2_use_pytorch=true.

🗂️ Project Structure

EnsembleVLA-ICML2026/
+-- README.md
+-- docs/
|   +-- checkpoints.md
+-- description/
+-- envs/
+-- task_config/
+-- script/
|   +-- eval_policy.py
+-- policy/
|   +-- DP/
|   +-- DP3/
|   +-- pi05/
|   +-- Ensemble-Policy-easy/
|       +-- composition.py
|       +-- energy_head.py
|       +-- eval.py
|       +-- eval_wlearn.py
|       +-- eval_wlearn.sh
+-- best_checkpoint/
    +-- dp+dp3/
    +-- dp+pi0.5/

🙏 Acknowledgement

We thank the open-source projects RoboTwin2 and GPC for making their code and tools publicly available.

📚 Citation

@inproceedings{song2026ensemblevla,
  title={EnsembleVLA: Ensemble Learning for Vision-Language Action Models},
  author={Song, Mingchen and Deng, Xiang and Wei, Jie and Jiang, Dongmei and Nie, Liqiang and Guan, Weili},
  booktitle={International Conference on Machine Learning},
  year={2026}
}