The AY-Robots policies comparison table showing GR00T N1.7, GR00T N1.5, Pi0.5, SmolVLA and ACT side by side with parameter counts, GPU tier, inference latency and minimum episode counts
vla-modelspolicy-trainingmodel-selectionlerobotso-100

Which VLA Policy Should You Train in 2026?

AY-Robots ResearchAugust 23, 202618 min read

GR00T N1.7, Pi0.5, SmolVLA, ACT or GR00T N1.5? A decision table matched to real situations, with the published benchmark numbers, latency, cost per run and licences behind each choice.

Five policies are trainable on an SO-100 class arm today. They differ by a factor of 24 in inference latency, 37 in parameter count and 12 in what a run costs, and in whether you may ship the result. Five model cards will not settle it: none answers the question you have, which do I run first?

Every number below was read out of the papers, repos and cards in August 2026. Platform numbers come from the AY-Robots policy catalog; where the two disagree, both are shown.

The short version

  • Train ACT first if you doubt your dataset: 1 to 3 USD a run, nothing pretrained to paper over bad data.
  • GR00T N1.7 and Pi0.5 sit within half a point on LIBERO, 97.0 against 96.85 to 97.5. That is not a reason to pick either.
  • Pi0.5 is the generalization play, not the accuracy play, and the slowest at 485 ms.
  • SmolVLA, at 450 M parameters, is the only VLA here that fine-tunes on one 24 GB card.
  • ACT at 20 ms is the only option for fast reactive motion. Licences decide the rest.

The decision table

Your situationTrain thisWhy
Dataset quality unprovenACTNothing pretrained hides a broken dataset, and failing costs 1 to 3 USD.
Contact-rich, multi-step, language-conditionedGR00T N1.797.0% over four LIBERO suites, plus a relative end-effector action space.
Fast reactive motion, inference at the servosACT20 ms. The next fastest is 7.6 times slower.
New objects, new scene, open-worldPi0.5Built for out-of-distribution behaviour, across up to 104 locations.
One 24 GB card, still want languageSmolVLA450 M parameters, a 30 episode floor, runs locally.
Reproducing a run recorded in 2025GR00T N1.5Only if you must: LeRobot now rejects it, weights non-commercial.
This will ship as a productN1.7, SmolVLA or ACTN1.5 is non-commercial, Pi0.5 carries Gemma terms, SmolVLA's card states none.

The five candidates

All five are imitation learning policies: camera frames, joint positions and, for four of them, a language instruction, mapped to a chunk of future joint targets. What separates them is how much was learned before you arrived.

PolicyParamsLatencyGPU tierLocal?Min episodesFormatCost
ACT~80 M20 ms24 GB cardyes50v3.01 to 3 USD
SmolVLA~450 M245 ms24 GB cardyes30v3.01 to 3 USD
GR00T N1.7~3 B, ~40 M tuned152 msA100/H100 80 GBno50v2.0/v2.14 to 12 USD
GR00T N1.5~3 B165 msA100/H100 80 GBno50v2.0/v2.14 to 12 USD
Pi0.5~3 B, PaliGemma485 msA100/H100 80 GBno50v3.04 to 12 USD

GR00T N1.7

NVIDIA's current vision-language-action model, about 3 B parameters, roughly 40 M trained during fine-tuning. The repo lists the deltas from N1.6: backbone from a vendored Eagle model to Cosmos-Reason2-2B on Qwen3-VL, diffusion layers 32 to 16, state and action dimensions 29 to 132, action horizon 16 to 40.

What matters on a small arm is the relative end-effector action space: N1.7 predicts deltas from the current pose, which is what lets 20K hours of EgoScale human video transfer into a robot policy. Spec on the N1.7 page, procedure in the N1.7 on SO-100 guide.

GA in the repo, EA on the model card

The Isaac-GR00T README declares N1.7 a General Availability release, with complete benchmarks and support. Its Hugging Face card has not caught up: the Model Version field still reads GR00T N1.7 EA. The repo is the newer document.

GR00T N1.5

Same 3 B scale, Eagle 2 backbone, SigLip2 and T5, flow-matching DiT head. It exists to extend a checkpoint you already have. Two things make it a poor default: the weights carry NVIDIA's one-way non-commercial licence, and current LeRobot releases removed N1.5 support. See N1.7 against N1.5.

Pi0.5

Physical Intelligence's flow-matching VLA, policy type pi05. The paper gives a 2 B VLM initialised from PaliGemma plus a 300 M action expert, driving the robot at 50 Hz; LeRobot's pi05 config defaults to a 50-step chunk, one second at that rate. The selling point is unseen places: about 400 hours of mobile manipulation in real homes, and a scaling study over 3, 12, 22, 53, 82 and 104 locations, where the 104-location model matched a control trained on the test homes themselves.

