Contributors: Songlin Wei, Hongyi Jing, Boqian Li, Zhenyu Zhao, Jiageng Mao, Zhenhao Ni , Sicheng He, Jie Liu, Xiawei Liu, Kaidi Kang, Sheng Zang,Weiduo Yuan, Marco Pavone, Di Huang, Yue Wang
Our foundation model is capable of acquiring new long-horizontal dexterous loco-manipulation skill by fine-tuning using as few as 80 trajectories. Our key finding is that scaling the right data in the right way.
At the top, the
- Finetune Ψ₀ on Unitree G1 Humanoid Robot
- Baselines
- Simulation
- Reproduce Ψ₀: Pre-Training and Post-Training
- Checkpoints
- Troubleshootings
- Citation
Clone the project and change directory to the project root:
git clone git@github.com:physical-superintelligence-lab/Psi0.git
cd Psi0We use uv to manage Python dependencies. Install uv if not already installed:
curl -LsSf https://astral.sh/uv/install.sh | shSet up the
ℹ️ We manage the
$\Psi_0$ environment and all the baselines throughuvand they all share the samesrc/code. See Environment Management for more details.
uv venv .venv-psi --python 3.10
source .venv-psi/bin/activate
GIT_LFS_SKIP_SMUDGE=1 uv sync --all-groups --index-strategy unsafe-best-match --active
uv pip install flash_attn==2.7.4.post1 --no-build-isolation
Test installation, a version number should be displayed.
python -c "import psi;print(psi.__version__)"Verify the shared lerobot stack is importable.
python -c "from psi.data.lerobot.compat import LEROBOT_LAYOUT; print(LEROBOT_LAYOUT)"📂 We open-sourced all the 9 real-world tasks. You can directly download the data and jump to the Fine-Tuning.
🔥 We first release our internal test data collection pipeline which uses Apple Vision Pro to teleoperate Unitree G1 humanoid Robot with two Dex3-1 hands.
See the detailed teleoperation guide here:
Real-World Teleoperation Guide
export task=Hug_box_and_move
hf download USC-PSI-Lab/psi-data \
g1_real_raw/$task.zip \
--local-dir=$PSI_HOME/data/real_teleop_g1 \
--repo-type=dataset
unzip $PSI_HOME/data/real_teleop_g1/g1_real_raw/$task.zip -d $PSI_HOME/data/real_teleop_g1/g1_real_raw/$task
You should observe similar folder structure:
g1_real_raw
└── Hug_box_and_move
├── episode_0
│ ├── color
│ │ ├── frame_000000.jpg
│ │ └── ...
│ └── data.json
└── ...
Edit the task description file with the following format, eg.,
vim scripts/data/task_description_dict.json
{
"Hug_box_and_move": "Hug box and move."
}
Run conversion script
python scripts/data/raw_to_lerobot.py \
--data-root=/hfm/data/real_teleop_g1/g1_real_raw \
--work-dir=/hfm/data/real \
--repo-id=psi0-real-g1 \
--robot-type=g1 \
--task=$task
Calculate stats
python scripts/data/calc_modality_stats.py \
--work-dir=$PSI_HOME/data/real \
--task=$task
Create
cp $PSI_HOME/data/real/$task/meta/stats.json $PSI_HOME/data/real/$task/meta/stats_psi0.json
Now it's ready to finetune
✈️ If training env is already configured, directly launch training viascripts/train/psi0/finetune-real-psi0.sh $task
✔️ Suppose the data is already collected and processed. Now we can proceed to fine-tune the
$\Psi_0$ model.
📝 Here we illustrate by using the pre-collected data from Huggingface psi-data.
Set up the environment variables following .env.sample. The environment variables will be loaded by the dotenv.load_dotenv() in python.
cp .env.sample .env
# and edit the following env variables
# HF_TOKEN=<YOUR HF READ TOKEN>
# WANDB_API_KEY=<API KEY for wandb logging>
# WANDB_ENTITY=<wandb entity>
# PSI_HOME=<Path where PSI cache/checkpoint/data are located by convention>
source .env
echo $PSI_HOME
Download the collected real-world data and extract it:
export task=Pick_bottle_and_turn_and_pour_into_cup
hf download USC-PSI-Lab/psi-data \
real/$task.zip \
--local-dir=$PSI_HOME/data \
--repo-type=dataset
unzip $PSI_HOME/data/real/$task.zip -d $PSI_HOME/data/real
👀 If you want to visualize the episode please refer to the Data Visualization in the examples.
Launch the training script:
scripts/train/psi0/finetune-real-psi0.sh $task
🖥️ You can always change the GPUs, e.g.,
CUDA_VISIBLE_DEVICES=0,1,2,3 scripts/train/....
⚠️ Please try to maintain a reasonable global batch size = device batch size x number of GPUs x gradient accumulation step. We use global batch size 128 throughout all the real-world and simulation experiments.
Follow the steps in
examples/simple/openloop_eval.ipynb
Load the training dataset, and run model inference to see how model fits the training data.
bash ./scripts/deploy/serve_psi0-rtc.shbash ./real/scripts/deploy_psi0-rtc.shFor detailed real-world deployment environment setup, please also refer to the dedicated documentation:
Real-World Teleoperation Guide
Install the env
cd src/gr00t; uv sync- training
cd src/gr00t
./scripts/train_gr00t.sh --dataset-path /your/lerobot/dataset- serving a checkpoint
cd src/gr00t
./scripts/deploy_gr00t.sh- openloop eval on trained checkpoint using gt
cd src/gr00t
./scripts/openloop_eval.shInstall the env
cd src/InternVLA-M1; uv sync --python 3.10- training
cd src/InternVLA-M1
bash scripts/train_internvla.sh- serving a checkpoint
cd src/InternVLA-M1
./scripts/deploy_internvla.shWe use SIMPLE to benchmark
📢 SIMPLE is an easy-to-use humanoid benchmarking simulator built on the MuJoCo physics engine and Isaac Sim rendering.
[Coming soon]
📂 We also provide 5 pre-collected whole-body humanoid loco-manipulation tasks at Huggingface psi-data. If you want to use the existing simulation data, jump to the Fine-Tuning
[Coming soon]
[Coming soon]
Download SIMPLE task data and extract it:
💡 Dont forget
source .envfirst before following below commands.
export task=G1WholebodyBendPick-v0
hf download USC-PSI-Lab/psi-data \
simple/$task$.zip \
--local-dir=$PSI_HOME/data \
--repo-type=dataset
unzip $PSI_HOME/data/simple/$task.zip -d $PSI_HOME/data/simple
👀 If you want to visualize the episode please refer to the Data Visualization in the examples.
Start training:
Please set up the envrionment variables if not done so yet.
bash scripts/train/psi0/finetune-simple-psi0.sh $task
The training will create a run dir which is located under .runs in the project root.
If your GPU has limited VRAM, set --train.optimizer-foreach=false to reduce optimizer-step memory usage at the cost of some speed.
export run_dir=<the run dir here under folder .runs>
export ckpt_step=<checkpoint step>
uv run --active --group psi --group serve serve_psi0 \
--host 0.0.0.0 \
--port 22085 \
--run-dir=$run_dir \
--ckpt-step=$ckpt_step
Run open-loop evaluation (offline)
examples/simple/openloop_eval.ipynb
If the server is started on a remote server, run ssh port forward. eg.,
ssh -L 22086:localhost:22086 songlin@nebula100.
Once port forward is done, open a new terminal to test if server is up
curl -i http://localhost:22085/health
Launch the eval client through docker
GPUs=1 docker compose run eval $task psi0 \
--host=localhost \
--port=22085 \
--sim-mode=mujoco_isaac \
--headless \
--max-episode-steps=360 \
--num-episodes=10 \
--data-format=lerobot \
--data-dir=data/$task
The policy rollout videos will be found in folder third_party/SIMPLE/data/evals/psi0.
The evaluation for a single episode could take up to 6~10 minutes because SIMPLE use a synchronous rendering API in IsaacSim. See here for more explanation.
Download and cache the official Qwen/Qwen3-VL-2B-Instruct weights.
scripts/predownload_qwen3vl.py
Pre-train on the EgoDex dataset
Pre-compute 48 DoF EgoDex action:
We re-use the pre-process code from H-RDT EgoDex Pre-Processing.
- Change the paths in
src/h_rdt/datasets/pretrain/setup_pretrain.sh.- Tweak the
NUM_PROCESSESif on a powerful server, i tried max 64.- set
FORCE_OVERWRITE=Trueif the processing script is disrupted.
source src/h_rdt/datasets/pretrain/setup_pretrain.sh
source .venv-psi/bin/activate
bash src/h_rdt/datasets/pretrain/run_pretrain_pipeline.sh
bash scripts/train/psi0/pretrain-egodex-psi0-fast.sh
Pre-train on humanoid everyday dataset
bash scripts/train/psi0/pretrain-he-psi0-fast.sh
Save the pretrained checkpoints once training is done:
python scripts/save_pretrain_qwen3vl_backbone.py
Download pre-trained psi-0 VLM backbone
python scripts/data/download.py \
--repo-id=USC-PSI-Lab/psi-model \
--remote-dir=pre.fast.egodex.2512241941/pretrained/ckpt_200000 \
--local-dir=/hfm/cache/checkpoints/psi0/pre.fast.egodex.2512241941.ckpt200k \
--repo-type=model
Post-train on humanoid everyday (HE) dataset
bash scripts/train/psi0/posttrain-he-psi0.sh
Save post-trained action header once training is over
python scripts/save_posttrain_action_expert.py
The released checkpoints on HuggingFace Psi-Model is listed
| Checkpoint | Description | Remote Directory |
|---|---|---|
|
(Baseline) |
Pre-trained VLM backbone (EgoDex 200K steps + HE 30K steps) | psi0/pre.fast.1by1.2601091803.ckpt.ego200k.he30k |
|
(Baseline) |
Post-trained Action Expert On HE | psi0/postpre.1by1.pad36.2601131206.ckpt.he30k |
and more variants for ablation studies:
| Checkpoint | Description | Remote Directory |
|---|---|---|
|
(Ablation Study) |
Pre-trained VLM backbone only on EgoDex 200K steps | psi0/pre.fast.egodex.2512241941.ckpt200k |
|
(Ablation Study) |
Pre-trained VLM backbone only on HE 48K steps | psi0/pre.abl.only.he.2512311516.48k |
|
(Ablation Study) |
Pre-trained VLM backbone only on 10% EgoDex | psi0/pre.abl.ego.10per.2602021632.46k |
|
(Ablation Study) |
Post-train on HE by picking pre-trained variant psi0/pre.abl.only.he.2512311516.48k
|
psi0/postpre.abl.only.he.2602050012 |
|
(Ablation Study) |
Post-train on HE by picking pre-trained variant psi0/pre.abl.ego.10per.2602021632.46k
|
psi0/postpre.abl.ego.10per.2602050006 |
Download the selected models
hf download USC-PSI-Lab/psi-model \
--remote-dir=<remote dictory on huggingface repo>
--local-dir=$PSI_HOME/cache/checkpoints \
--repo-type=model
- Lerobot dataset issues:
stack(): argument 'tensors' (position 1) must be tuple of Tensors, not Column
This usually means the environment is still on the legacy PSI lerobot stack. Resync the PSI env so it uses the
same lerobot and datasets versions as SIMPLE, then verify the import layout:
source .venv-psi/bin/activate
uv sync --group psi --active
python -c "from psi.data.lerobot.compat import LEROBOT_LAYOUT; print(LEROBOT_LAYOUT)"- Fail to install
evdev,src/evdev/input.c:10:10: fatal error: Python.h: No such file or directory
sudo apt update
sudo apt install -y python3-dev python3-venv build-essential \
linux-headers-$(uname -r)
- RuntimeError: Could not load libtorchcodec. Likely causes ...
sudo apt-get install ffmpeg
- ImportError: cannot import name 'Deprecated' from 'wandb.proto.wandb_telemetry_pb2'
re-install wandb
source .venv-pusht/bin/activate
uv pip uninstall wandb
uv pip install wandb==0.18.0
- support
sm_120on newer GPUs like5090orRTX 6000, UserWarning: Ignoring invalid value for boolean flag CUDA_LAUNCH_BLOCKING: truevalid values are 0 or 1.
update torch and flash-attn
uv pip install torch==2.7.0 torchvision==0.22.0 torchaudio==2.7.0 --index-url https://download.pytorch.org/whl/cu128
uv pip install flash-attn --no-build-isolation
- Failed to download and build
lerobot ..., Usegit lfs logs lastto view the log.
GIT_LFS_SKIP_SMUDGE=1 uv ...
@misc{wei2026psi0,
title={$\Psi_0$: An Open Foundation Model Towards Universal Humanoid Loco-Manipulation},
author={Songlin Wei and Hongyi Jing and Boqian Li and Zhenyu Zhao and Jiageng Mao and Zhenhao Ni and Sicheng He and Jie Liu and Xiawei Liu and Kaidi Kang and Sheng Zang and Weiduo Yuan and Marco Pavone and Di Huang and Yue Wang},
year={2026},
eprint={2603.12263},
archivePrefix={arXiv},
primaryClass={cs.RO},
url={https://arxiv.org/abs/2603.12263},
}
This project is licensed under the Apache License 2.0.
See the LICENSE file for details.

