pi0.5 β€” full fine-tune, relative actions, joint space (10-dim motor targets)

Fine-tuned from lerobot/pi05_base on the 949-episode base4 multi-task mixture (900 train / 49 held out, 8 tasks, 3 cameras, 50 Hz), with every parameter trainable β€” 4,143,404,816 of them: vision tower, language model and action expert. Contrast with the frozen-VLM arm, maskjp/pi05-relative-joints-frozen-vlm, which trains only 693M.

This is step 10000, not the end of the run. The schedule ran to 30000, but held-out loss bottoms early and then climbs:

step held-out loss
5K 0.0291
10K 0.0278 best
15K 0.0309
20K 0.0350
25K 0.0382
30K 0.0392

Train loss keeps falling to ~0.008 throughout. 4.14B parameters memorise 900 episodes in well under half an epoch. 30K is the wrong schedule for full fine-tuning on this dataset; ~10000 steps, or early stopping on held-out loss, is the right one.

Is full fine-tuning worth it here?

held-out loss
this model (step 10000) 0.0278
frozen VLM, step 30000 0.0296

Yes, by 6.1% β€” but only if you stop at step 10000. Run the full schedule and it ends at 0.0392, far worse than the frozen arm.

config.json differs from training

Training set vision_encoder_lr_multiplier=0.1, putting the vision tower and multi_modal_projector on a 2.5e-6 learning rate against 2.5e-5 for the expert and language model. That field does not exist in stock lerobot 0.6.2, and draccus rejects unknown config keys, so it has been removed from the uploaded config.json β€” the model loads on unmodified lerobot. The field is read only by get_optim_params and has no effect at inference, so nothing about this model's behaviour changes. train_config.json retains it as the training record.

To reproduce the training, you need lerobot at commit fbb811fc plus that field; inference needs neither.

Camera sensitivity

Not measured for this arm. The matched frozen-VLM models score 0.088-0.091 on the camera-swap sensitivity ratio β€” far below the 0.5 grounding threshold β€” meaning they predict arm motion largely without reading their cameras. Whether unfreezing the vision tower changes that is an open question this card does not answer.

Deploying without the training dataset

train_config.json records an absolute dataset.root from the training machine and the l5vel-peng/multitask-relative-h50 view is not published, so a robot can resolve neither. Nothing here needs it: normalisation statistics are baked into policy_preprocessor_step_3_normalizer_processor.safetensors, and action_feature_names lives in config.json.

from lerobot.configs.policies import PreTrainedConfig
from lerobot.policies.factory import get_policy_class, make_pre_post_processors

repo = "maskjp/pi05-relative-joints-full-ft"
cfg = PreTrainedConfig.from_pretrained(repo)
cfg.device = "cuda"
policy = get_policy_class(cfg.type).from_pretrained(repo, config=cfg)
pre, post = make_pre_post_processors(cfg, pretrained_path=repo)

Avoid make_policy(cfg, ds_meta=...): a non-None ds_meta makes LeRobot overwrite action_feature_names from the dataset, which is the path that needs the missing files. If your deployment insists on it, this repo also ships meta/ (~1.8 MB) β€” point dataset.root at a directory containing it, no data/ or videos/ required.

Action representation

Targets are relative: action[t+k] - state[anchor], one anchor per chunk, added back after inference. The gripper stays absolute (relative_exclude_joints=['gripper']).

Configuration

pretrained_path lerobot/pi05_base
chunk_size 50   n_action_steps 10   n_obs_steps 1
freeze_vision_encoder false   train_expert_only false   (all 4.14B trainable)
gradient_checkpointing true   compile_model true   dtype bfloat16
optimizer_lr 2.5e-5, warmup 1000, cosine to 2.5e-6 over 30K
vision tower + projector at 0.1x that (2.5e-6)
norm  VISUAL IDENTITY | STATE QUANTILES | ACTION QUANTILES
batch 21/rank x 3 GPUs = 63 effective, DDP, seed 1000

Apache-2.0, inherited from LeRobot.

Downloads last month
33
Safetensors
Model size
4B params
Tensor type
F32
Β·
BF16
Β·
Video Preview
loading