One limit, stated on the lerobot/pi05_base card: the port carries only the flow-matching action head. Subtask prediction, action tokenization and RL were not released upstream, and openpi says the same of its own repository. The Pi0.5 page and the Pi0.5 on SO-100 guide have the rest.

The trap that eats an afternoon: gated repos

Pi0.5 needs the gated google/paligemma-3b-pt-224 tokenizer (gated: manual, though Google says requests are processed immediately). Without accepting it and running hf auth login in the training environment, the job starts, downloads a while, then dies on an authorisation error that reads like a network fault. nvidia/GR00T-N1.7-3B is not gated, but its nvidia/Cosmos-Reason2-2B backbone is (gated: auto). Clear both before queueing; if a run sits idle, the stuck-queue page lists what to check.

SmolVLA

450 M parameters, about 100 M in the action expert, on SmolVLM-2 with the VLM frozen and only its first 16 language-model layers used. Pretraining was community data: 481 datasets, 10.6 M frames, from the same cheap arms you use. The only VLA here that fits one 24 GB card, and the only 30 episode floor. See the SmolVLA page.

ACT

Not a foundation model. The Action Chunking Transformer from ALOHA is about 80 M parameters trained from scratch per task, on 50 demonstrations at 50 Hz. The paper reports six real bimanual tasks from roughly ten minutes of demonstrations each, at 80 to 90 percent on the examples it highlights. Its idea, action chunking, is in every model on this page, and its ablation still measures the effect best: over two simulated tasks with temporal ensembling off, success rises from 1 percent at k=1 to 44 percent at k=100. The ACT page has the rest.

What the benchmarks actually say

LIBERO is the one benchmark three of these five report on: language-conditioned tasks on a simulated Franka Panda, split into the four suites below at ten tasks each. NVIDIA ran 200 trials per suite.

ModelSpatialObjectGoal10 (Long)Average
GR00T N1.7 (Isaac-GR00T)97.65%98.45%97.5%94.35%97.0%
Pi0.5 at 30k (openpi)98.8%98.2%98.0%92.4%96.85%
Pi0.5, LeRobot port97.0%99.0%98.0%96.0%97.5%
SmolVLA 0.45B (paper)90%96%92%71%87.3%
OpenVLA 7B (paper)84.7%88.4%79.2%53.7%76.5%
These rows are not strictly comparable

Every number comes from a different harness and budget. GR00T ran 20K steps at global batch 640; the openpi figure is a 30K checkpoint; the LeRobot port added 6K steps to a LIBERO base model. SmolVLA is a further mismatch: its paper trains that row on LIBERO from scratch, with no VLA pretraining, while the three above it fine-tune pretrained checkpoints. Treat 96.85 to 97.5 as one cluster, and the gap to 87.3% as real but bought with 6.7x the parameters.

SimplerEnv shows the spread, which LIBERO does not. NVIDIA compares N1.7 against N1.6, the closest public thing to a generational delta.

SimplerEnv suiteN1.6 averageN1.7 averageBest swingWorst swing
Bridge (WidowX), 7 tasks56.6%62.3%stack_cube 5.0 to 48.0put_eggplant_in_basket 89.0 to 53.0
Fractal (Google Robot), 6 tasks52.0%72.5%open_drawer 0.0 to 65.0none, every task improved

The Bridge row is the useful one: 5.7 points gained on average while put_eggplant_in_basket lost 36 and put_eggplant_in_sink fell from 33 to 2. A new generation moves the distribution rather than lifting it, so if your task sits where N1.7 regressed, the average says nothing.

The AY-Robots arena leaderboard, a sortable table of 85 vision-language-action models with 332 benchmark results, each value linked to the paper or model card it came from
The arena holds 85 VLA models and 332 benchmark results, each linked back to its paper or model card. Useful for checking whether a number quoted in a blog post is real.

Of the five, only the SmolVLA paper reports on an SO-100 class arm: 78.3 percent for SmolVLA and 61.7 for Pi0 across three tasks, both multi-task, against 48.3 for ACT trained single-task, which is not like for like. The clean pairing is both single-task on SO-101 pick-and-place: 90 against 70 in distribution, 50 against 40 out of it. Compare on ACT against SmolVLA and Pi0.5 against SmolVLA, or browse the arena.

Latency and cost decide deployment

Inference latency is the constraint people discover last and regret first. A policy five points better on a benchmark but half a second per action step looks worse on your desk: contact dynamics do not wait.

