NORA-1.5: A Vision-Language-Action Model Trained using World Model- and Action-based Preference Rewards
🔥 Project NORA is supported by Gemini and Lambda Labs! We are thankful to them.
NORA-1.5 is a Vision-Language-Action (VLA) model that improves generalization and real-world decision making through post-training with world-model-based and action-based preference rewards.
The model builds upon the NORA foundation to achieve stronger instruction following, closed-loop control, and real-robot success, demonstrating reliability across LIBERO and SimplerEnv environments.
This repository consolidates the full open-source release of model checkpoints, inference code, training code, and evaluation tools, along with documentation and examples.
First, prepare a conda environment.
conda create -n nora1_5 python=3.10 -y
conda activate nora1_5
Clone repository
git clone https://github.com/declare-lab/nora-1.5.git
Install requirements
pip install -r requirements.txt
🔗 https://declare-lab.github.io/nora-1.5
- Vision-Language-Action architecture with enhanced task completion rate and distraction rate
- Action-based preference optimization using expert preference rewards
- World-model-based preference learning for improved planning and consistency
- Strong closed-loop control, enabling deployment in real robot settings
- Supports multi-task, long-horizon, and few-shot generalization
- Compatible with LeRobot, LIBERO, SimplerEnv, and custom environments
- Release the inference code of Nora-1.5
- Release all relevant model checkpoints(Pretrained, libero, SimplerEnv etc)
- Release the training/fine-tuning code of Nora-1.5 with LeRobot Dataset
- Release SimplerEnv evaluation code
from inference.modelling_expert import VLAWithExpert
model = VLAWithExpert.from_pretrained("declare-lab/nora-1.5")
outputs = model.sample_actions(PIL IMAGE,instruction,num_steps=10) ## Outputs 7 Dof action of normalized actionTo train/finetune NORA-1.5 on your own Lerobot dataset, there are 2 main steps that is required.
1: Compute normalization statistic of your Lerobot dataset. Note that NORA-1.5 is pretrained in delta action space, hence we will need to compute the normalization statistic for delta action.
Run the script
python python utils/compute_norm_stats.py --dataset_path='YOUR LEROBOT DATASET' --delta_transform
This will create a norm_stats.json in your lerobot dataset local directory, or remote directory (base on whether your dataset is local on remote).
If your dataset is in delta action space and you have already computed the normalization statistic, you may skip this step.
2: Modify the REMAP_KEY for mapping dictionary key name in your lerobot dataset.
nora-1.5/training/lerobot/train_lerobot.py
Lines 37 to 42 in be13766
We use huggingface's accelerator for training. Set up your accelerate config via python accelerate config
Run training with accelerate launch --config_file='config.yaml' training/lerobot/train_lerobot.py!!!
We jointly optimize cross entropy loss(on FAST token) and flow matching loss on action expert, hence we can use sample discrete action via FAST tokenizer, or continous action via flow matching (action expert). Base on our experiment on Galaxea A1, we found that discrete action performs better than continous action. However, in simulation such as SimplerEnv and LIBERO, continous action outpeform discrete action. Feel free to try both action sampling method.
| Model Name | Backbone | Note |
|---|---|---|
| declare-lab/nora-1.5 | declare-lab/nora-1.5 | Pretrained on OXE. Jointly optimize cross entropy loss and flow matching loss |
| declare-lab/nora-1.5-fractal-dpo | declare-lab/nora-1.5 | Finetuned on fractal and perform DPO via the method detailed in the paper |
| declare-lab/nora-1.5-libero | declare-lab/nora-1.5 | Finetuned on 4 LIBERO subset mixed |
Navigate to https://github.com/hungchiayu1/SimplerEnv-OpenVLA
We used OpenVLA's code base to perform LIBERO evaluation. To perform LIBERO evaluation, follow the instruction in OpenVLA and set up the evaluation accordingly.
Copy the inference folder to openvla/experiments/robot/libero and modify the inference function of run_libero_eval.py in OpenVLA's codebase.
from inference.modelling_expert import VLAWithExpert
model = VLAWithExpert.from_pretrained("declare-lab/nora-1.5-libero")
outputs = model.sample_actions(PIL IMAGE,instruction,num_steps=10) ## Outputs 7 Dof action of normalized actionThis repository is built based on OpenVLA, Open X-Embodiment,transformers, accelerate, Qwen2.5 VL, Lerobot, SpatialVLA. Thanks! . Thanks for their contribution!
@article{hung2025nora15,
title={NORA-1.5: A Vision-Language-Action Model Trained using World Model- and Action-Based Preference Rewards},
author={Hung, Chia-Yu and Majumder, Navonil and Deng, Haoyuan, Liu Renhang, Yankang Ang, Amir Zadeh, Chuan Li, Dorien Herremans, Ziwei Wang, and Soujanya Poria},
journal={arXiv preprint},
year={2025}
}