The AY-Robots policies comparison table showing five trainable policies with parameters, GPU tier, inference latency and minimum episodes, including Pi0.5
Pi0.5Pi0VLAFine-tuningPhysical IntelligenceLeRobot

Pi0 vs Pi0.5: What Actually Changed in the VLA

AY-Robots ResearchAugust 23, 202617 min read

Pi0 and Pi0.5 share a backbone and an action expert. What changed is the gradient path, the tokeniser and the data mixture. Here is the diff, and what you actually get.

The short version

  • Same bones: a PaliGemma 3 B backbone, a 300 M action expert, a chunk of H = 50 and 10 denoising steps at inference.
  • The architectural change in Pi0.5 is a stop-gradient. The action expert no longer pushes its gradients back into the backbone.
  • The backbone learns motor representations from FAST discrete action tokens instead, with a plain next-token loss. That is knowledge insulation.
  • The knowledge insulation paper reports flow-matching-only Pi0 needing 7.5 times as many training steps for similar performance, at the same inference cost.
  • The rest of Pi0.5 is data: about 400 hours of mobile manipulator demonstrations across about 100 home environments, co-trained with web captioning, question answering, object localisation and subtask labels.
  • openpi and lerobot both ship the flow-matching head only, without subtask prediction, action tokenization or RL. That is less than the paper describes.
  • For one arm on one desk, train Pi0.5. Pi0 is worth reading.

What actually changed, in one paragraph

Pi0 and Pi0.5 look like a version bump and are not. The Pi0 paper (arXiv 2410.24164, v1 posted 31 October 2024) introduced a vision-language-action model that bolts a continuous action expert onto a pretrained VLM and trains the whole thing with flow matching. The Pi0.5 paper (arXiv 2504.16054, 22 April 2025) keeps that architecture almost unchanged and rewrites how it is trained. The action expert's gradients are cut off from the backbone, the backbone learns from discretised action tokens instead, and the training mixture grows to include web data and subtask labels. The claimed payoff is not dexterity. It is generalisation to environments the robot has never seen.

This article separates three things that get blurred together: what the papers changed, what the open implementations ship, and what you get when you press train on your own LeRobot dataset. Those answers differ, and the gap is the useful part. The VLA overview and the older Pi0 flow-matching write-up cover the ground this one assumes.

PropertyPi0Pi0.5
BackbonePaliGemma, 3 BPaliGemma, 3 B
Action expert300 M, from scratch300 M, from scratch
Released checkpoint size3,501,372,176 params (lerobot/pi0_base)3,616,757,520 params (lerobot/pi05_base)
Action chunk H5050
Denoising steps at inference1010
How the backbone learns actionsflow-matching gradients pass throughFAST discrete action tokens, next-token loss
Expert gradients reach the backboneyesno, stop-gradient
Robot state seen by the backbonecontinuousdiscretised into 256 bins, written into the prompt
lerobot normalisation defaultMEAN_STDQUANTILES (q01 / q99)
lerobot tokenizer_max_length48200
lerobot policy typepi0pi05
High-level subtask predictionnoin the paper, not in the open releases

Pi0, briefly, because Pi0.5 is a diff against it

Pi0 takes PaliGemma, a 3 billion parameter open vision-language model, and adds "300M parameters for the action expert (which is initialized from scratch) for a total of 3.3 billion parameters". The expert emits a chunk of H = 50 future actions at once, which is ordinary action chunking, produced by integrating a flow field over 10 steps rather than by sampling tokens. Pretraining ran on over 10,000 hours of robot data across 7 robot configurations and 68 tasks, plus the Open X-Embodiment collection.

One number to ignore: the Hugging Face model-size badge reads "4B params" for both lerobot/pi0_base and lerobot/pi05_base, because it rounds. The safetensors index behind those pages gives 3,501,372,176 and 3,616,757,520. There is no 4 billion parameter Pi0.5.

