pi0-base-two-wu

This repository contains the complete resumable checkpoints for a sequential two-Wu PI0 model trained jointly on the four LIBERO suites (libero_spatial, libero_object, libero_goal, and libero_10).

Checkpoint stages

  • VLM-Wu: 60,000 optimizer steps. The VLM-Wu checkpoint is frozen when training the second stage.
  • Action-Wu: 85,000 optimizer steps. This is the current resumable Action-Wu checkpoint.

The included optimizer.pt, rng_state.pt, metadata.pt, split files, and metric histories are intentional: this upload is meant to support continued training, not inference only.

Architecture and training configuration

Component Configuration
Frozen backbone PI0 base (gemma_2b VLM + gemma_300m action expert)
VLM-Wu rank 16, width 1152, 12 NNT layers, 322.078M parameters
Action-Wu rank 16, width 768, 12 NNT layers, 143.743M parameters
Training suites Four LIBERO suites jointly
Original world size 6 GPUs
Effective batch size 30 (global micro-batch 6, accumulation 5)
Action-Wu LR 1.5e-5 to 1.5e-6, 4,000-step warmup, 200,000-step decay
AdamW betas (0.9, 0.98), eps 1e-8, weight decay 0.01
Action gradient clipping global norm 5.0

The PI0 base checkpoint is not bundled. Convert the same PI0 base checkpoint to PyTorch and verify that model.safetensors has SHA-256:

9e8013b0d353ed4b45c42aa0999731ef2667547af8518e397d5d38844ce443ef

Repository layout

checkpoints/pi0_two_wu_libero/
  pi0_two_wu_4suite_vlm_r16_d1152_n12_lr1e5_60k_6gpu_b30_no_wu_ac_final/
    episode_split.json
    metrics.jsonl
    best_checkpoint.json
    60000/
      vlm_wu_nnt.pt
      optimizer.pt
      rng_state.pt
      metadata.pt
      vlm_wu_config.json
      action_wu_config.json
  pi0_two_wu_4suite_action_r16_d768_n12_lr1p5e5_200k_6gpu_b30_no_wu_ac_final/
    episode_split.json
    metrics.jsonl
    best_checkpoint.json
    85000/
      action_wu_nnt.pt
      optimizer.pt
      rng_state.pt
      metadata.pt
      vlm_wu_config.json
      action_wu_config.json

Download

from huggingface_hub import snapshot_download

snapshot_download(
    repo_id="WendaYu/pi0-base-two-wu",
    local_dir="/path/to/pi0-base-two-wu",
)

Prepare the PI0 base checkpoint

Using the matching openpi-wu source tree:

uv run examples/convert_jax_model_to_pytorch.py \
  --checkpoint_dir /path/to/pi0_base_jax \
  --config_name pi0_libero \
  --output_path /path/to/pi0_base_pytorch

sha256sum /path/to/pi0_base_pytorch/model.safetensors

The hash must be 9e8013b0d353ed4b45c42aa0999731ef2667547af8518e397d5d38844ce443ef. The resume code intentionally rejects a different base fingerprint.

Resume Action-Wu training from 85k

Use the matching source code from SunnyYWD/openpi-wu. The original run used six GPUs (0,1,2,3,4,7 on the source machine); any six local GPU IDs can be exposed in the same logical order.

cd /path/to/openpi-wu

HF_ROOT=/path/to/pi0-base-two-wu
VLM_EXP=pi0_two_wu_4suite_vlm_r16_d1152_n12_lr1e5_60k_6gpu_b30_no_wu_ac_final
ACTION_EXP=pi0_two_wu_4suite_action_r16_d768_n12_lr1p5e5_200k_6gpu_b30_no_wu_ac_final

export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5
export JAX_PLATFORMS=cpu
export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True
export PYTHONUNBUFFERED=1

.venv/bin/torchrun \
  --standalone --nnodes=1 --nproc-per-node=6 \
  scripts/train_pi0_two_wu_4suite_pytorch.py \
  --stage action \
  --exp-name "$ACTION_EXP" \
  --checkpoint-base-dir "$HF_ROOT/checkpoints" \
  --base-pytorch-weight-path /path/to/pi0_base_pytorch \
  --vlm-checkpoint "$HF_ROOT/checkpoints/pi0_two_wu_libero/$VLM_EXP/60000" \
  --resume \
  --num-train-steps 200000 \
  --lr-decay-steps 200000 \
  --batch-size 6 \
  --gradient-accumulation-steps 5 \
  --learning-rate 1.5e-5 \
  --decay-learning-rate 1.5e-6 \
  --warmup-steps 4000 \
  --adam-b1 0.9 --adam-b2 0.98 --adam-eps 1e-8 \
  --weight-decay 0.01 --clip-gradient-norm 5 \
  --validation-interval 5000 --validation-batches-per-suite 40 \
  --save-interval 5000 --log-interval 100 \
  --require-cuda

For the most faithful continuation, keep the original six-rank setup because rng_state.pt stores one RNG state per original rank. The action checkpoint metadata contains the source machine's absolute VLM path; the explicit --vlm-checkpoint argument above intentionally overrides that machine-specific path.

Inference

Pass both checkpoint directories explicitly:

.venv/bin/python3 scripts/serve_pi0_two_wu_policy.py \
  --config-name pi0_wu_libero \
  --base-pytorch-weight-path /path/to/pi0_base_pytorch \
  --vlm-wu-checkpoint-dir /path/to/pi0-base-two-wu/checkpoints/pi0_two_wu_libero/pi0_two_wu_4suite_vlm_r16_d1152_n12_lr1e5_60k_6gpu_b30_no_wu_ac_final/60000 \
  --action-wu-checkpoint-dir /path/to/pi0-base-two-wu/checkpoints/pi0_two_wu_libero/pi0_two_wu_4suite_action_r16_d768_n12_lr1p5e5_200k_6gpu_b30_no_wu_ac_final/85000 \
  --pytorch-device cuda \
  --port 8000

License

The openpi code is Apache-2.0. The separately obtained Gemma-derived PI0 base checkpoint is also subject to its applicable Gemma terms; users are responsible for complying with those terms.

Downloads last month

-

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