ฯ€0.5 LoRA fine-tune โ€” UR5 + gripper "catch the cube" (openpi JAX, A1astor)

Official openpi (JAX) LoRA fine-tune of pi05_base on 44 real UR5 demonstrations collected with gamepad teleoperation. Trained on a single A100-40GB (multi-GPU NCCL corruption workaround, openpi issue #822).

Robot & task

  • Robot: UR5 + gripper, 2 cameras: observation.images.global (external) + observation.images.wrist
  • Task: catch the cube
  • Action space: 7-dim = 6 absolute joint positions (rad) + gripper (0-1), 30 Hz (trained in delta space via DeltaActions, gripper absolute; inference outputs absolute joint targets)
  • Dataset: A1astor/ur5_gripper (private) โ€” 44 episodes / 26,637 frames, LeRobot v3.0

Training recipe (config pi05_ur5_gripper, exp gripper_v4_singlegpu)

Item Value
Base pi05_base (gs://openpi-assets), bfloat16 frozen backbone
PEFT LoRA (gemma_2b_lora + gemma_300m_lora), EMA off
Batch / steps 32 ร— 20000 steps (~19.5h on 1ร— A100-40GB)
Optimizer AdamW, clip_gradient_norm=1.0, cosine 2.5e-5 โ†’ 2.5e-6, warmup 1000
Final train loss 0.0097 (grad_norm 0.093)
Data hygiene action clamp ยฑ6 (episode-boundary chunks), wrist_2 dead-dim stats widened

Repo layout: params/ (orbax checkpoint, inference weights), assets/ (norm stats). Optimizer state (train_state/) kept locally, not needed for inference.

Usage (openpi local inference)

from openpi.training.config import get_config
from openpi.policies import policy_config

config = get_config("pi05_ur5_gripper")
policy = policy_config.create_trained_policy(config, "<path-to-this-dir>")
obs = {
    "base_rgb": global_cam.read(),   # uint8 HWC
    "wrist_rgb": wrist_cam.read(),
    "joints": rtde_r.getActualQ(),   # 7-dim: 6 joints + gripper
    "prompt": "catch the cube",
}
result = policy.infer(obs)           # -> (action_horizon, 7) absolute targets

Also servable via scripts/serve_policy.py policy:checkpoint --policy.config=pi05_ur5_gripper.

Known fixes carried in the training code

  • checkpoints.py: host-side snapshot before async save (race wrote NaN into float32 trainable params in earlier checkpoints).
  • Single-GPU training only on this host: 4-GPU FSDP with NCCL_P2P_DISABLE=1 silently corrupted allreduces (NaN within 100-600 steps, batch-dependent).
Downloads last month

-

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