StageTime (RTX 4090, per the Pi0 paper)
Image encoders14 ms
Observation forward pass32 ms
Action forward pass, 10 flow steps27 ms
Total on-board inference73 ms
Network latency, off-board case13 ms
Total off-board inference86 ms
Read that table as a chunk, not a step

73 ms buys you 50 actions, not one. The paper re-runs inference every 0.8 s after 16 actions on the 20 Hz UR5e and Franka arms, and every 0.5 s after 25 actions on the 50 Hz robots. A VLA latency number means nothing until you know whether it counts a chunk or a step, and whether a network hop sits inside.

Change 1: the gradient cut, also called knowledge insulation

The problem is stated bluntly in the follow-up paper, Knowledge Insulating Vision-Language-Action Models (arXiv 2505.23705, 29 May 2025): adding a continuous action expert naively harms both training speed and the semantic knowledge the VLM arrived with. A freshly initialised 300 M expert emits large, noisy gradients onto a backbone that spent its whole pretraining budget learning to read scenes and follow language.

  1. The action expert attends to the backbone's keys and values, but equations 5 and 6 of the paper wrap those tensors in a stop-gradient operator, written sg(). Information flows forward, error signal does not flow back.
  2. The backbone is trained instead with a next-token loss over FAST-tokenised actions, alongside ordinary vision-language data.
  3. The expert keeps its own flow-matching loss, weighted by a factor called alpha. Because the stop-gradient makes the two losses touch disjoint weights, that paper sets alpha = 1; Pi0.5's post-training used alpha = 10.0.
  4. Timestep conditioning inside the expert uses adaptive RMSNorm. In lerobot that is literally use_adarms=[False, True]: off for the backbone, on for the expert.

The reported effect is a training-cost collapse. Figure 6, a generalist model trained across many embodiments and evaluated on table bussing, states that Pi0 "trains significantly slower, requiring 7.5 times as many training steps to reach a similar performance". You get discrete-token training speed and continuous-action inference speed at once. That second half matters: the same paper puts an autoregressive Pi0-FAST at roughly 750 ms for a one-second chunk on an RTX 4090, citing the FAST paper for that measurement.

Why the language following gets better too

Stopping the gradient is described in the paper as "an effective way of improving language following" compared with Pi0. The caveat is in the next sentence: with VLM data in the mixture, joint training without the stop-gradient also follows language well. Two levers, not one.

Change 2: discrete tokens do the representation learning

Pi0.5 does not discard discrete actions, it promotes them. FAST (arXiv 2501.09747, 16 January 2025) compresses an action chunk with a discrete cosine transform, quantises the coefficients and runs byte-pair encoding over the result. Combined with Pi0, the authors report matching diffusion VLAs "while reducing training time by up to 5x". Pi0.5 uses that tokeniser for 280k pretraining steps, then adds the flow-matching expert for 80k post-training steps on a joint next-token plus flow-matching objective.

A second, smaller token change is the one you notice in a config file. Pi0.5 discretises the robot state into 256 bins and writes it into the language prompt, where Pi0 fed state in continuously. That is why the lerobot prompt budget jumps from 48 tokens to 200.

python
# lerobot main branch, files read 2026-08-23
# src/lerobot/policies/pi0/configuration_pi0.py
class PI0Config(PreTrainedConfig):
    paligemma_variant: str = "gemma_2b"
    action_expert_variant: str = "gemma_300m"
    chunk_size: int = 50
    n_action_steps: int = 50
    num_inference_steps: int = 10
    tokenizer_max_length: int = 48
    normalization_mapping = {
        "VISUAL": NormalizationMode.IDENTITY,
        "STATE":  NormalizationMode.MEAN_STD,
        "ACTION": NormalizationMode.MEAN_STD,
    }

# src/lerobot/policies/pi05/configuration_pi05.py
class PI05Config(PreTrainedConfig):
    paligemma_variant: str = "gemma_2b"        # same
    action_expert_variant: str = "gemma_300m"  # same
    chunk_size: int = 50                       # same
    n_action_steps: int = 50                   # same
    num_inference_steps: int = 10              # same
    optimizer_lr: float = 2.5e-5               # same
    tokenizer_max_length: int = 200            # four times the prompt budget
    normalization_mapping = {
        "VISUAL": NormalizationMode.IDENTITY,
        "STATE":  NormalizationMode.QUANTILES,  # q01 / q99, not mean / std
        "ACTION": NormalizationMode.QUANTILES,
    }
