| Fact | GR00T N1.7Vision-Language-Action foundation model, diffusion action head | Pi0.5Flow-matching Vision-Language-Action model (policy type pi05) |
|---|---|---|
| Vendor | NVIDIA | Physical Intelligence |
| Trainer key | groot1.7 | pi0 |
| GPU tier | A100 80 GB or H100 80 GB | A100 80 GB or H100 80 GB |
| Inference | about 152 ms per action step | about 485 ms per action step |
| Batch size | 32 | 1 |
| Gradient accumulation | 1 | 16 |
| Learning rate | 1e-4 | 5e-5 |
| Default steps | 20,000 | 30,000 |
| Dataset format | LeRobot v2.1 | LeRobot v2.1 |
| Episodes from | 50 | 50 |
| Extra fields in the form | saveSteps | seed, logFreq |
| Where it runs | Rented cloud GPU only | Rented cloud GPU only |
| Typical run | 3 to 6 hours, about 4 to 12 USD | 3 to 6 hours, about 4 to 12 USD |
Train GR00T N1.7 first, because it closes the loop three times faster and finishes its schedule in a fraction of the passes, and switch to Pi0.5 only when your failures are precision failures at the moment of contact or you need a fixed seed.
The short answer
On paper these two are the same class of model: around three billion parameters each, both on the 80 GB tier, both reading LeRobot v2.1, both useful from about fifty episodes. The choice is not about capability in the abstract. It is about a control loop that closes in 152 ms against one that closes in 485 ms, and a recipe that pushes a batch of 32 through in one pass against one that assembles every optimizer step out of sixteen single-sample passes. GR00T N1.7 is the default. Pi0.5 answers two specific problems: tasks where the last centimeters decide success, and runs somebody else has to repeat.
Side by side
| Fact | GR00T N1.7 | Pi0.5 |
|---|---|---|
| Vendor | NVIDIA | Physical Intelligence |
| Parameters | About 3 billion, roughly 40 million trained during fine-tuning | About 3 billion, on a PaliGemma backbone |
| Architecture | Vision-language-action foundation model, diffusion action head | Flow-matching vision-language-action model, policy type pi05 |
| GPU tier | A100 80 GB or H100 80 GB | A100 80 GB or H100 80 GB |
| Inference per action step | About 152 ms | About 485 ms |
| Default batch and accumulation | 32, no accumulation | 1 with 16 accumulation steps |
| Default learning rate and steps | 1e-4 over 20 000 steps | 5e-5 over 30 000 steps |
| Seed support | None, the entry point has no seed field | seed is exposed in the training form |
| Other exposed knobs | saveSteps | logFreq |
| Minimum useful episodes | About 50 | About 50 |
| Language conditioning | Yes | Yes |
| Dataset format | LeRobot v2.1 only, v3.0 is rejected | LeRobot v2.1 |
What 152 ms against 485 ms means on the arm
Latency here is the time to turn one observation into one action step. At 152 ms the loop closes six to seven times a second. At 485 ms it closes about twice a second, and every command the arm executes rests on a picture of the world that is roughly half a second old.
If nothing in your scene moves except the arm, that staleness costs cycle time and nothing else. It starts costing success the moment something changes without the arm having caused it: an object that rolls after a nudge, a part that settles differently on contact, a hand entering the frame. You cannot buy the time back with a longer action horizon either, because chunkSize and nActionSteps are ACT-only controls. What the table says is what the arm gets.
Batch 32 against batch 1 with sixteen accumulation steps
Gradient accumulation imitates a large batch on a card that cannot hold one: several small passes, gradients added up, then one optimizer step. Pi0.5 defaults to batch 1 with 16 accumulation steps, an effective batch of 16 built from sixteen sequential passes. GR00T N1.7 defaults to batch 32 with no accumulation, so one pass is one optimizer step.
Multiply that out. GR00T runs 20 000 optimizer steps, so 20 000 passes and about 640 000 sample views. Pi0.5 runs 30 000 steps at sixteen passes each, roughly 480 000 passes for about 480 000 sample views. Similar sample budgets, very different demands on the GPU, and a batch of one leaves most of an 80 GB card idle. Both runs still fall inside the 80 GB estimate of three to six hours at 1.20 to 2.00 USD per hour, with GR00T toward the bottom of that band and Pi0.5 toward the top.
If you halve a batch size because a run ran out of memory, double the accumulation to keep the recipe you started from. Changing one without the other silently changes how far each optimizer step moves the weights.
Pick GR00T N1.7 if
- Cycle time is part of the point: pick and place, sorting, handovers. Six to seven action steps a second is the difference between an arm that looks like it is working and one that looks like it is thinking about it.
- Objects do not always land where you demonstrated them. Pretraining on a multi-robot corpus is the thing you are renting the 80 GB card for.
- You plan to iterate this week. A run at the bottom of the band lets you evaluate, record for the failures you found, and start again the same day.
Pick Pi0.5 if
- Your task is contact-rich: seating a lid, inserting a peg, stacking blocks that have to stay stacked. Flow matching produces continuous trajectories instead of discretized jumps, and the final approach is where that shows.
- Somebody has to repeat the run. Pi0.5 exposes seed and logFreq. GR00T has no seed field at all, on either version.
- The task is quasi-static. If the object sits still until the gripper touches it, 485 ms costs you patience during evaluation and nothing on the outcome.
What Pi0.5 does better, said plainly
Reproducibility is not a small thing to give up. Two GR00T runs launched with identical settings on identical data can come out different, and no field in the form prevents it. For a thesis chapter or anything a colleague will try to repeat next month, that outweighs 333 ms of latency.
The Pi0.5 recipe is also the more cautious one: 5e-5 over 30 000 steps against 1e-4 over 20 000. A lower rate applied for longer is more forgiving of a dataset with a few sloppy episodes, because no single batch moves the weights far. That is not a benchmark claim, it is what the two sets of defaults describe. And logFreq earns its place: GR00T only lets you control checkpoint frequency through saveSteps, while the lerobot-family trainers let you raise logging density and watch the curve when something looks wrong early.
Run both instead of arguing about it
- 1Upload once, as LeRobot v2.1
Both trainers read the same format, so one upload feeds both jobs. GR00T rejects v3.0, and finding that out after fifty episodes is a bad afternoon.
- 2Start GR00T N1.7 at its defaults
Open Training, pick the dataset, choose GR00T N1.7, leave batch 32 and 20 000 steps alone. Lower saveSteps for more checkpoints to compare.
- 3Start Pi0.5 on the same dataset with a fixed seed
Second job, same dataset. Write the seed down next to the job id, because this is the run you will be asked to repeat.
- 4Evaluate both with one protocol
Twenty attempts each, same placements in the same order, same lighting, written down as you go. Do not evaluate one policy before and one after rearranging the desk.
- 5Classify the failures, not just the count
Confidently wrong location is a data or camera problem and neither model fixes it. Correct arrival with a fumbled grasp is the precision case Pi0.5 exists for.
# Streamable HTTP + JSON-RPC 2.0 at /api/mcp, protocol version 2025-06-18.
# Dataset and training tools take your API key as a Bearer token.
curl -s https://www.ay-robots.com/api/mcp \
-H "Authorization: Bearer $AY_ROBOTS_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "start_training",
"arguments": {
"dataset_id": "ds_7f31c0a4",
"policy_name": "cube pick, groot n1.7 baseline",
"model_id": "groot1.7",
"max_steps": 20000,
"confirm_spend": true
}
}
}'
# Second job, same dataset_id: "model_id": "pi0" and "max_steps": 30000.
# confirm_spend rents a GPU by the hour and bills the account, so the call
# is refused unless you set it on purpose.Switching later costs one more run
The dataset is the asset. A checkpoint is a few hours of rented GPU and you can throw it away without losing anything you worked for. The episodes are what cost you an afternoon: the fixed cameras, the identical task string, the fifty resets, the failures you had the discipline to discard. Both trainers read LeRobot v2.1, so changing your mind means a new job against the same dataset id, not a new recording session.
Where to go next
- /policies/groot-n1-7 for the full GR00T N1.7 fact sheet: defaults, limits, dataset requirements
- /policies/pi0-5 for the same on Pi0.5, including what flow matching changes about the action output
- /train/groot-n1-7-on-so-100 for the step by step training guide on an SO-100
- /train/pi0-5-on-so-100 for the Pi0.5 version of that guide
- /compare/groot-n1-7-vs-smolvla if the 80 GB rental is the part you are unsure about
Frequently asked questions
Can I fine-tune either of these on a 24 GB card?▾
No. Both request the 80 GB tier, and there is no meaningful way to fine-tune a three billion parameter model on a consumer GPU. If 24 GB is your budget, the options are SmolVLA and ACT at roughly 1 to 3 USD a run instead of 4 to 12.
Does the 485 ms matter if my task is slow anyway?▾
Much less than the number suggests. Latency hurts when the world changes between the observation and the action. If the object stays put until the gripper reaches it, 485 ms mostly means your evaluation takes longer to sit through.
Why does GR00T not have a seed?▾
The fine-tuning entry point does not expose one, so the form has no field to show. Record the job id, the dataset, the step count and the checkpoint you evaluated instead, and use saveSteps to control how many checkpoints you get.
Are these defaults tuned for the SO-100 specifically?▾
No, they are the platform defaults per trainer and apply to every supported arm. If you change something, change the step count first: it has the most predictable effect and is the easiest to reason about afterwards.
I only have thirty episodes. Which of the two?▾
Neither. Both want around fifty before the comparison means anything. At thirty episodes the model that fits your data is SmolVLA, and the money saved is better spent on twenty more demonstrations.
Once the choice is made, the matrix under /train has the guide for your model and your arm.