The AY-Robots policy comparison table with parameter counts, GPU tiers and inference latency for GR00T N1.7, GR00T N1.5, Pi0.5, SmolVLA and ACT
SmolVLATinyVLASmall VLAConsumer GPULeRobot

Small VLA Models: TinyVLA, SmolVLA and the Sub-1B Case

AY-Robots ResearchAugust 23, 202619 min read

TinyVLA and SmolVLA put a working VLA under 1 B parameters. Real numbers from both papers, the lerobot defaults, measured latency, and what a run costs on a 24 GB card.

Almost every vision-language-action model that gets written about assumes a datacentre card. OpenVLA is 7 B parameters. GR00T N1.7 and Pi0.5 are around 3 B and want an A100 80 GB to fine-tune. If the card on your desk is a 4090, that class of model is out of reach.

Two papers argue you do not need it. TinyVLA (arXiv 2409.12514, accepted by IEEE Robotics and Automation Letters in February 2025) builds a VLA from a 400 M to 1.3 B backbone plus a diffusion action head. SmolVLA (arXiv 2506.01844, submitted 2 June 2025) ships 450 M parameters with open weights, open data and a script that runs on one consumer card. Here is what both measured, and where the sub-1 B argument stops holding.

What you need to know

  • TinyVLA ships three sizes: 422 M total with 101 M trainable, 740 M with 138 M, 1.3 B with 143 M. Only the first two sit under 1 B.
  • Its Table IV measures 14 ms per action prediction for TinyVLA-1B on one A6000, against 292 ms for OpenVLA-7B and 140 ms for a shrunk OpenVLA-1B.
  • The head holds that speed, not the backbone: swap TinyVLA-H's diffusion head for an ACT head and the five real-robot tasks fall from a 94.0 average into single digits. An MLP head scores 0 everywhere.
  • SmolVLA is 450 M, roughly 100 M of it the action expert, pretrained on 481 community LeRobot datasets and 10.6 M frames. It reports 87.3 on LIBERO against 86.0 for a robotics-pretrained Pi0 at 3.3 B, and 78.3 on three real SO-100 tasks against 61.7 for Pi0 at 3.5 B.
  • Trained single-task without that pretraining, SmolVLA drops to 40.0 on those tasks, below ACT's 48.3. Small is not automatically easy.
  • TinyVLA has no LeRobot integration and pins a CUDA 11.7 wheel stack. SmolVLA is in lerobot and costs roughly 1 to 3 USD per run on the 24 GB tier here.

What actually counts as a small VLA

The parameter count on a model card is not one number. It can mean total weights, weights loaded at inference, or weights that receive gradients during fine-tuning. TinyVLA reports both, and the gap is large: TinyVLA-H is 1.3 B total but 143 M trainable, because the vision tower and most of the language model stay frozen while LoRA adapters and the action head move. The paper puts the trainable share at about 5 percent.

ModelParamsBackboneAction headSource
TinyVLA-S422 M total, 101 M trainableLlava-Pythia ~400 MDiffusion (droid_diffusion U-Net)arXiv 2409.12514
TinyVLA-B740 M total, 138 M trainableLlava-Pythia ~700 MDiffusionarXiv 2409.12514
TinyVLA-H1.3 B total, 143 M trainableLlava-Pythia ~1.3 BDiffusionarXiv 2409.12514
SmolVLA450 M, ~100 M action expertSmolVLM2-500M-Video-InstructFlow matching expertarXiv 2506.01844
Octo-Small27 MViT-S scale, T5-Base text encoderDiffusionocto-small-1.5 card
ACT~80 MResNet, no language modelDirect chunk regressionAY-Robots catalog
OpenVLA7 BLlama 2 7 B, DINOv2 and SigLIP encodersAutoregressive action tokensarXiv 2406.09246

Two rows are worth arguing about. ACT at roughly 80 M is smaller than everything else here but has no language model, so it is not a VLA: it learns one task and cannot be told to do another. Octo-Small at 27 M is conditioned through a T5-Base text encoder, not an LLM backbone. Good baselines, neither gives you the instruction following the label implies.

The 1 B line is arbitrary