The architecture fields are identical between the two configs. The prompt budget and the normalisation mode are not.
python
# src/lerobot/policies/pi05/processor_pi05.py, lerobot main branch
# State arrives already normalised to [-1, 1] by the normalizer step.
discretized_states = np.digitize(state_np, bins=np.linspace(-1, 1, 256 + 1)[:-1]) - 1
...
state_str = " ".join(map(str, discretized_states[i]))
full_prompt = f"Task: {cleaned_text}, State: {state_str};\nAction: "
This is the whole of the state change. Your joint angles become integers in a text prompt, which is why the prompt budget had to grow.
The quantile default is the trap that eats a day

Pi0.5 normalises STATE and ACTION with quantiles, so meta/stats.json needs q01 and q99. A dataset recorded before that default carries only min/max/mean/std, and training dies on the first batch with ValueError: QUANTILES normalization mode requires q01 and q99 stats. Recompute the stats, or pass a MEAN_STD normalization mapping. See dataset rejected as v3 for the neighbouring version problem.

Change 3: hierarchical inference, and why you probably will not get it

The headline behaviour in the Pi0.5 paper is a two-stage rollout: the model predicts a semantic subtask in language, something like "pick up the pillow", then conditions the expert on it. Physical Intelligence describes a kind of chain of thought, where the model "first produces a high-level action expressed in language" and then "selects the motor commands using its flow matching action expert".

The open checkpoints are the low-level half only

The openpi README states plainly: "Note that, in this repository, we currently only support the flow matching head for both pi0.5 training and inference." The lerobot pi05_base card agrees: subtask prediction, action tokenization and RL "were not released upstream and are not included here". Fine-tuning Pi0.5 on your arm therefore runs a model whose training recipe came from a hierarchical system, flat. Expect the recipe's generalisation. Do not expect the robot to narrate its plan.

Change 4: the data, which is most of the generalisation story

It is tempting to attribute all of Pi0.5 to the gradient cut. The paper does not. Models trained without the full recipe are "significantly worse", and Physical Intelligence's own summary is that web data "makes the biggest difference for generalizing to out-of-distribution objects, while data from other robots (ME and CE) is important across all evaluation conditions".

ComponentWhat it contains
MM, mobile manipulatorabout 400 hours across about 100 home environments
ME, multi-environmentnon-mobile arms in many homes, no mobility cost
CE, cross-embodimentlab data including Open X-Embodiment, single and dual arm
HL, high-levelhand annotations of semantic subtasks
WD, web datacaptioning, question answering, object localisation
VI, verbal instructionsa supervisor coaching the robot step by step, post-training only
MixtureIn-dist. followIn-dist. successOOD followOOD success
Full Pi0.586 %83 %94 %94 %
no WD86 %82 %80 %74 %
no CE74 %67 %67 %49 %
no ME66 %57 %33 %31 %

Read the last two columns. Dropping web data costs one point of in-distribution success and twenty on out-of-distribution objects; dropping the other robots' data costs everything, everywhere. Proportions matter as much: 97.6 percent of the first-phase examples are not mobile manipulators doing household tasks. The scaling curve trains on 3, 12, 22, 53, 82 and 104 locations, and a control trained directly on the test homes "attains similar performance as the final 104-location model". Evaluation ran in three kitchens and three bedrooms never seen in training, on tasks of about 2 to 5 minutes.

The AY-Robots arena leaderboard: a sortable table of VLA models with benchmark results, each value linked to its source paper or model card
The arena tracks 85 VLA models and 332 benchmark results, every value linked back to the paper or model card it came from. Pi0 and Pi0.5 each have a row.

To see where the two sit against everything published in the same eighteen months, the arena has a row for Pi0, Pi0-FAST and Pi0.5, and each number links out to its source instead of asking you to trust a summary table.