One caveat: the GR00T figure disagrees with NVIDIA's card, which times 4 denoising steps and one camera at 85.8 ms on an H100 in eager mode, 48.6 ms with torch.compile, 27.9 ms through full TensorRT. The 152 ms here is a whole-stack figure with serving overhead and more than one camera, not a forward pass.

Remote inference has a hard ceiling

The 20 to 485 ms loop is the model's, and public-internet round trips add to it. Remote inference is viable for slow pick-and-place, not for fast reactive motion. If your task needs speed, inference sits next to the servos: ACT or SmolVLA, locally. Related: policy freezes mid-motion.

One way to buy time without changing model: the SmolVLA paper measures synchronous execution, where the policy finishes a chunk before predicting the next, against asynchronous, where prediction overlaps execution. Success is similar, 78.3 against 73.3, but the same pick-and-place takes 9.7 seconds instead of 13.75, and in a fixed window the robot manages 19 cycles instead of 9.

Licences, checked because nobody checks them

ModelWeights licenceCode licenceCommercial use
GR00T N1.7NVIDIA Open Model License; card allows commercial useApache 2.0yes
GR00T N1.5NVIDIA one-way non-commercial licenceApache 2.0no
Pi0.5pi05_base card metadata reads license: gemmaApache 2.0 (openpi, LeRobot docs)read both, they disagree
SmolVLAno licence field on the smolvla_base cardApache 2.0 (LeRobot)code yes, weights unstated
ACTno base weights existApache 2.0 (LeRobot)yes

The Pi0.5 row needs care. The LeRobot pi05 documentation states Apache 2.0 consistent with openpi, while the Hub card for lerobot/pi05_base carries license: gemma. Both are live. GR00T N1.7 has a milder version: the Isaac-GR00T README says in passing that N1.7 is fully commercially licensable under Apache 2.0, while its own licence section and the model card put only the code under Apache 2.0 and the weights under the NVIDIA Open Model License.

The defaults you will actually run

Each trainer form ships a default, and they are not arbitrary. ACT's are LeRobot's own: batch 8, lr 1e-5, 100000 training steps, chunk size 100, matching ACTConfig upstream and k=100 from the ACT paper. One column below is a trap.

PolicyBatchLRMax stepsGrad accumApplies?Extra knobs
GR00T N1.7321e-4200001yessaveSteps
GR00T N1.511e-5200016yessaveSteps
Pi0.515e-53000016no (lerobot 0.5.1)seed, logFreq
SmolVLA21e-4200008noseed, logFreq
ACT81e-51000001nochunkSize, nActionSteps, seed, logFreq
Reproducibility, dated August 2026

GR00T's fine-tuning entry point (launch_finetune.py, a tyro CLI) has no seed field in its config dataclass, so runs are not bit-for-bit reproducible. The repo also warns of 5 to 6 percent variance between runs from non-deterministic image augmentations, larger than most benchmark gaps argued over online. LeRobot's default seed is 1000. The grad-accum column describes lerobot 0.5.1; upstream 0.6.2 exposes it as --accelerator.gradient_accumulation.steps.

The knob that matters more than the model choice

It is the action chunk. Longer chunks give smoother motion and fewer compounding errors, but the policy is committed while the block executes, so it reacts late to anything that moves: confident on a static cube, hopeless on a rolling one. If it overshoots, shortening the executed portion beats retraining and is free. A joint that stops short is a different problem; see the joint-stops-early page.

  • ACT: ACTConfig defaults to chunk_size 100 and n_action_steps 100. Temporal ensembling is off and requires n_action_steps 1.
  • GR00T N1.7: internal horizon went 16 to 40, yet LeRobot's SO-101 example still runs --policy.chunk_size=16 --policy.n_action_steps=16. The rollout flag was renamed to --execution-horizon.
  • Pi0.5: a 50-step chunk, of which LeRobot's LIBERO recipe executes 10 via --policy.n_action_steps=10; with --policy.pretrained_path it falls back to 50 if you omit the flag.
  • SmolVLA: 50-action chunks, both knobs exposed.

How to screen all five in one afternoon