TinyVLA-H, the variant carrying the headline results, is 1.3 B and sits above the line. The better question is whether a model fits in 24 GB during training and hits your control rate at inference. The five policies you can train here are on the policies page; TinyVLA has an arena entry if you want its numbers beside everyone else's.

TinyVLA: the speed comes from the head, not the backbone

The obvious reading is that they made the language model smaller, so it got faster. The paper's ablation says otherwise. Swapping OpenVLA's 7 B backbone for a roughly 1 B one cut per-action prediction from 292 ms to 140 ms, a 2x gain. TinyVLA-H, at a comparable parameter count, runs at 14 ms on the same card. The other 10x is the action head.

ModelPer-action predictionMeasured on
OpenVLA-7B292 mssingle A6000
OpenVLA-1B, backbone swapped for TinyVLA's140 mssingle A6000
TinyVLA-1B (TinyVLA-H)14 mssingle A6000

OpenVLA emits actions as discretised tokens through the language model head, one per action dimension, autoregressively. TinyVLA attaches a diffusion decoder that produces the whole chunk in one shot. Table V holds the architecture at TinyVLA-H and swaps only the head, on the same five real-robot tasks. It is the cleanest evidence in either paper for the argument flow matching policies make, and the reason Pi0 moved away from token decoding.

Head on TinyVLA-HPlaceTennisFlipMugStackCubesCloseDrawerOpenBox
Diffusion (droid_diffusion)90.098.398.396.786.7
Action Chunking Transformer13.38.38.313.323.3
Multi-layer perceptron00000
What the TinyVLA numbers cover

The 292 / 140 / 14 ms figures are Table IV, all on one A6000. They are per action prediction and exclude camera capture, preprocessing and the serial write to the servos. Treat published latency as a lower bound, never as the control rate. Our own numbers carry the same limit: see inference latency.

What TinyVLA scored

BenchmarkProtocolTinyVLA-HBaselines
MetaWorld, 50 tasks, simMulti-task, 50 demos, 3 seeds77.6 / 21.5 / 11.4 / 15.8 by difficulty, average 31.6Diffusion Policy average 10.5
Real Franka Panda, 5 tasks100 trajectories per task, 20 trials94.0 averageOpenVLA 68.3, Diffusion Policy 35.3
Bimanual UR5, 3 tasksMulti-task, 10 trials per task76.7 / 36.7 / 30.0OpenVLA 0 / 0 / 0, Diffusion Policy 40.3 / 31.3 / 43.0

The bimanual row has a boring explanation the paper gives itself: OpenVLA is pretrained on Open X-Embodiment, which consists entirely of single-arm data, so a two-arm action space is out of distribution and it scores zero. The diffusion policy baseline beats TinyVLA-H on two of those three tasks. Background in the Open X-Embodiment write-up.

The AY-Robots arena leaderboard, a sortable table of 85 VLA models with 332 benchmark results, each value linked back to the paper or model card it came from
Cross-model benchmark numbers are only comparable when you can see where each one came from.

The TinyVLA repo, as of August 2026

The paper is good. The code is a research drop. The repository is github.com/liyaxuanliyaxuan/TinyVLA; its README dates the code release to 17 February 2025 and the last commit is 11 March 2025. Fine for reproducing a paper, a problem if you wanted a maintained library.

bash
git clone https://github.com/liyaxuanliyaxuan/TinyVLA
conda create -n tinyvla python=3.10 -y
conda activate tinyvla
pip install --upgrade pip
pip install -r requirements.txt
cd policy_heads && pip install -e .
cd ../llava-pythia && pip install -e .
The install sequence from the TinyVLA README, checked against the repository on 2026-08-23.
The dependency pins are the trap that eats a day

requirements.txt pins torch==2.0.1, transformers==4.37.1, deepspeed==0.9.5, peft==0.4.0, diffusers==0.11.1, numpy==1.24.4, and the CUDA stack to the 11.x wheels: nvidia-cuda-runtime-cu11==11.7.99, nvidia-cudnn-cu11==8.5.0.96, triton==2.0.0. The README asks for Python 3.10; lerobot 0.6.1 requires 3.12 or newer, so the two cannot share an environment. Confirm a torch 2.0.1 build exists for your GPU generation first. If a run dies on VRAM instead, the out-of-memory checklist is faster than guessing.