What the benchmark numbers actually say

Neither paper gives a clean scalar for "Pi0.5 is N percent better than Pi0", and you should distrust anyone quoting one. The comparison is a figure caption: the full model "significantly outperforms both Pi0 and Pi0-FAST+Flow in the mock home test environments". The reproducible number is LIBERO, where the lerobot team fine-tuned the LIBERO base model for 6k extra steps against the openpi reference.

LIBERO suitelerobot pi05 implementationopenpi reference
Spatial97.0 %98.8 %
Object99.0 %98.2 %
Goal98.0 %98.0 %
Libero 1096.0 %92.4 %
Average97.5 %96.85 %
What this table is good for

It tells you the port is faithful. It tells you nothing about your desk. LIBERO sits at 97 percent, so it has stopped discriminating between good policies. Use it to confirm the stack is not broken, then measure on your own arm with your own episodes.

So which one do you fine-tune today

Choosing Pi0.5 over Pi0 for a small arm
Advantages
  • Same inference cost: expert, chunk length and 10 denoising steps are unchanged.
  • Faster to converge, per the knowledge insulation result of 7.5 times the steps for flow-matching-only training.
  • Better instruction following, which is the practical read of the stop-gradient ablation.
  • It is where the maintained checkpoints are: lerobot/pi05_base and lerobot/pi05_libero_base.
  • Quantile normalisation clips the outlier action spikes leader-follower teleoperation produces instead of letting them stretch the scale.
Trade-offs
  • No hierarchical half: subtask prediction is absent from both open implementations.
  • The gated PaliGemma tokeniser adds a licence acceptance and a login before your first run.
  • Full fine-tuning wants more than 70 GB of VRAM per the openpi table, so not a laptop project.
  • At 485 ms per action step it is the slowest of the five policies here, which constrains the tasks it can drive.

The summary for someone with an SO-100 on the desk: pick Pi0.5, not Pi0. To decide whether this family is right at all, the comparisons that matter are GR00T N1.7 against Pi0.5 and Pi0.5 against SmolVLA, because those decide the GPU bill and the control loop.

Head to head comparison table showing GR00T N1.7 against Pi0.5 on parameters, GPU tier, inference latency and dataset format
GR00T N1.7 against Pi0.5, side by side. The rows that usually decide it are inference latency and required dataset format.

Fine-tuning Pi0.5 on your own recordings

