Official implementation of "Domain Arithmetic: One-Shot VLA Adaptation under Environmental Shifts" (ECCV 2026).
Taewook Kang* | Taeheon Kim* | Donghyun Shin | Jonghyun Choi†
* Equal contribution † Corresponding author
TL;DR. Domain ARiThmetic (DART) adapts multi-task vision-language-action (VLA) models to environmental shifts using only one demonstration of one task through subspace-aligned weight arithmetic.
This repository provides:
- one-shot fine-tuning scripts for
π₀.₅on LIBERO visual-shift data, - the DART implementation in
domain_arithmetic/, LIBERO-viewevaluation scripts.
- Release the paper on arXiv.
- Launch the project page.
- Release code.
- Upload one-shot fine-tuning datasets and checkpoints.
Clone the repository with submodules:
git clone --recurse-submodules git@github.com:snumprlab/dart.git
cd dartIf you already cloned the repository, initialize the submodules manually:
git submodule update --init --recursiveWe use uv to manage Python dependencies. After installing uv, set up the environment with:
GIT_LFS_SKIP_SMUDGE=1 uv sync
GIT_LFS_SKIP_SMUDGE=1 uv pip install -e .GIT_LFS_SKIP_SMUDGE=1 is required because LeRobot is pulled as a dependency.
We use the pi05_libero checkpoint from openpi as the source-trained multi-task VLA model. The checkpoint is trained on the LIBERO benchmark:
gs://openpi-assets/checkpoints/pi05_libero
By default, OpenPI downloads this checkpoint from gs://openpi-assets and caches it under ~/.cache/openpi. To change the cache location, set:
export OPENPI_DATA_HOME=/path/to/openpi_cacheOne-shot fine-tuning expects a LeRobot-format LIBERO dataset. Set DATA_REPO_ID to either a local dataset path or a Hugging Face dataset repo id.
Supported third-person camera views are:
original (source), small, medium, large
For visual perturbations, use a separate dataset for each perturbation type.
Use exec/finetune.sh to fine-tune π₀.₅ on a selected camera view:
DATA_REPO_ID=/path/to/dataset \
CHECKPOINT_BASE_DIR=/path/to/checkpoints \
CAMERA_VIEW=medium \
CUDA_VISIBLE_DEVICES={GPU IDs} \
bash exec/finetune.shCommon options:
| Variable | Default | Description |
|---|---|---|
CONFIG |
pi05_libero_oneshotft |
Training config |
CAMERA_VIEW |
original |
Viewpoint shifts |
BATCH_SIZE |
64 |
Training batch size |
NUM_TRAIN_STEPS |
1000 |
Number of fine-tuning steps |
SAVE_INTERVAL |
1000 |
Checkpoint save interval |
⚠️ Warning: The current DART implementation can require more than 100 GB of RAM. This may be reduced with further optimization.
DART requires three policies:
base_policy: the original source-trained VLA model,policy_src: a one-shot policy fine-tuned in the source environment,policy_tgt: a one-shot policy fine-tuned in the target shifted environment.
The adapted policy is computed by applying the target-domain update after subtracting the source-specific component in an aligned subspace.
Run the example script:
bash exec/run_dart.shOr run DART directly:
uv run -m domain_arithmetic.dart \
--cfg.base_policy.dir /path/to/base_policy \
--cfg.base_policy.config pi05_libero \
--cfg.policy_src.dir /path/to/source_oneshot_policy \
--cfg.policy_src.config pi05_libero_oneshotft \
--cfg.policy_tgt.dir /path/to/target_oneshot_policy \
--cfg.policy_tgt.config pi05_libero_oneshotft \
--cfg.scaling_coef 0.8 \
--cfg.output_dir /path/to/output/DART_0.8 \
--cfg.overwriteThe merged checkpoint is saved to --cfg.output_dir and can be evaluated with the same pi05_libero policy config.
Evaluation uses Docker to serve the policy and run LIBERO-view, a modified version of LIBERO for visual shifts.
Evaluate the default pi05_libero checkpoint:
GPU_ID=0 \
TASK_SUITE_NAME=libero_spatial \
CAMERA_VIEW=medium \
bash exec/eval.shEvaluate a DART checkpoint:
GPU_ID=0 \
POLICY_CONFIG=pi05_libero \
CHECKPOINT_DIR=/path/to/output/DART_0.8 \
TASK_SUITE_NAME=libero_spatial \
CAMERA_VIEW=medium \
bash exec/eval.shAdd PERTURB argument to evaluate with visual perturbations:
GPU_ID=0 \
POLICY_CONFIG=pi05_libero \
CHECKPOINT_DIR=/path/to/output/DART_0.8 \
TASK_SUITE_NAME=libero_spatial \
CAMERA_VIEW=medium \
PERTURB=light_noise \
bash exec/eval.shUseful evaluation variables:
| Variable | Default | Description |
|---|---|---|
GPU_ID |
0 |
Host GPU id used for evaluation |
POLICY_CONFIG |
pi05_libero |
OpenPI policy config |
CHECKPOINT_DIR |
empty | Custom checkpoint path; empty uses the default LIBERO checkpoint |
TASK_SUITE_NAME |
libero_spatial |
LIBERO task suite |
CAMERA_VIEW |
original |
Evaluation camera view |
PERTURB |
empty | Optional visual perturbation: light or light_noise |
@inproceedings{kang2026dart,
title = {Domain Arithmetic: One-Shot VLA Adaptation under Environmental Shifts},
author = {Kang, Taewook and Kim, Taeheon and Shin, Donghyun and Choi, Jonghyun},
booktitle = {ECCV},
year = {2026},
}