TinyVLA also does not read LeRobot datasets. Its format is ACT-style HDF5: action, language_raw, and an observations group with multi-view images, joint_positions, qpos and qvel. The repo ships data_utils/rlds_to_h5py.py for RLDS input, and each task is registered by hand in aloha_scripts/constants.py with its dataset_dir, episode_len and camera_names. If your episodes came from lerobot or the desktop client, you own the conversion.

bash
# scripts/train.sh, the real flags from the repository
ACTION_HEAD=droid_diffusion

deepspeed --master_port 29600 --num_gpus=8 --num_nodes=1 ./train_tinyvla.py \
  --deepspeed scripts/zero2.json \
  --lora_enable True \
  --lora_module 'vit llm' \
  --lora_r 64 \
  --lora_alpha 256 \
  --non_lora_lr 2e-5 \
  --task_name "example_task_config" \
  --model_name_or_path /path/to/pretrained_vlm \
  --freeze_vision_tower True \
  --freeze_backbone True \
  --bf16 True \
  --max_steps 10000 \
  --per_device_train_batch_size 32 \
  --gradient_accumulation_steps 1 \
  --learning_rate 2e-4 \
  --lr_scheduler_type "cosine" \
  --warmup_ratio 0.005 \
  --save_steps 1000 \
  --action_head_type $ACTION_HEAD \
  --use_state True \
  --window_size 6
Abridged from scripts/train.sh. Every flag and value above is in the shipped file.
  • --num_gpus=8 assumes an eight-card node. Set it to 1 and drop the batch size well below 32. No single-GPU variant ships upstream, so the command cannot be run verbatim on a 4090.
  • --deepspeed scripts/zero2.json points at a file that is not in the top-level scripts directory. The DeepSpeed configs ship at llava-pythia/scripts/zero2.json. Fix the path before your first run.
  • The README requires the output directory name to contain llava_pythia, plus lora if LoRA is enabled.
  • The backbone is a separate download: lesjie/Llava-Pythia-400M, -700M or -1.3B. There is no single base checkpoint you point a policy at the way you point at lerobot/smolvla_base.

SmolVLA: the sub-1 B model you can run this afternoon

SmolVLA makes the same argument inside a maintained library. It is 450 M parameters on a SmolVLM2-500M-Video-Instruct backbone, and the efficiency comes from settings you can read out of configuration_smolvla.py rather than from a claim about being small.

Setting in configuration_smolvla.pyDefaultWhat it buys
num_vlm_layers16Only the first 16 language model layers run
expert_width_multiplier0.75Action expert hidden size is 75 percent of the VLM's
self_attn_every_n_layers2Self-attention interleaved with cross-attention
chunk_size / n_action_steps50 / 50One pass emits 50 actions and all 50 are executed
num_steps10Flow matching denoising fixed at 10 steps
tokenizer_max_length48The instruction is truncated to 48 tokens
freeze_vision_encoder / train_expert_onlyTrue / TrueFine-tuning moves the expert, not the vision tower
optimizer_lr, warmup, decay1e-4, 1000 steps, to 2.5e-6 over 30000Not the paper recipe: its pretraining used a 100-step warmup over 200000 steps

Pretraining used 481 community LeRobot datasets, 22.9 K episodes and 10.6 M frames on 4 GPUs, 200000 steps at a global batch of 256; the paper puts the whole project at about 30 K GPU hours. One number to watch: the Hugging Face launch blog says 487 curated datasets where the paper's table says 481. We use the paper's figure and flag the disagreement.

The SmolVLA model page on AY-Robots showing parameter count, the 24 GB GPU tier, inference latency per action step and the minimum episode count
The platform's SmolVLA page: 450 M parameters, 245 ms per action step, RTX 4090 tier, 30 episodes minimum.
BenchmarkSmolVLA 0.45 BSmolVLA 2.25 BPi0ACT
LIBERO average, multi-task87.388.7586.0 (3.3 B, robotics-pretrained)-
Meta-World average, multi-task57.368.2447.9 (3.5 B, robotics-pretrained)-
Real SO-100, 3 tasks, multi-task training78.3-61.7 (3.5 B)-
Real SO-100, 3 tasks, single-task, no robotics pretraining40.0--48.3
SO-101 lego pick-place, single-task, in distribution90--70
SO-101 lego pick-place, single-task, out of distribution50--40
Read the whole table, not the headline row