Two stacks train Pi0.5. openpi is the reference JAX implementation from Physical Intelligence; lerobot's pi05 policy is the PyTorch port and speaks LeRobot datasets natively. Use openpi for the original configs, lerobot if your data came off an SO-100.

  1. 1
    Clear the licence gate

    Pi0.5 uses the gated google/paligemma-3b-pt-224 tokeniser, whose Hub gate is set to manual approval. Accept the licence, then log in. Skip it and an authentication error lands minutes into the run, after the dataset has been scanned.

    bash
    # Pi0.5 uses the gated google/paligemma-3b-pt-224 tokenizer.
    # Accept the licence on the Hub first, then:
    hf auth login
    
    pip install -e ".[pi]"      # from a lerobot checkout
    pip install "lerobot[pi]"   # or from PyPI
  2. 2
    Fix your dataset statistics

    Pi0.5 wants q01 and q99 for STATE and ACTION. Recompute them, or pass an explicit MEAN_STD normalization_mapping and accept that you are off the model's own default.

    bash
    # Datasets recorded before the quantile default carry only
    # min/max/mean/std and die on the first batch with:
    #   ValueError: QUANTILES normalization mode requires q01 and q99 stats
    lerobot-edit-dataset \
        --repo_id your_dataset \
        --new_repo_id your_dataset \
        --operation.type recompute_stats \
        --operation.overwrite true
    
    # The result lands in $HF_LEROBOT_HOME/your_dataset, not the cache
    # --dataset.repo_id reads. Train with --dataset.root pointing there,
    # or push it to the Hub.
  3. 3
    Train

    The lerobot docs ship a LIBERO quickstart sized for a single 80 GB GPU: batch size 64, 30000 steps. --policy.pretrained_path loads weights only, so stored settings such as n_action_steps reset to defaults; --policy.path loads the checkpoint config too and forbids --policy.type.

    bash
    # adapted from the LIBERO quickstart in the lerobot pi05 docs,
    # swapped onto your own recording and onto lerobot/pi05_base.
    # The quickstart also forces MEAN_STD and --policy.empty_cameras=1;
    # both are LIBERO-specific, so they are dropped here.
    lerobot-train \
        --dataset.repo_id=your_user/so100_pick_place \
        --policy.type=pi05 \
        --policy.pretrained_path=lerobot/pi05_base \
        --policy.freeze_vision_encoder=false \
        --policy.train_expert_only=false \
        --policy.gradient_checkpointing=true \
        --policy.dtype=bfloat16 \
        --policy.device=cuda \
        --policy.push_to_hub=false \
        --output_dir=./outputs/pi05_so100 \
        --job_name=pi05_so100 \
        --batch_size=64 \
        --num_workers=8 \
        --steps=30000 \
        --save_freq=5000 \
        --seed=1000
  4. 4
    Or train the expert only, if VRAM is tight

    Freezing the VLM and training only the expert and the projections cuts memory, at some cost in success rate. openpi's table puts inference above 8 GB, LoRA above 22.5 GB and full fine-tuning above 70 GB.

    bash
    # less memory, at some cost in success rate:
    # freeze the whole VLM, train only the action expert and the projections
    lerobot-train \
        --dataset.repo_id=your_user/so100_pick_place \
        --policy.type=pi05 \
        --policy.pretrained_path=lerobot/pi05_base \
        --policy.freeze_vision_encoder=true \
        --policy.train_expert_only=true \
        --policy.gradient_checkpointing=true \
        --policy.dtype=bfloat16 \
        --batch_size=64 --steps=30000 --seed=1000
  5. 5
    Serve the checkpoint

    In openpi the policy server is a script the robot client connects to. Normalisation statistics first, training second. Keep the server on the same machine as the arm.

    bash
    # openpi, README as of 2026-08-23
    git clone --recurse-submodules git@github.com:Physical-Intelligence/openpi.git
    GIT_LFS_SKIP_SMUDGE=1 uv sync
    GIT_LFS_SKIP_SMUDGE=1 uv pip install -e .
    
    uv run scripts/compute_norm_stats.py --config-name pi05_libero
    XLA_PYTHON_CLIENT_MEM_FRACTION=0.9 uv run scripts/train.py pi05_libero \
      --exp-name=my_experiment --overwrite
    
    # serve the checkpoint to a robot client (listens on port 8000)
    uv run scripts/serve_policy.py policy:checkpoint \
      --policy.config=pi05_libero \
      --policy.dir=checkpoints/pi05_libero/my_experiment/20000

The parts nobody writes down: a 24 GB card cannot do a full fine-tune, so you are freezing something or renting an 80 GB card; torch.compile is off by default in PI05Config and its compile_mode default is max-autotune, which pays a long first step; and with --save_freq=5000 your first checkpoint arrives at step 5000. Budget for the rented hour.

Where this does not help

Pi0.5's selling point is open-world generalisation across homes. One SO-100 doing one task on one desk is not that problem. Knowledge insulation still buys faster convergence and better language grounding, but the 104-location scaling curve is not something a hobby dataset reproduces. If a policy fails, the failure mode pages beat a bigger model, because most first-run failures are imitation learning data problems, not architecture problems.

Latency is the hard limit, not accuracy

Inference has to sit next to the servos for anything fast. Here the control loop runs 20 to 485 ms per action step depending on the model, and Pi0.5 is at the slow end. Public-internet round trips on top turn a working policy into a hesitant one: viable for slow pick and place, not fast reactive motion. If a policy stalls mid-motion, start at policy freezes mid-motion.

