Psi0 · SIMPLE Decoupled-WBC MP (5 tasks)

A multi-task Psi0 policy for the Unitree G1 humanoid, finetuned on all 5 motion-planning (MP) tasks of SIMPLE-decoupled-wbc-MP. It is evaluated in the SIMPLE benchmark (MuJoCo physics + Isaac Sim rendering).

The teleop counterpart, trained the same way on the 12 teleoperated tasks, is USC-PSI-Lab/Psi0-SIMPLE-decoupled-wbc-Teleop. The two checkpoints are not interchangeable: MP and Teleop tasks use different lower-body controllers, eval agents and state/action conventions (see MP vs Teleop).

Repository layout

This repository is a Psi0 run directory, so it can be passed directly to the Psi0 server as --run-dir:

argv.txt                                  # exact training command-line arguments
run_config.json                           # resolved launch config (model, data transforms, normalization stats)
clip_pooled_cache_simple.pt               # cached CLIP pooled embeddings of the training instructions
checkpoints/ckpt_40000/model.safetensors  # final weights (bf16, ~11 GB), step 40k

Only the inference weights are included. The optimizer state and RNG states are not.

Training

Init Psi0 pretrained VLM (Qwen3-VL backbone) pre.fast.1by1.2601091803.ckpt.ego200k.he30k + post-pretrained action header postpre.1by1.pad36.2601131206.ckpt.he30k (both in USC-PSI-Lab/psi-model under psi0/)
Data SIMPLE-decoupled-wbc-MP: 5 tasks, 389 episodes, 141k frames at 50 fps, with 2 episodes per task (10 in total) held out for validation, so 379 train episodes
Action / state 37-D action (padded, target yaw encoded as sin/cos), 36-D proprio state; min/max ("bounds") normalization
Action head 12-block flow-matching DiT (1000 train steps), chunk 30, layer-wise VLM fusion, combined timestep + CLIP-pooled-instruction adaLN, state as action token with null-token dropout (p=0.1), RTC (max delay 8)
Optimization 40k steps (~75 epochs), global batch 256 (32 × 8 GPUs, DDP, bf16), AdamW lr 1e-4 (VLM: language 1e-6, vision 1e-5, projector 1e-4), cosine schedule, 2k warmup, wd 0.01, grad clip 1.0
Augmentation image + view augmentation (random crop, min scale 0.85), 180×320 input, state temporal jitter (±10 frames, p=0.5), Gaussian state noise (σ=0.05)

The recipe is identical to the Teleop checkpoint; only the dataset differs. Because the MP dataset is ~1/3 the size, the same 40k steps amount to ~75 epochs instead of ~22.

Reproduce from the Psi0 repo:

bash scripts/train/psi0/finetune-simple-decoupled-wbc.sh mp5

Tasks

G1Wholebody{BendPickAndPlaceOnSofa, BendPick, PickAndBendPlace, TabletopGrasp, TabletopHandover}MP-v0

The demonstrations come from a motion planner rather than human teleoperation. The training data was re-recorded by replaying every demo's actions under SIMPLE's current (soft) Dex3 hand gains, so the hand states match what the policy sees at eval time (see the dataset card).

MP vs Teleop

MP (this model) Teleop
Demonstrations motion planner human teleoperation
Lower-body controller AMO decoupled whole-body controller
SIMPLE eval agent simple/baselines/psi0.py (policy psi0) simple/baselines/psi0_decoupled_wbc.py (policy psi0_decoupled_wbc)
SIMPLE eval entrypoint eval (simple/cli/eval.py) eval-decoupled-wbc
states[28:31] (waist) last commanded waist roll/pitch/yaw (action[t-1, 28:31], 0 at frame 0) measured waist joints
states[31] at frame 0 0.75 0.74
action[34] AMO turning flag, 0/1 (used only by BendPickAndPlaceOnSofaMP and PickAndBendPlaceMP) base yaw-rate command vyaw, ±1 rad/s

The Psi0 server (serve_psi0_simple) is the same for both. The difference is in the SIMPLE client, which builds the model input with the matching conventions, so always evaluate this checkpoint with the psi0 agent and the eval entrypoint.

Usage

1. Download

hf download USC-PSI-Lab/Psi0-SIMPLE-decoupled-wbc-MP \
  --local-dir .runs/finetune/dwbc-mp5.simple.flow1000.cosine.lr1.0e-04.b256.gpus8.2611100518

2. Serve the policy (Psi0 repo)

serve_psi0_simple --host 0.0.0.0 --port 22085 --policy=psi0 \
  --run-dir=.runs/finetune/dwbc-mp5.simple.flow1000.cosine.lr1.0e-04.b256.gpus8.2611100518 \
  --ckpt-step=40000 --action-exec-horizon=24 --rtc

Or use bash scripts/deploy/serve_psi0_simple.sh <RUN_DIR> 40000.

3. Evaluate in SIMPLE

# pull the SIMPLE docker image and re-tag
docker pull ghcr.io/physical-superintelligence-lab/simple:260829
docker tag ghcr.io/physical-superintelligence-lab/simple:260829 simple:260829

# one task / one DR level against the server above (MP tasks: `eval` entrypoint, `psi0` agent)
DATE=260829 docker compose run --rm eval \
  simple/G1WholebodyBendPickMP-v0 psi0 dr-level-0 \
  --host=localhost --port=22085 --sim-mode=mujoco_isaac --headless \
  --data-format=lerobot --data-dir=data/evals/simple-eval/G1WholebodyBendPickMP-v0/dr-level-0 \
  --isaac-render=on-query

Eval episodes are in USC-PSI-Lab/SIMPLE-eval (10 per task and DR level).

To run the parallel sweep over all 5 tasks × 4 DR levels, use a SIMPLE checkout with the Psi0 repo at PSI_DIR (it starts server + client lanes across the GPUs in tmux and picks the eval / psi0 path for *MP-v0 tasks automatically):

TASK_FILTER='MP-v0$' scripts/psi0_eval_sweep/launch.sh \
  .runs/finetune/dwbc-mp5.simple.flow1000.cosine.lr1.0e-04.b256.gpus8.2611100518 40000

The first launch can take several extra minutes while Isaac Sim builds its caches.

Downloads last month

-

Downloads are not tracked for this model. How to track
Video Preview
loading

Dataset used to train USC-PSI-Lab/Psi0-SIMPLE-decoupled-wbc-MP

Collection including USC-PSI-Lab/Psi0-SIMPLE-decoupled-wbc-MP