LIBERO is simulation and everything competent scores in the eighties there now. The real SO-100 row, where a 450 M model beats a 3.5 B one by 16.6 points, is the interesting one; the row under it is the counterweight. Strip the community pretraining and the multi-task training and the same model drops to 40.0, under ACT. The defensible claim is that a small model is not automatically worse, not that it is better.

One accident helps: the SmolVLA paper's Meta-World table carries TinyVLA's own published numbers as a baseline, so for once both models sit in one table, SmolVLA-0.45B at 57.3 against TinyVLA-H at 31.6. It also reports SmolVLA training around 40 percent faster than Pi0 on 6x less memory. All of it comes from the SmolVLA authors; the arena entry links each value to its source.

Where SmolVLA spends its time

AY-Robots lists SmolVLA at 245 ms per action step and ACT at 20 ms in the policy catalog. TinyVLA reports 14 ms per action prediction. Those numbers are not comparable, and treating them as if they were is the most common mistake in this topic: some time one forward pass, some divide that pass across a chunk once action chunking amortises it.

  • SmolVLA emits 50 actions per forward pass and executes all 50. At the 30 fps the paper uses on real robots, one inference covers about 1.7 seconds of motion.
  • Asynchronous inference computes the next chunk while the current one still executes: 9.7 s average task completion against 13.75 s synchronous, roughly 30 percent faster, and 19 pick-and-place cycles in a fixed 60-second window against 9.
  • Success rates were comparable rather than better, 78.3 synchronous against 73.3 asynchronous. Async buys throughput, not accuracy.
  • Chunking hides compute latency, not network latency, and it makes the policy less reactive because it is committed to 50 actions.
Remote inference is not free, and no platform fixes physics

AY-Robots can auto-provision a cloud GPU pod that serves your policy while the local robot client talks to that endpoint, and the pod carries an idle watchdog so it destroys itself rather than billing silently. What it does not do is remove the public-internet round trip. The control loop across the five policies here is 20 to 485 ms per action step before any network at all, so remote inference is viable for slow pick-and-place, not for fast reactive motion.

The AY-Robots policies comparison table showing GR00T N1.7, GR00T N1.5, Pi0.5, SmolVLA and ACT with parameter counts, required GPU tier, inference latency per action step and the minimum number of episodes each needs
SmolVLA at ~450 M and ACT at ~80 M are the two that fit a 24 GB card. The other three need an A100 or H100 80 GB.

Fine-tuning SmolVLA on one consumer card

The manual path, on lerobot 0.6.1, the current PyPI release as of 23 August 2026. Everything below comes from the Hugging Face lerobot SmolVLA documentation, fetched the same day; the guided version is gentler.

  1. 1
    Install lerobot with the smolvla extra

    The SmolVLA dependencies are an optional extra, not part of the base install. Installing without it and then wondering why the policy type is unknown is a common half hour lost.

    bash
    git clone https://github.com/huggingface/lerobot.git
    cd lerobot
    pip install -e ".[smolvla]"
  2. 2
    Get a dataset with enough episodes

    The docs recommend around 50 episodes and state that the same task with 25 was not enough. AY-Robots sets the minimum at 30. Record your own, or start from the dataset directory.

    bash
    # any LeRobotDataset on the Hub works as --dataset.repo_id
    # lerobot/svla_so100_pickplace is the paper's own 50-episode set:
    # 5 cube positions, 10 episodes each
  3. 3
    Start the fine-tune

    The command from the lerobot guide, unmodified. The docs put 20000 steps at roughly 4 hours on one A100. On a 24 GB card, expect longer and measure it.

    bash
    cd lerobot && lerobot-train \
      --policy.path=lerobot/smolvla_base \
      --dataset.repo_id=${HF_USER}/mydataset \
      --batch_size=64 \
      --steps=20000 \
      --output_dir=outputs/train/my_smolvla \
      --job_name=my_smolvla_training \
      --policy.device=cuda \
      --wandb.enable=true
  4. 4
    Drop the batch size until it fits

    batch_size=64 is a documented example, not a promise about your card. The docs advise starting small and increasing while loading times stay short.

    bash
    lerobot-train --help
  5. 5
    Roll the checkpoint out on the arm

    Same library, one command. The real-time chunking flags are commented out in the docs and are the ones to reach for on low-power hardware.

    bash
    lerobot-rollout \
      --strategy.type=base \
      --robot.type=so101_follower \
      --robot.port=/dev/ttyACM0 \
      --robot.id=my_blue_follower_arm \
      --robot.cameras="{ front: {type: opencv, index_or_path: 8, width: 640, height: 480, fps: 30}}" \
      --task="Grasp a lego block and put it in the bin." \
      --policy.path=HF_USER/FINETUNE_MODEL_NAME