The cheapest answer is not more reading. Spend about 15 USD and let the arm tell you: record once, train the cheap model first, escalate once it has proven the data sound. Structure beats volume, the point of SO-100 data collection and the LeRobot dataset format.

  1. 1
    Record 50 episodes once

    Fifty clears the floor for GR00T, Pi0.5 and ACT, and SmolVLA's 30. Repeat each variation rather than spreading thin: 50 episodes across 5 cube positions trained where 25 did not. See record your first dataset.

    bash
    lerobot-record \
      --robot.type=so100_follower \
      --robot.port=/dev/ttyACM1 \
      --robot.id=my_follower_arm \
      --teleop.type=so100_leader \
      --teleop.port=/dev/ttyACM0 \
      --teleop.id=my_leader_arm \
      --dataset.repo_id=${HF_USER}/pick-place-50 \
      --dataset.num_episodes=50 \
      --dataset.single_task="Put the lego brick into the box"
  2. 2
    Train ACT first, because it cannot lie to you

    No pretrained weights, so if it does the task at all, your dataset contains the task. If ACT flatlines, fix the data. 1 to 3 USD, 2 to 5 hours on a 24 GB card.

    bash
    lerobot-train \
      --dataset.repo_id=${HF_USER}/pick-place-50 \
      --policy.type=act \
      --policy.device=cuda \
      --batch_size=8 \
      --steps=100000 \
      --seed=1000 \
      --output_dir=outputs/train/act_pickplace \
      --job_name=act_pickplace
  3. 3
    Run SmolVLA on the same dataset, unchanged

    Same data, same arm, 450 M parameters instead of 80 M, plus language conditioning. LeRobot puts a 20K step run at roughly 4 hours on one A100. This is what tells you whether pretraining buys anything.

    bash
    lerobot-train \
      --policy.path=lerobot/smolvla_base \
      --dataset.repo_id=${HF_USER}/pick-place-50 \
      --batch_size=64 \
      --steps=20000 \
      --policy.device=cuda \
      --output_dir=outputs/train/smolvla_pickplace \
      --job_name=smolvla_pickplace
  4. 4
    Convert down to v2.1 before you touch GR00T

    GR00T reads a flavour of the LeRobot v2 format plus an extra meta/modality.json mapping how concatenated state and action arrays split into named fields. A v3.0 dataset crashes that loader, because v3.0 packs many episodes into shared files where v2 wrote one per episode. Isaac-GR00T ships the downgrade helper as scripts/lerobot_conversion/convert_v3_to_v2.py; the v3 rejection page is the fast path.

    text
    # GR00T expects this layout, not the v3.0 file-based one
    my_dataset/
      meta/
        info.json
        episodes.jsonl      # episode index and lengths
        tasks.jsonl         # language task descriptions
        modality.json       # GR00T-specific: state/action/video key mapping
      data/chunk-000/       # parquet, state and action per timestep
      videos/chunk-000/     # one mp4 per episode
  5. 5
    Escalate to GR00T N1.7 only if the first two left something on the table

    Through NVIDIA's CLI, shown here, or LeRobot's groot policy type. NVIDIA recommends 40 GB or more of VRAM for fine-tuning, 16 GB for inference. On an OOM, see the OOM page.

    bash
    CUDA_VISIBLE_DEVICES=0 uv run python \
      gr00t/experiment/launch_finetune.py \
      --base-model-path nvidia/GR00T-N1.7-3B \
      --dataset-path demo_data/cube_to_bowl_5 \
      --embodiment-tag NEW_EMBODIMENT \
      --modality-config-path examples/SO100/so100_config.py \
      --num-gpus 1 \
      --output-dir /tmp/test_finetune \
      --max-steps 2000 \
      --global-batch-size 32 \
      --dataloader-num-workers 4

Two ways to run that screening pass

Three environments, because the toolchains do not coexist. LeRobot on main is 0.6.2 and needs Python 3.12 or newer; Isaac-GR00T and openpi are separate uv-managed repos.

bash
# 1. LeRobot: ACT, SmolVLA, Pi0.5 and GR00T N1.7 via --policy.type=groot
pip install "lerobot[smolvla]"
pip install "lerobot[pi]"
pip install "lerobot[groot]"

# 2. GR00T reference implementation and benchmark examples
git clone https://github.com/NVIDIA/Isaac-GR00T

# 3. Physical Intelligence reference implementation
git clone --recurse-submodules https://github.com/Physical-Intelligence/openpi
  • GR00T pins torchcodec 0.8.0 as its only video backend, needing FFmpeg 4 to 7. FFmpeg 8 is unsupported, AV1 not guaranteed.
  • openpi memory floors: inference above 8 GB, LoRA above 22.5 GB, full fine-tuning above 70 GB. That last one is why Pi0.5 is an A100 job.
  • Rent the GPU yourself, destroy it afterwards, reconcile three sets of checkpoint paths by hand.

Foundation model or from scratch

The real fork is not which 3 B model to pick. It is whether to use a pretrained VLA at all, given that ACT learned six real bimanual tasks from about ten minutes of demonstrations each, with 80 M parameters and nothing pretrained.

