NORA-1.5: A Vision-Language-Action Model Trained using World Model- and Action-based Preference Rewards
See the code🔥 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
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 action
To 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. https://github.com/declare-lab/nora-1.5/blob/be1376679daad51601e96889efaded00d7243d62/training/lerobot/train_lerobot.py#L37-L42 Set up training hyperparameter, dataset_dir, output_dir in training/lerobot/train_lerobot.py
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.
Navigate to training/post_training
| 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 action
This 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}
}
Please email me at chiayu001 at e.ntu.edu.sg
85 followers · starred Nov 2025
NORA-1.5: A Vision-Language-Action Model Trained using World Model- and Action-based Preference Rewards
See the code🔥 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
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 action
To 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. https://github.com/declare-lab/nora-1.5/blob/be1376679daad51601e96889efaded00d7243d62/training/lerobot/train_lerobot.py#L37-L42 Set up training hyperparameter, dataset_dir, output_dir in training/lerobot/train_lerobot.py
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.
Navigate to training/post_training
| 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 action
This 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}
}
Please email me at chiayu001 at e.ntu.edu.sg
85 followers · starred Nov 2025