The checkpoint is the deliverable

Whatever path you take, you end up with a checkpoint plus the config that produced it. Keep the dataset revision, the step count and the seed beside it. lerobot defaults to seed 1000; GR00T's fine-tuning entry point exposes no seed at all, so those runs are not bit-for-bit reproducible. Mechanics in the training docs.

Two ways to get a small VLA onto an arm

You own the machine and the failure modes. For SmolVLA that is reasonable: one pip extra, one train command, one rollout command. For TinyVLA it is a research reproduction with frozen pins, a broken DeepSpeed path and a data conversion you write yourself.

  1. Get a 24 GB card, record 30 to 50 episodes, verify the camera streams frame by frame.
  2. pip install -e ".[smolvla]", lerobot-train against lerobot/smolvla_base, then serve the checkpoint on the machine the arm is plugged into.
  3. For TinyVLA: separate conda env, convert data to HDF5, register the task in constants.py, fix the zero2.json path, cut train.sh from eight GPUs to one.
Advantages
  • No per-hour billing once the card is paid for.
  • Inference sits next to the servos, the only way to get a fast control loop.
  • You can patch the policy code, and TinyVLA is only available this way.
Trade-offs
  • A 4090 rules out every ~3 B policy, so no local comparison against GR00T N1.7 or Pi0.5.
  • Environment setup is the real work. TinyVLA's pins alone can cost a day.
  • No queue, no retry, no checkpoint storage. A reboot at step 14000 means starting again.

When a small model is the wrong choice

Both papers are more careful here than the summaries are. TinyVLA's failure analysis is specific: the 0.4 B variant failed three times by misreading the instruction, which the authors attribute to limited language comprehension in the smaller VLM, and that mode disappeared at 1.3 B. SmolVLA shows the same curve from the other end: the 2.25 B version of the identical architecture scores 88.75 on LIBERO and 68.24 on Meta-World against 87.3 and 57.3 for the 0.45 B model.

Choosing a sub-1 B VLA
Where it wins
  • Fits a 24 GB card, which drops an experiment from tens of dollars to a couple.
  • Fast enough to run next to the arm, so no network hop in the control loop.
  • Fine-tunes on the data one person can record, tens of episodes rather than thousands.
  • SmolVLA's weights, data list and code are public, so a bad result is debuggable.
Where it loses
  • Weaker instruction following: fewer language parameters, less ability to separate similar referring expressions.
  • Less spatial and visual generalisation to setups you did not record.
  • More sensitive to dataset defects, with less pretraining prior to fall back on.
  • Multi-task and long-horizon work still favours larger models, including SmolVLA's own 2.25 B variant.

The comparison worth running is not TinyVLA against SmolVLA. It is SmolVLA against ACT on your own task, and the SmolVLA paper is the argument for why. Trained single-task with no robotics pretraining, SmolVLA averaged 40.0 across three SO-100 tasks where single-task ACT managed 48.3. What lifts it to 78.3 is community pretraining plus multi-task training, not the architecture alone. On the SO-101 lego task, both single-task, SmolVLA does win: 90 against 70 in distribution. Then SmolVLA against Pi0.5 if the budget allows.

At this size, the dataset decides the outcome

There is less pretraining prior to cover for bad data, so a clean loss curve on a defective dataset gives you a policy that reproduces the defect confidently. The lerobot docs are blunt about structure: 50 episodes across 5 cube positions, 10 per position, worked; 25 did not. If loss looks fine and the arm does nothing useful, start at loss falls, policy does nothing, policy only works in one setup or collecting VLA training data that is actually usable.