Fine-tuning a pretrained VLA instead of training ACT from scratch
What you gain
  • Language conditioning. ACT has none; one ACT checkpoint does one task.
  • Better on objects absent from your demonstrations: on SO-101, 50% against ACT's 40% out of distribution.
  • Multi-task at all: SmolVLA reaches 78.3% across three SO-100 tasks with one checkpoint; ACT was only run single-task.
What it costs you
  • 7.6x to 24x the latency: 152 to 485 ms per action step against ACT's 20 ms.
  • 4 to 12 USD per run instead of 1 to 3, and an A100 tier instead of any 24 GB card.
  • Licence exposure, plus a gated-repo failure mode that does not exist from scratch.
  • Pretrained weights can mask a bad dataset. A fine-tune that half-works on broken data costs a week before you look at the data.

The reproducing-an-old-run case

Chasing a 2025 checkpoint makes the model choice for you and turns the problem into version pinning: current LeRobot rejects N1.5, so you pin lerobot==0.5.1. With no seed field and 5 to 6 percent variance between runs, the reproduction is approximate by construction. The N1.5 on SO-100 guide and the N1.5 policy page have the platform side.

The AY-Robots head to head comparison page for GR00T N1.7 against Pi0.5, showing parameter counts, GPU requirements, inference latency, dataset format and minimum episode counts side by side
Head to head on /compare/groot-n1-7-vs-pi0-5. The two 3 B models look interchangeable on a spec sheet and are not: one wants LeRobot v2.1, one wants v3.0.

Down to two? ACT against GR00T N1.7 and GR00T N1.7 against SmolVLA. Raw rows sit in the arena entries: GR00T N1.7, Pi0.5, SmolVLA and ACT.

Where this platform does not help you

  • It cannot make remote inference fast. The 20 to 485 ms loop belongs to the model; internet round trips add to it.
  • It cannot fine-tune GR00T or Pi0.5 on your own hardware. Both are cloud-only here; only SmolVLA and ACT run locally.
  • It cannot fix a dataset. Loss falls but the policy does nothing is a data problem, a policy that only works in one setup is a coverage problem.
  • It cannot make GR00T runs reproducible: the upstream config has no seed field.

85 models, 332 benchmark results, every number linked to its source

The sortable version of the tables on this page: 85 vision-language-action models, 332 benchmark results, each linked back to its paper or model card.

Open the arena

Picking one and moving on

One default: record 50 episodes, train ACT for 1 to 3 USD to prove the dataset, then SmolVLA on the same data. Under 6 USD together, and they answer the question that matters: whether pretraining helps here, or whether the bottleneck is the data. Escalate to GR00T N1.7 for contact-rich multi-step tasks, to Pi0.5 when the scene changes.

Platform walkthrough: train your first policy, then run your first policy. The training docs and dataset docs cover form and format; the SO-100 page and the complete SO-100 guide cover build and calibration. Background: the VLA overview and the Pi0 flow-matching article. The one that will move your success rate is the data quality guide.

Which VLA policy should I train first on an SO-100?

ACT, then SmolVLA. ACT trains from scratch, so it cannot mask a bad dataset, and a run costs 1 to 3 USD on a 24 GB card. If ACT does the task at all, the 4 to 12 USD for a GR00T N1.7 or Pi0.5 run is not wasted.

Is GR00T N1.7 actually better than Pi0.5?

On LIBERO they are within noise: 97.0% across four suites for GR00T N1.7, 96.85% for Pi0.5 at 30k steps in openpi, 97.5% for the LeRobot port, all from different harnesses. The real differences are 152 ms per action step against 485 ms, v2.1 datasets against v3.0, and benchmark accuracy against open-world generalization.

Can I fine-tune any of these on a single RTX 4090?

SmolVLA and ACT, yes; both are listed for an RTX 4090 or any 24 GB card and run locally. GR00T N1.7, N1.5 and Pi0.5 need an A100 or H100 80 GB and are cloud-only here. NVIDIA recommends 40 GB or more for GR00T fine-tuning; openpi's floor is above 70 GB for a full Pi0.5 fine-tune, 22.5 GB for LoRA.

Which of these five can I use commercially?

GR00T N1.7 weights are under the NVIDIA Open Model License Agreement, which the card says covers commercial use. N1.5 weights are non-commercial. SmolVLA's code is Apache 2.0 in LeRobot, but the lerobot/smolvla_base card carries no license field, so the weights are unstated. ACT has no base weights to license. Pi0.5 is ambiguous: LeRobot's docs say Apache 2.0, its card metadata reads license: gemma.

Sources

Sources

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started