pi0.5 trained on the full RoboPRO LeRobot set (roboreal_lerobot, 15,999 episodes / 3.74M
frames) with RoboResearch's pi05_base. This is a
completed reproduction of the jax_30000 checkpoint from a different codebase, and it lands
within 6% of it.
Against jax_30000
Both checkpoints scored on the same 3,072 samples, same config, same data slice, same
sampling seeds, in raw action units — every normalization undone, which is what makes one
number mean the same thing for both.
checkpoint
slice A
slice B
mean action_mse
jax_30000 (reference)
0.006670
0.003735
0.005202
this run
0.006384
0.004643
0.005514
The 6.0% gap is not uniform: this run is better on slice A and worse on slice B, so the two
models differ in where they are strong rather than one dominating. The reference numbers
reproduce across independent measurements to five decimals, so the difference is signal
rather than measurement noise.
Both models trained on this data, so this measures fit, not generalization.
Recipe
config
pi05_robopro_jax30000
batch size
192 (3 GPUs at 64 to step 12,700, then 4 at 48)
schedule
cosine, warmup 1000, peak 2.5e-5, decay to 2.5e-6 over 30,000
Normalization statistics are the same file the original jax_30000 run used (md5
9d56ef7be163a56fcba0283ebe4a04db) and ship in assets/roboreal_lerobot/.
The run was killed at step 12,700 with no Python traceback — cause unconfirmed, dmesg was
not readable to check the kernel OOM killer — and resumed from its step-12,000 checkpoint.
Training metrics are continuous across the resume.
Training trace
step
loss
grad_norm
action_mse
0
0.2119
1.6179
0.268511
1000
0.0134
0.0944
0.042110
5000
0.0064
0.0472
0.014235
12000
0.0042
0.0330
0.008087
15000
0.0037
0.0315
0.006248
20000
0.0029
0.0286
0.005830
25000
0.0025
0.0300
0.005333
29000
0.0021
0.0283
0.003749
These are single eval batches, so they are noisy and not comparable to the 3,072-sample
table above.
Contents
params/ 12 GB, the weights
assets/roboreal_lerobot/ norm_stats.json
_CHECKPOINT_METADATA orbax metadata
train_state/ (31 GB optimizer state) is not uploaded — this is for inference, not resuming.
Use
python
1import openpi.policies.policy_config as policy_config
2import openpi.training.config as config
3from roboresearch import policies
45policies.register_all()6policy = policy_config.create_trained_policy(7 config.get_config("pi05_robopro_jax30000"),"<path to this checkout>"8)