# evo-1
**Repository Path**: markgosling/evo-1
## Basic Information
- **Project Name**: evo-1
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-04-29
- **Last Updated**: 2026-05-06
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Evo-1: Lightweight Vision-Language-Action Model with Preserved Semantic Alignment [CVPR 2026]
[](https://arxiv.org/abs/2511.04555)
[](https://huggingface.co/MINT-SJTU/Evo1_MetaWorld/tree/main)
[](https://huggingface.co/MINT-SJTU/Evo1_LIBERO/tree/main)
[](https://huggingface.co/datasets/MINT-SJTU/Evo1_MetaWorld_Dataset/tree/main)
[](https://mint-sjtu.github.io/Evo-1.io/)
## ๐ฐ News
- ๐๏ธ **2026-04-10** โ Updated the `evo1-flash` branch: faster training with reduced GPU memory usage.
- ๐๏ธ **2026-04-10** โ Updated the `evo1-lerobot` branch: Evo-1 is now fully integrated into the LeRobot framework.
- ๐๏ธ **2026-04-08** โ Evo-1 is now fully integrated into the LeRobot framework!
- ๐๏ธ **2026-04-08** โ We released Evo-1 Docker support for Jetson (https://huggingface.co/datasets/MINT-SJTU/Evo-1_JetsonOrin).
- ๐๏ธ **2026-02-20** โ Evo-1 is accepted by CVPR 2026 ๐๐
- ๐๏ธ **2025-12-15** โ Added Evo-1 inference code in Aloha dual arm (Implemented by community user @meijie-jesse)
- ๐๏ธ **2025-11-15** โ Added Evo-1 inference in the LeRobot framework for SO100/SO101
- ๐๏ธ **2025-11-10** โ Released inference script in xarm6
- ๐๏ธ **2025-11-06** โ Released Meta-World & LIBERO evaluation scripts
- ๐๏ธ **2025-11-06** โ Uploaded model weights to HuggingFace
- ๐๏ธ **2025-11-06** โ Released official code
## โ
To-Do List
- โ
Release inference script in xarm6
- โ
Update `evo1-flash` branch (faster training + reduced GPU memory usage)
- โ
Update `evo1-lerobot` branch (fully integrated Evo-1 into the LeRobot framework)
- โ
Release instructions for deploying Evo-1 on Jetson Orin (https://huggingface.co/datasets/MINT-SJTU/Evo-1_JetsonOrin)
- โฌ Release results of all 50 RoboTwin tasks
- โฌ Release RoboTwin evaluation script
## โ๏ธ Installation
Prepare the environment for Evo-1
```bash
# Clone this repo
git clone https://github.com/MINT-SJTU/Evo-1.git
cd Evo-1/
# Create a Conda environment
conda create -n Evo1 python=3.10 -y
conda activate Evo1
# Install requirements
cd Evo_1
pip install -r requirements.txt
# You may need to reduce MAX_JOBS to suit your computer
# (!!! This is a critical step โ skipping it may cause lower success rate or unstable robot motion !!!)
MAX_JOBS=64 pip install -v flash-attn --no-build-isolation
```
## Simulation Benchmark
### ๐งช Meta-World Benchmark
### 1๏ธโฃ Prepare the environment for Meta-World
```bash
conda create -n metaworld python=3.10 -y
conda activate metaworld
pip install mujoco
pip install metaworld
pip install websockets
pip install opencv-python
pip install packaging
pip install huggingface_hub
```
### 2๏ธโฃ Model Preparation
### ๐ฅ 2.1 Download Model Weight
```bash
hf download MINT-SJTU/Evo1_MetaWorld --local-dir /path/to/save/checkpoint/
```
### โ๏ธ 2.2 Modify config
Modify checkpoint dir: [Evo1_server.py#L149](Evo_1/scripts/Evo1_server.py#L149)
(Optional) Modify server port: [Evo1_server.py#L152](Evo_1/scripts/Evo1_server.py#L152)
(Optional) Modify client port: [mt50_evo1_client_prompt.py#L40](MetaWorld_evaluation/mt50_evo1_client_prompt.py#L40)
### 3๏ธโฃ Run Meta-World Evaluation
```bash
# Terminal 1
conda activate Evo1
cd Evo_1
python scripts/Evo1_server.py
```
```bash
# Terminal 2
conda activate metaworld
cd MetaWorld_evaluation
python mt50_evo1_client_prompt.py
```
---
### ๐งช LIBERO Benchmark
### 1๏ธโฃ Prepare the environment for LIBERO
```bash
conda create -n libero python=3.8.13 -y
conda activate libero
cd LIBERO_evaluation/
git clone https://github.com/Lifelong-Robot-Learning/LIBERO.git
cd LIBERO
pip install -r requirements.txt
pip install torch==1.11.0+cu113 torchvision==0.12.0+cu113 torchaudio==0.11.0 --extra-index-url https://download.pytorch.org/whl/cu113
pip install -e .
pip install websockets
pip install huggingface_hub
```
### 2๏ธโฃ Model Preparation
### ๐ฅ 2.1 Download Model Weight
```bash
hf download MINT-SJTU/Evo1_LIBERO --local-dir /path/to/save/checkpoint/
```
### โ๏ธ 2.2 Modify config
Modify checkpoint dir: [Evo1_server.py#L149](Evo_1/scripts/Evo1_server.py#L149)
Modify ckpt name: [libero_client_4tasks.py#L24](LIBERO_evaluation/libero_client_4tasks.py#L24)
(Optional) Modify server port: [Evo1_server.py#L152](Evo_1/scripts/Evo1_server.py#L152)
(Optional) Modify client port: [libero_client_4tasks.py#L23](LIBERO_evaluation/libero_client_4tasks.py#L23)
#### 3๏ธโฃ Run LIBERO Evaluation
```bash
# Terminal 1
conda activate Evo1
cd Evo_1
python scripts/Evo1_server.py
```
```bash
# Terminal 2
conda activate libero
cd LIBERO_evaluation
python libero_client_4tasks.py
```
## ๐ง Training on Your Own Dataset
We support **lerobot v2.1** format, please convert your data to this format.
We use MetaWorld Dataset here as an example.
### ๐ฅ 1. Download Dataset
```bash
mkdir Evo1_training_dataset/
cd Evo1_training_dataset/
GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/datasets/MINT-SJTU/Evo1_MetaWorld_Dataset
cd Evo1_MetaWorld_Dataset/
git lfs pull
```
### โ๏ธ 2 Modify config
### โ๏ธ 2.1 Modify config.yaml
You need to modify the [config.yaml](Evo_1/dataset/config.yaml)
This is used to set the dataset path and the camera mapping.
### โ๏ธ 2.2 Set the cache path
You need to change the [cache_dir](Evo_1/dataset/lerobot_dataset_pretrain_mp.py#L174)
Set the cache path so the dataset can be loaded from .pkl files next time for faster loading.
### ๐ 3 Start Training
We use the two-stage training paradigm.
### ๐ 3.1 Setup deepspeed
```bash
accelerate config
```
You can check this [setup guide](deepspeed_setup_example.txt)
### ๐ 3.2 Stage 1
We only train the integration module and action expert in stage 1.
If you are training with multiple GPU, set --num_processes to the GPU number.
You need to change the --run_name,--save_dir,--resume_path base on your own config.
```bash
conda activate Evo1
cd Evo_1/
accelerate launch --num_processes 1 --num_machines 1 --deepspeed_config_file ds_config.json scripts/train.py --run_name Evo1_metaworld_stage1 --action_head flowmatching --use_augmentation --lr 1e-5 --dropout 0.2 --weight_decay 1e-3 --batch_size 16 --image_size 448 --max_steps 5000 --log_interval 10 --ckpt_interval 2500 --warmup_steps 1000 --grad_clip_norm 1.0 --num_layers 8 --horizon 50 --finetune_action_head --disable_wandb --vlm_name OpenGVLab/InternVL3-1B --dataset_config_path dataset/config.yaml --per_action_dim 24 --state_dim 24 --save_dir /your/path/checkpoints/stage1
```
### ๐ 3.3 Stage 2
We perform Full-scale training in stage 2.
```bash
conda activate Evo1
cd Evo_1/
accelerate launch --num_processes 1 --num_machines 1 --deepspeed_config_file ds_config.json scripts/train.py --run_name Evo1_metaworld_stage2 --action_head flowmatching --use_augmentation --lr 1e-5 --dropout 0.2 --weight_decay 1e-3 --batch_size 16 --image_size 448 --max_steps 80000 --log_interval 10 --ckpt_interval 2500 --warmup_steps 1000 --grad_clip_norm 1.0 --num_layers 8 --horizon 50 --finetune_vlm --finetune_action_head --disable_wandb --vlm_name OpenGVLab/InternVL3-1B --dataset_config_path dataset/config.yaml --per_action_dim 24 --state_dim 24 --save_dir /your/path/checkpoints/stage2 --resume --resume_pretrain --resume_path /your/path/checkpoints/stage1/step_5000
```
### ๐ 3.4 (Optional) Resume
If you want to resume the training process, you can use the following command (we use stage 2 as an example):
```bash
accelerate launch --num_processes 1 --num_machines 1 --deepspeed_config_file ds_config.json scripts/train.py --run_name Your_own_name --action_head flowmatching --use_augmentation --lr 1e-5 --dropout 0.2 --weight_decay 1e-3 --batch_size 16 --image_size 448 --max_steps 80000 --log_interval 10 --ckpt_interval 2500 --warmup_steps 1000 --grad_clip_norm 1.0 --num_layers 8 --horizon 50 --finetune_vlm --finetune_action_head --disable_wandb --vlm_name OpenGVLab/InternVL3-1B --dataset_config_path dataset/config.yaml --per_action_dim 24 --state_dim 24 --save_dir /your/path/to/save/the/checkpoints/ --resume --resume_path /the/checkpoint/path/you/want/to/resume/from/step_20000
```
## ๐ฆพ 4. Inference in Your Own Embodiment
We provide an example of inference client script [Evo1_client_xarm6](Evo_1/scripts/Evo1_client_xarm6.py) for xArm6.
The key is to construct an observation dict and pass it to the server.
```bash
obs = {
# You need to change the image size to 448x448 before send in obs
"image": [base_proc.tolist(), wrist_proc.tolist(), dummy_proc.tolist()],
# This shows which image is valid.
"image_mask": [int(i) for i in [1, 1, 0]],
# This is the state of the robot.
"state": state.astype(float).tolist(),
# This is the action mask that shows which action is valid.
"action_mask": [[int(i) for i in action_mask[0]]],
# This is the instruction of the task
"prompt": task_instruction
}
try:
# Send the observation to the server
await ws.send(json.dumps(obs))
result = await ws.recv()
# Get the action chunk
action_chunk = torch.tensor(json.loads(result))
except Exception as e:
print(f"โ Inference Error: {e}")
await asyncio.sleep(0.5)
continue
```
## ๐ค 5.Inference in Lerobot SO100/SO101
For detailed instructions, please check out the `evo1-lerobot` branch.
## ๐ Citation
```bash
@article{lin2025evo,
title={Evo-1: Lightweight Vision-Language-Action Model with Preserved Semantic Alignment},
author={Lin, Tao and Zhong, Yilei and Du, Yuxin and Zhang, Jingjing and Liu, Jiting and Chen, Yinxinyu and Gu, Encheng and Liu, Ziyan and Cai, Hongyi and Zou, Yanwen and others},
journal={arXiv preprint arXiv:2511.04555},
year={2025}
}
```
## ๐ฌ Contact
If you encounter any issues or have suggestions,
please open an issue or start a discussion on GitHub.
We sincerely welcome your feedback and contributions.
You can also scan the QR code below to connect with me or join chatting group on WeChat: