PostVLA reproduces an SO100 pick-and-place post-training study for OpenPI pi0.5:
- Build a contact-physics MuJoCo task and scripted IK oracle.
- Generate exterior-camera, wrist-camera, proprioception, and action trajectories.
- SFT pi0.5 in OpenPI (JAX).
- Convert to RLinf's PyTorch OpenPI implementation and calibrate against the JAX teacher.
- Continue online with two five-iteration PPO stages using RLinf's flow-noise path.
- Evaluate matched cube-position rollouts under several initial-latent and sampler settings.
- Compare the standard policy with the FlashRT FP8 frontend plus FlashAct
mk_v6FP8 loop.
Third-party projects are pinned as submodules; our changes are explicit patches and overlays. Checkpoints, datasets, videos, and run directories are intentionally excluded from Git.
All 100-episode rows below use the same ordered cube-position IDs.
| Policy | PPO iterations from SFT | Decode | On pad | Center + lift |
|---|---|---|---|---|
| Distilled Torch SFT | 0 | unit Gaussian + ODE | 69/100 | 53/100 |
| RL stage 1 | 5 | unit Gaussian + ODE | 64/100 | 55/100 |
| RL stage 2 | 10 total | unit Gaussian + ODE | 70/100 | 52-55/100 |
| RL stage 2 | 10 total | zero latent + ODE | 90/100 | 82/100 |
The 90/100 row is real, but it is not by itself an apples-to-apples estimate of the PPO gain:
the SFT 69/100 baseline used Gaussian initialization, while that row used a zero initial
latent. A full 100-episode SFT zero-latent control is still required to separate policy
improvement from decoder selection. See results/README.md.
git clone --recursive <repository-url> PostVLA
cd PostVLA
./scripts/apply_overlays.sh
export POSTVLA_ARTIFACT_ROOT=/network_volume/PostVLA-artifacts
source scripts/env.shGenerate one oracle rollout:
python3 scripts/data/so100_oracle_pick_place.pyEvaluate a checkpoint with the standard Gaussian-initialized ODE path:
python3 scripts/eval/eval_noise_control.py \
--model-path "$POSTVLA_ARTIFACT_ROOT/checkpoints/pi05_so100_sim_rl_stage2_step5" \
--output-dir "$POSTVLA_ARTIFACT_ROOT/eval/gaussian_n100" \
--attempts 100 --batch-size 1 --max-steps 900 --save-videos \
--sampling-mode eval --initial-noise-mode gaussianUse --initial-noise-mode zero for the zero-latent control. Full setup, SFT,
conversion, calibration, and two-stage PPO commands are in
docs/REPRODUCTION.md.
sim/: standalone SO100 MuJoCo scene and observation renderer.scripts/data/: oracle and LeRobot dataset generation.scripts/calibration/: JAX teacher rollout collection and PyTorch calibration.scripts/train/: OpenPI SFT, conversion, RLinf SFT, and PPO launchers.scripts/eval/: batched rollout, sampler controls, and comparison tools.kernels/pi05/: themk_v6denoising kernel and portable FlashRT hybrid wrapper.web/: four-lane SFT/RL standard-versus-optimized live viewer.overlays/,patches/: auditable changes applied to pinned submodules.configs/: manifests and resolved historical run configurations.results/: raw summaries and a compact experiment index.