Where you are. You have fine-tuned a 450M model on your own data and learned to read a benchmark without being fooled by it. This lesson steps up a weight class, to the 3B checkpoints Physical Intelligence publishes, where the limit stops being your patience and becomes your graphics card.
A number, and the number just under it
Your card has 24 gigabytes of memory. That is the card most people doing this work actually own, and it is the number you will be doing arithmetic against for the rest of this module.
The repository you are about to clone publishes a table. The row you care about, the one for adapting a 3B model to your own robot, says: more than 22.5 gigabytes.
Do the subtraction. One and a half gigabytes. That is not a margin. That is the amount of memory a second browser tab uses.
Now read the row underneath it, the one for training the whole model rather than a small adapter on top of it: more than 70 gigabytes. There is no consumer card in that neighbourhood, and there will not be one soon.
Everything about working with frontier open models is downstream of those three numbers. Not the architecture, not the maths, not the prompt. Three numbers in a table, and which side of each one your hardware sits on.
The idea in one paragraph
openpi is Physical Intelligence’s public repository: real weights for the π₀ family, a documented way to fine-tune them, and nothing else. Using it is a plumbing exercise, and the plumbing has four decisions in it. Which checkpoint you start from, because base checkpoints and platform-specific fine-tunes are different products. Which memory regime you can afford, because inference, adapter fine-tuning and full fine-tuning sit at 8, 22.5 and 70 gigabytes and there is no negotiating. Which licence actually governs the weights, which is a different question from the licence on the code. And where the model physically runs, because a 3B model does not fit on the machine wired to your arm, so a network hop is going to end up inside your control loop whether you plan for it or not.
What is actually on the shelf
Wider than the screen; scroll it sideways.
Three base checkpoints: pi0_base, pi0_fast_base and pi05_base. Then a set of fine-tuned ones whose names tell you their embodiment - two DROID variants, three ALOHA variants for towel folding, tupperware and pen uncapping, and π₀.₅ tuned for DROID and for the LIBERO simulation benchmark. They are hosted in a public bucket and cached under your home directory on first use, so the download happens once and then stops being a thing you think about.
Notice what is not in that list: an SO-101. Every fine-tuned checkpoint names a platform, and none of the platforms is the arm on your desk. Zero-shotting pi0.5-DROID at your own arm is worth doing exactly once, to watch what a confident wrong answer looks like, and then you fine-tune.
The runtime split is the other thing to check before planning a week around a checkpoint. PyTorch support arrived in September 2025 and covers π₀ and π₀.₅, validated on the LIBERO simulation benchmark. π₀-FAST is JAX only.
If your whole toolchain is PyTorch, those two lines silently remove a checkpoint and a fine-tuning mode from your options, and it is the kind of detail that costs a day when you find it at step four instead of step one.
And two models are not on the shelf at all. π*₀.₆, the version trained with reinforcement learning on the robot’s own corrected attempts, and π₀.₇, the steerable generalist from April 2026, both have papers and neither has weights. Everything either of them can do is something you read about.
The licence question you have to answer yourself
The repository carries Apache-2.0 for its code. That is a statement about the code.
Three memory regimes
Here is the table the hook was quoting, from the repository’s own documentation as of August 2026.
| Mode | Memory floor | What runs it |
|---|---|---|
| Inference | more than 8 GB | any recent card; an edge module works |
| LoRA fine-tune | more than 22.5 GB | a 24 GB consumer card, with nothing to spare |
| Full fine-tune | more than 70 GB | an 80 GB datacentre card, rented |
Wider than the screen; scroll it sideways.
What a run costs
Owning the card makes the run free and slow. Renting makes it fast and cheap enough that the decision is usually not about money at all.
| Card | Rough hourly rate, August 2026 | What it is for |
|---|---|---|
| RTX 4090, 24 GB | $0.34 | LoRA, slowly |
| A100, 80 GB | $1.19 to $2.50 | LoRA fast, or a full fine-tune |
| H100 | $1.49 to $6.98, median around $3.41 | a full fine-tune in a day |
Those figures come from rental aggregators rather than provider pricing pages, they moved about 14% in a year, and they should be treated as plus or minus 30%. Price your own run at the provider before you quote a number to anyone.
The shape of the thing you build
A 3B model does not run on the machine wired to your arm. That single fact determines the architecture of every openpi deployment.
Wider than the screen; scroll it sideways.
The model lives on a policy server, which is whatever machine has the big card. The robot host is a laptop or a small board with a USB cable running to the servos; it reads the cameras and the joint angles, sends them over, and receives back a chunk of future actions. π₀ predicts 50 of them at a time, which is what lets a model this heavy drive a control loop at all: you cross the network roughly once a second, not fifty times a second, and the host plays out the chunk it already has in between.
The consequence to internalise now: your control loop has a network in it. On a wired local network that is fine and mostly invisible. Across the public internet to a rented card it is a variable-latency link inside a real-time system, which is a bad place for one. The next lesson is entirely about that.
Check yourself
1. You have a 24 GB card. Which of the three openpi modes can you run, and what does that mean for how you plan a month of work?
Inference comfortably, with about 16 GB spare. LoRA fine-tuning by 1.5 GB, which in practice means it fits only if nothing else on the machine is using the GPU and you keep the batch size small. Full fine-tuning is not available to you at all - it is 46 GB short, and no configuration change closes that. So your plan is: adapt with LoRA locally, and if you ever need a full fine-tune, budget for a rented 80 GB card rather than trying to squeeze it.
2. The repository is Apache-2.0. Your employer’s counsel asks whether you can ship a product built on one of its checkpoints. What do you tell them?
That you do not know yet, and that the repository licence does not answer the question. Code and weights are licensed separately, and the weights licence is the one that governs a shipped product. The action is to open the LICENSE file and the model card for the specific checkpoint and read the text, with the date you read it. The GR00T case is the reason to be careful: Apache-2.0 code, a bespoke NVIDIA licence on the weights, and a lot of secondary coverage that reported it as fully Apache-2.0.
3. Why does openpi push you towards a client-server split instead of just running the policy on the robot’s computer?
Because the model does not fit there. A 3B checkpoint needs more than 8 GB just to run, and the machine wired to your arm is usually a laptop or a small board. So the GPU machine hosts the policy and the robot host keeps the cable, the cameras and the control loop, and they talk over a socket. It is the same reason you do not run a large model inside your web server process: the memory lives somewhere else, so the call goes somewhere else.
4. Given that a network round trip is now inside your control loop, why does the arm not stutter every time the network hiccups?
Because each reply contains a chunk of 50 future actions rather than one. The robot host plays the chunk out locally at its own rate while the next request is in flight, so a late reply eats into the margin at the end of the chunk instead of leaving the controller with nothing to send. Chunking is what converts a request-response model into something a real-time loop can tolerate, and it is the same mechanism you already met in ACT.
5. You download pi0.5-DROID and run it on your SO-101. What should you expect, and what does the result tell you?
Expect it to move confidently and wrongly. That checkpoint was fine-tuned for a different robot with a different arm geometry, gripper and camera placement, and none of that transfers for free. What the run tells you is not “the model is bad” - it is that a fine-tuned checkpoint is a statement about an embodiment, and the base checkpoint plus your own data is the path for your hardware. It is a useful ten minutes precisely because a confident wrong policy looks very different from an untrained one.
6. Why is fine-tuning a $13 decision while pretraining is not a decision you get to make?
Scale. Adapting an existing checkpoint touches a small number of parameters for a few hours on one card. Pretraining builds the representation from scratch: SmolVLA, the smallest serious model in this space, reports roughly 30,000 GPU-hours for the project, which is on the order of $39,000 of rented compute, and the models in this lesson are much bigger. The practical consequence is that your leverage is entirely in data and adaptation, and it is worth being clear-eyed that the expensive half was done by somebody else and handed to you.
Do this
1. Plan the run before you clone anything. Save this and run it with your own numbers.
# Memory floors for a pi0.5-class checkpoint, from the openpi repository's own
# table, read 2026-08-09. Rental rates are US dollars per hour from aggregator
# listings the same month: treat them as plus or minus 30% and re-check.
MODES = [("inference", 8.0), ("LoRA fine-tune", 22.5), ("full fine-tune", 70.0)]
RATES = {"RTX 4090": 0.34, "A100 80GB": 1.30, "H100": 3.41}
def plan(vram_gb, hours):
print(f"\na {vram_gb:g} GB card, for a {hours} h run:")
for name, need in MODES:
spare = vram_gb - need
verdict = f"fits, {spare:.1f} GB spare" if spare > 0 else f"short by {-spare:.1f} GB"
print(f" {name:<15} needs > {need:>4} GB {verdict}")
for card, rate in RATES.items():
print(f" rent a {card:<10} ${rate:>4.2f}/h -> ${rate * hours:7.2f}")
plan(24, 10) # the card you probably have
plan(80, 24) # the card you would rent
It prints fits, 1.5 GB spare for LoRA on 24 GB and short by 46.0 GB for the full fine-tune. Swap in your actual card and your actual patience.
2. Do the reconnaissance, and date it. Open the repository and write four lines into notes/05-openpi.md, each with today’s date: the current list of base checkpoints; the licence text you actually found covering the weights, quoted, not summarised; whether your target checkpoint is supported in your framework; and the memory table as it reads today. If any of the four disagrees with this lesson, this lesson is the one that is out of date.
3. Commit to a plan in three lines. Which checkpoint you will start from and why. Which memory regime you will use, and on whose hardware. What the stop condition is - a success rate you would accept, or a number of hours after which you stop and go back to the smaller model. Writing the stop condition down before the first run is the difference between an experiment and a hobby.
What you can now do
You can plan an openpi run without guessing: name the checkpoints that exist and the two that only have papers, tell a code licence from a weights licence and know which one to read, place your own hardware against the 8, 22.5 and 70 gigabyte floors, price the rented alternative to within a factor you would defend, and draw the policy-server split that a 3B model forces on any robot small enough to sit on a desk.