PolicyParamsInference per action stepGPU tierMin episodesDataset format
ACTabout 80 M20 msRTX 4090, any 24 GB card50LeRobot v3.0
SmolVLAabout 450 M245 msRTX 4090, any 24 GB card30LeRobot v3.0
GR00T N1.7about 3 B152 msA100 80 GB or H100 80 GB50LeRobot v2.0 or v2.1
GR00T N1.5about 3 B165 msA100 80 GB or H100 80 GB50LeRobot v2.0 or v2.1
Pi0.5about 3 B485 msA100 80 GB or H100 80 GB50LeRobot v3.0

Read that as a control-loop budget, not a quality ranking. ACT at 20 ms is not better than Pi0.5. It is a from-scratch policy with no language grounding, which is why it is fast. SmolVLA at 245 ms and 30 minimum episodes is the middle option on a 24 GB card. If inference latency is killing you, moving down that table beats tuning the model you have.

While you are near the hardware

The Feetech STS3215 servos in an SO-100 or SO-101 run at 7.4 V. Feeding them 12 V destroys them, silently and permanently. Check the supply before you check the policy.

What came after Pi0.5

Physical Intelligence did not stop in April 2025. Pi-star 0.6 (17 November 2025) adds a reinforcement learning stage called RECAP on top of demonstrations and corrections. MEM (arXiv 2603.03596, 4 March 2026) adds mixed-modal memory for tasks up to fifteen minutes, and its switches already sit in the lerobot pi05 config as use_visual_memory and use_proprioceptive_memory, both False by default. The arena entry for Pi-star 0.6 and Pi0.7 track the rest.

None of it changes today's answer. As of August 2026 the fine-tunable, openly released, dataset-compatible member of the family is Pi0.5, which is the one on the training matrix. Never trained a VLA at all? Train your first policy and the training docs are the shorter way in, and the fine-tuning glossary entry defines the terms above.

Five policies, real numbers, no guessing

Pi0.5, GR00T N1.7, GR00T N1.5, SmolVLA and ACT on parameters, GPU tier, inference latency per action step, minimum episodes and dataset format. The same table the training form reads.

Compare the policies
Is Pi0.5 just Pi0 trained on more data?

No, but data is the larger half. The architectural change is real: the action expert's gradients are stopped before they reach the VLM backbone, and the backbone learns motor representations from FAST discrete action tokens instead. The ablations then show the co-training mixture, web data in particular, is what produces the open-world generalisation.

Do I get the high-level subtask prediction when I fine-tune Pi0.5?

No. The openpi README says the repository supports only the flow matching head for Pi0.5 training and inference, and the lerobot pi05_base card says subtask prediction, action tokenization and RL were not released upstream. You fine-tune a model trained with a hierarchical recipe, run flat.

Can I fine-tune Pi0.5 on a 24 GB card?

Partly. openpi lists inference above 8 GB, LoRA above 22.5 GB and full fine-tuning above 70 GB. In lerobot, --policy.train_expert_only=true freezes the VLM and trains only the expert and the projections, which fits smaller cards at some cost in success rate. On AY-Robots Pi0.5 is cloud-only on the A100 80 GB or H100 80 GB tier; SmolVLA and ACT also run locally.

Why does training die on the first batch with a q01 and q99 error?

Because Pi0.5 normalises STATE and ACTION with quantiles while older datasets carry only min, max, mean and std. Recompute with lerobot-edit-dataset; the output lands in $HF_LEROBOT_HOME rather than the cache --dataset.repo_id reads, so point --dataset.root there or push to the Hub. Or pass an explicit MEAN_STD normalization_mapping.

Pi0.5 or GR00T N1.7 for an SO-100?

Latency and dataset format decide it more often than accuracy. Pi0.5 runs at 485 ms per action step and wants LeRobot v3.0. GR00T N1.7 runs at 152 ms but needs the dataset converted down to v2.0 or v2.1, because a v3.0 dataset crashes its loader. Both need an A100 80 GB or H100 80 GB tier and 50 episodes, and a run costs about 4 to 12 USD.

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started