Five policies, one comparison table

GR00T N1.7, GR00T N1.5, Pi0.5, SmolVLA and ACT with real parameter counts, inference latency per action step, the GPU tier each needs and the minimum episode count before it does anything useful.

Compare the policies

A decision table you can act on

Your situationStart withWhy
One task, good demonstrations, no languageACT~80 M, 20 ms, 24 GB card, no base model to download
A few related tasks, one instruction eachSmolVLA450 M, in lerobot, 30 episode minimum, 1 to 3 USD per run
Reproducing the TinyVLA result specificallyTinyVLA-B or TinyVLA-HThe repo is the only route: isolated env, converted data
Multi-task, varied instructions, A100 budgetGR00T N1.7 or Pi0.5~3 B, 152 ms and 485 ms per step, 4 to 12 USD per run
No robot yetDrive a real armThe queue-based live arm needs no signup and no hardware

For the last row, the live arm streams a physical SO-100 you can drive from the browser without an account, and the three ways to start covers the rest. The SO-100 is the reference arm here, roughly 110 to 150 EUR in parts, with a full setup guide.

What comes after the sub-1 B models

Shrinking the parameter count is one way to make a VLA cheap and not obviously the winning one. OpenVLA-OFT (arXiv 2502.19645) keeps the 7 B backbone and changes only how actions are decoded, reporting a 26x increase in action generation throughput and LIBERO rising from 76.5 to 97.1 percent. BitVLA (arXiv 2506.07530) makes every weight of a 1-bit BitNet b1.58 2B4T backbone ternary, reporting 11.0x less memory and 4.4x lower end-to-end latency while matching full-precision OpenVLA-OFT. X-VLA-0.9B (arXiv 2510.10274) sits on the 1 B line with flow matching.

The common thread: the action decoder, not the language model, is where the latency lives. Ask how a policy emits actions before you ask how many parameters it has. The arena has 85 models and 332 results, each linked to its source; there is a broader overview in our VLA introduction.

Can I fine-tune SmolVLA on an RTX 4090?

Yes. SmolVLA is 450 M parameters and AY-Robots runs it on the RTX 4090 / 24 GB tier. The lerobot example uses --batch_size=64, which is an example rather than a guarantee for your card; the docs advise starting small and increasing while loading times stay short. Expect longer than the roughly 4 hours the docs quote for 20000 steps on an A100.

Is TinyVLA available in lerobot or on AY-Robots?

No to both. TinyVLA lives only in its research repository, last commit 11 March 2025, and its format is ACT-style HDF5 rather than LeRobot. AY-Robots trains GR00T N1.7, GR00T N1.5, Pi0.5, SmolVLA and ACT. If you want TinyVLA you build it yourself, and you will have to fix the DeepSpeed config path in scripts/train.sh first.

Is a 450 M model really competitive with a 3 B one?

On the authors' own benchmarks, yes: 87.3 against 86.0 on LIBERO versus a robotics-pretrained Pi0 at 3.3 B, and 78.3 against 61.7 on three real SO-100 tasks where the same paper labels Pi0 at 3.5 B. The limit is in the same paper: single-task without robotics pretraining, SmolVLA falls to 40.0, below ACT's 48.3.

How many episodes do I need before a small VLA does anything?

AY-Robots sets the SmolVLA minimum at 30 episodes and the ACT minimum at 50. The lerobot docs recommend around 50 and report that 25 was not enough for the same task. Structure matters as much as count: the paper's set used 5 cube positions with 10 episodes each.

Why do published latency numbers disagree so much?

They measure different things. TinyVLA reports 14 ms per action prediction on an A6000; AY-Robots lists SmolVLA at 245 ms and ACT at 20 ms per action step. Some figures cover one forward pass, some divide a pass across a 50-action chunk, and almost none include camera capture or the write to the servos.

Does cloud inference solve the GPU problem?

Partly. AY-Robots auto-provisions a pod that serves the policy while the local client talks to that endpoint, with an idle watchdog so it destroys itself rather than billing silently. It cannot remove the public-internet round trip, and the control loop is already 20 to 485 ms per action step. Fine for slow pick-and-place, not for fast reactive motion.

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started