Ο€0.7-style low-level policy on BEHAVIOR-1K (Ο€0.5 base, 200k steps)

Action expert of lerobot/pi05_base, fine-tuned for 200,000 steps on the BEHAVIOR-1K 2026 challenge demos (R1Pro robot, 18 tasks) with a Ο€0.7-style prompt (Task / Subtask / Speed / Quality / Mistake / Control Mode). This is the low-level (LL) policy of a Ο€0.7 reproduction. The high-level policy and the subgoal world model are not in this repository.

The PaliGemma VLM was frozen during training and is not included. Use the PaliGemma weights from lerobot/pi05_base unchanged and replace the action expert with the tensors in this repository.

Run id: pi07ll-pi05base-200k, checkpoint step-200000.

Files

File Content
model.safetensors 208 tensors, 430,098,464 parameters, float32 (1.72 GB). Gemma 300M action expert + action_in_proj, action_out_proj, time_mlp_in, time_mlp_out
stats.json q01 / q99 / mean / std / min / max for the 25-dim state and 23-dim action (train split)
config.json Input/output layout, prompt template, per-task instructions and runtime speed values, training settings
NOTICE, GEMMA_TERMS.md, GEMMA_PROHIBITED_USE_POLICY.md Gemma license material (see License)

Loading

Tensor names are the same as in lerobot/pi05_base/model.safetensors (parameter names of lerobot's PI05Pytorch). All 208 names and shapes were checked against lerobot 0.5.2. paligemma_with_expert.gemma_expert.lm_head.weight is not included; the expert does not produce tokens.

from huggingface_hub import hf_hub_download
from safetensors.torch import load_file

expert = load_file(hf_hub_download("hanbin5/pi07-ll-b1k-200k", "model.safetensors"))
# policy = lerobot PI05Policy loaded from lerobot/pi05_base (chunk_size=50, num_inference_steps=5)
missing, unexpected = policy.model.load_state_dict(expert, strict=False)
assert not unexpected  # `missing` = PaliGemma tensors, kept from pi05_base

The lerobot pre/post-processors of pi05_base do not build the prompt and normalization this model was trained with. Build the inputs as described below. The training and serving code is in inner-king/policy, branch hanbin5/pi07 (models.py LLPolicy, dataset.py pi07_prompt, serve_pi07.py). It expects the local data index, so it does not run as-is outside the original setup.

In the original setup PaliGemma is cast to bfloat16, the expert and projections stay float32, and the forward pass runs under torch.autocast(bfloat16).

Inputs

Images β€” three views in this order: head (observation.rgb.zed_link_camera_0), left_wrist (observation.rgb.left_realsense_link_camera_0), right_wrist (observation.rgb.right_realsense_link_camera_0). RGB resized to 224Γ—224 with area interpolation, scaled to [-1, 1].

State β€” 25 dims taken from the 61-dim R1Pro observation.state:

Slice of observation.state Dims Content
0:3 3 base velocity
53:57 4 torso joints
3:10 7 left arm joints
24:26 2 left gripper
28:35 7 right arm joints
49:51 2 right gripper

Normalize with stats.json["state"]: x_n = clip((x - q01) / (q99 - q01) * 2 - 1, -1.5, 1.5). The state enters the model as text, Ο€0.5 style: clip x_n to [-1, 1], np.digitize(x_n, np.linspace(-1, 1, 257)[:-1]) - 1, join the 25 integers with spaces.

Prompt β€” tokenized with the PaliGemma tokenizer (google/paligemma-3b-pt-224, adds <bos>), max 256 tokens:

Task: {instruction}. Subtask: {subtask}. Speed: {speed}. Quality: 5. Mistake: false. Control Mode: joint. State: {25 ints};
Action: 
  • instruction: task sentence, listed per task in config.json β†’ prompt.instructions (trailing period removed, then added back).
  • subtask: skill sentence such as move to the top cabinet, pick up the plate from the fridge, open the fridge. Training dropped it with probability 0.1 (0.3 on samples with subgoal images); omit the whole Subtask: …. part if not available.
  • speed: at runtime the 15th percentile of training episode lengths for the task, rounded to 500 steps (config.json β†’ prompt.runtime_speed). In training it was the episode's own length rounded to 500.
  • Quality: 5 and Mistake: false are constants; B1K has no quality or mistake labels.

Subgoal images (optional) β€” three more views appended after the text as a block-causal block: subgoal tokens attend to everything before them, observation and text tokens do not attend to them. Without subgoal images the prefix has the same layout as Ο€0.5. 25% of training samples had subgoal images, taken from the same demo (the segment end frame with probability 0.25, otherwise a frame 0–4 s ahead). The results below use no subgoal images.

Output

Flow matching over a 50 Γ— 32 chunk; the first 23 dims are used. Sampling: x ~ N(0, I) at t = 1, 5 Euler steps to t = 0 (x ← x βˆ’ v(x, t) / 5). Unnormalize with stats.json["action"]: a = (x + 1) / 2 * (q99 βˆ’ q01) + q01.

Action dims Content
0:3 base
3:7 torso
7:14 left arm (absolute joint positions)
14 left gripper
15:22 right arm (absolute joint positions)
22 right gripper

At 30 Hz; the evaluations below executed the first 25 actions of each chunk, then sampled a new chunk.

Training

Item Value
Data behavior-1k/2026-challenge-demos, 18 tasks (17 cooking tasks + clean_a_keyboard), 200 episodes each; split 3,420 train / 180 val episodes; 35,957,659 train frames
Subtask labels B1K skill segment annotations converted to English sentences
Trained parameters action expert + projections, 430.1M, float32. PaliGemma (SigLIP + Gemma 2B) frozen
Steps 200,000
Batch effective 32 = 2 GPUs Γ— 16 (12 without + 4 with subgoal images)
Optimizer AdamW (Ξ² 0.9 / 0.95, weight decay 0.01), grad clip 1.0
Learning rate 2.5e-5 β†’ 2.5e-6 cosine, 1,000 warmup steps
Prompt dropout subtask 0.1 / 0.3 (without / with subgoal), metadata block 0.15, each metadata item 0.05
Hardware RTX 3090 Ti + RTX 3090 (24 GB each), data parallel, 1.74–1.95 s/step, 111.3 h

Results

Validation, open loop (step 200,000; 96 samples without subgoal images and 32 with, from the 180 val episodes; fixed initial noise; L1 over the 50-step chunk in normalized action units):

Model Repeat-last-action baseline
without subgoal (n=96) 0.0445 0.0421
with subgoal (n=32) 0.0405 0.0347
right arm, without subgoal 0.0421 0.0356

The model does not beat the baseline that repeats the current action for all 50 steps.

Skill execution in simulation (OmniGibson, BEHAVIOR-1K). 15 validation episodes (5 cooking tasks Γ— 3). For each skill segment the scene is restored by replaying the demo up to the segment start; the policy then runs for 9,000 steps (5 min) with the ground-truth subtask sentence, no high-level policy, no subgoal images. Counted only skills whose success is a single simulator state check; success = the check holds on two consecutive checks 15 steps apart. Segments where the demo itself failed the check or the check already held at the start are excluded.

Skill Success / valid
turn on 9 / 11
turn off 0 / 3
open 4 / 22
close 13 / 24
pick up 17 / 48
Total 43 / 108 (40%)

Full-task closed-loop success was not measured for this checkpoint.

Limitations

  • Open-loop error stays above the repeat-last-action baseline after 200k steps. With the VLM frozen and only the expert trained, the error curve was flat between 140k (0.0456) and 200k (0.0445).
  • Grasping is the weakest skill (17/48); opening articulated objects succeeds in 4/22.
  • Trained and evaluated only in simulation on the R1Pro embodiment.
  • Research use. The training demos are rendered with BEHAVIOR-1K assets, some of which come from sources with non-commercial or no-ML-training terms.

License

This model is a Model Derivative of Gemma (PaliGemma, via lerobot/pi05_base) and is distributed under the Gemma Terms of Use. A copy is in GEMMA_TERMS.md, and the required notice is in NOTICE.

  • Modification notice: the action expert tensors in model.safetensors were modified from lerobot/pi05_base by fine-tuning on BEHAVIOR-1K demos as described above.
  • Use restrictions: use of this model is subject to the use restrictions in Section 3.2 of the Gemma Terms of Use, including the Gemma Prohibited Use Policy (copy in GEMMA_PROHIBITED_USE_POLICY.md). Anyone you redistribute this model to is bound by the same restrictions.

Training data: behavior-1k/2026-challenge-demos (MIT).

Downloads last month
25
Safetensors
Model size
0.4B params
Tensor type
F32
Β·
Video Preview
loading

Model tree for hanbin5/pi07-ll-b1k-200k

Finetuned
(748)
this model

Dataset used to train hanbin5/pi07-ll-b1k-200k