The AY-Robots policies page comparing GR00T N1.7, GR00T N1.5, Pi0.5, SmolVLA and ACT with parameters, GPU tier, inference latency and minimum episodes
DatasetsImitation LearningVLA TrainingSO-100Data Collection

How Many Demonstrations Does a Robot Policy Need?

AY-Robots ResearchAugust 23, 202619 min read

How many episodes a robot policy really needs: the trainer floors, what RT-1, BC-Z, robomimic and the data scaling laws measured, and two cheap runs that tell you if more will help.

There is no single number, and any article opening with one is quoting a trainer's floor rather than what your task needs. What can be given honestly is that floor, the studies that measured the trade, a conversion from published hours into episodes on a small arm, and two cheap experiments that answer it for the recordings you already have.

Task difficulty and scene variation decide the answer, and both swamp the raw count: the same 50 demonstrations are plenty for one task and useless for another on the same arm. Below is what the trainers accept, what the literature measured, and how to tell which side of that line your LeRobot dataset sits on.

The short version

  • The trainer floor here is 30 episodes for SmolVLA and 50 for ACT, GR00T N1.5, GR00T N1.7 and Pi0.5. That is what the job accepts, not what your task needs.
  • NVIDIA's Isaac-GR00T FAQ asks roughly 100 trajectories for a simple fixed-location pick and place, 500+ for multi-step scenes, 2,000+ for high-DoF humanoid tasks.
  • RT-1 measured the trade: removing 25 percent of the tasks while keeping 97 percent of the data cost about as much generalization as deleting 49 percent of it.
  • BC-Z is the sharpest data point: 37 demonstrations solved a deterministic simulated scene at 97.2 percent; 1,000 of the same task in a varied real setup reached 5 percent.
  • The data scaling laws study (ICLR 2025) recommends 50 demonstrations per environment-object pair; performance saturated at 400, 800 and 1,600 total for 8, 16 and 32 pairs.
  • On an SO-100, 50 episodes of a 13-second pick and place is 11 minutes of robot motion; ALOHA reported 30 to 60 minutes of wall clock for 50 demonstrations.
  • Before recording more: train on half your episodes. If half is as good as all of it, more of the same will not help.

The floor: what the trainers will actually accept

Every policy on this platform has a minimum episode count enforced before the form rents a GPU. These are gates, not recommendations. A vision-language-action model trained on a handful of trajectories produces a checkpoint that loads, moves the arm and does nothing useful, which is expensive to diagnose afterwards.

PolicyMinimum episodesDataset formatGPU tierInference per action step
GR00T N1.750LeRobot v2.0 or v2.1A100 80 GB or H100 80 GB152 ms
GR00T N1.550LeRobot v2.0 or v2.1A100 80 GB or H100 80 GB165 ms
Pi0.550LeRobot v3.0A100 80 GB or H100 80 GB485 ms
SmolVLA30LeRobot v3.0RTX 4090 or any 24 GB card245 ms
ACT50LeRobot v3.0RTX 4090 or any 24 GB card20 ms
A minimum is a gate, not a target

Thirty episodes will get SmolVLA to produce a checkpoint, and it will move the arm. Whether it does your task on a bench that looks slightly different from the one you recorded on is a separate question. Read these as the point below which renting a GPU is not worth it.

What the published record actually measured

Five studies bracket the question. They disagree about the number and agree about the mechanism: what you vary between episodes matters more than how many you record.

RT-1: capping episodes per task cost less than dropping tasks

The RT-1 dataset is about 130,000 episodes over more than 700 tasks, gathered across 17 months with 13 robots. Section 6.5 and Table 7 of the RT-1 paper separate the two axes: to shrink data without touching diversity they capped examples per task; to narrow diversity without touching volume they removed the tasks with the least data.

VariantCap per taskTasks keptData keptSeen tasksGeneralization (all)
Full RT-1none100%100%97%73%
Smaller data200 examples100%51%71%50%
Smaller data100 examples100%37%55%46%
Smaller data50 examples100%22.5%59%29%
Narrower datanone75%97%86%54%

Read the last row against the second. Dropping a quarter of the tasks while keeping 97 percent of the frames landed at 54 percent generalization; halving the data while keeping every task landed at 50 percent. The paper's own summary: diversity matters more than quantity. Choosing between 200 episodes of one grasp and 50 each of four related grasps, this points at the second.

BC-Z: 37 demonstrations, or 1,000, for the same task

The BC-Z paper collected 25,877 robot demonstrations totalling 125 hours across 100 manipulation tasks, with 12 robots and 7 operators, plus 18,726 human videos. Its appendix holds the most useful single data point in the imitation learning literature for anyone with one arm on a desk.

The same task, two orders of magnitude apart

In a simulated "place the bottle in the ceramic bowl", initialised deterministically with no randomisation of object positions, 37 expert demonstrations reached 97.2 percent success. Randomise the positions in the same simulator and a single-task baseline on 40 demonstrations reached 56 percent. The real version, spread over several robots, operators, backgrounds and object instances and trained on its 1,000 demonstrations, reached 5 percent. Nothing changed but the variation the policy had to absorb.

That is why the question is unanswerable in the abstract: a fixed camera, one object, one pose and controlled light is a different problem from a bench somebody walks past. More on this in our BC-Z article on what scale really means.

robomimic: the task decides, not the count

The robomimic study trained the same BC-RNN agent on 20, 50 and 100 percent subsets of human data. The proficient-human sets hold 200 demonstrations for Lift, Can and Square, and 300 for the bimanual Transport task. These are the image-based numbers from its Table 27.

Task20% of demos50% of demos100% of demos
Lift (simple grasp)100.0%100.0%100.0%
Can (pick and place)83.3%97.3%98.0%
Square (peg insertion)29.3%64.7%82.0%
Transport (bimanual handover)30.7%60.1%72.0%

Forty demonstrations solved Lift completely and the other 160 bought nothing. The same forty on Square scored 29.3 percent, and the full 200 still left 18 percent failing. One robot, one algorithm, a fivefold difference in what enough means. Ask which row your task resembles before you ask for a number.

Data scaling laws: 50 per environment-object pair

The ICLR 2025 study Data Scaling Laws in Imitation Learning for Robotic Manipulation collected over 40,000 demonstrations and ran more than 15,000 real-world rollouts on exactly this question. Its findings are the most directly actionable of the five.

  • Generalization scales approximately as a power law with the number of training environments, objects, or environment-object pairs.
  • It does not follow a clean power law in the number of demonstrations: correlation coefficients for their two main tasks were -0.62 and -0.79, which the paper calls only a weak relationship.
  • Demonstrations saturate. With 8, 16 and 32 environment-object pairs, performance plateaued at 400, 800 and 1,600 total demonstrations.
  • The recommendation: 50 demonstrations per environment-object pair, and spend the rest of the budget on more pairs.
  • Verification run: 32 pairs at 50 demonstrations each gave 85.0, 92.5, 87.5 and 90.0 percent success on four tasks, in 8 unseen environments with 2 unseen objects each.

The paper is explicit that harder dexterous tasks may need more per pair. It is still the closest thing to a defensible default, and it lands just above the floor enforced here.

Pi0.5: more places, the same amount of data

Physical Intelligence ran the cleanest version of this experiment in the Pi0.5 paper: mobile manipulation data from 3, 12, 22, 53, 82 and 104 locations, with the training steps (40k) chosen so each model saw the same number of unique samples, controlling for dataset size while only the location count varies. Performance on unseen mock homes rose steadily, and the 104-location model matched a control trained directly on data from the test homes.

The one sentence to take away

At a fixed data budget, spreading episodes over more scenes, objects and start positions beats stacking them in one place. On a single SO-100 bench that means moving the camera, changing the surface, using three cubes instead of one, and starting from ten poses instead of two.

What the model builders themselves shipped

SourceEpisodes or hoursWhat that bought
ACT / ALOHA (2023)50 per task, 100 for Thread Velcro, 8 to 14 s each20 to 96 percent final success, 6 real bimanual tasks
SmolVLA real-world SO-100 (2025)50 per dataset: 10 trajectories at each of 5 start positionsPick-place, stacking and sorting, trained multi-task
Isaac-GR00T FAQ~100 simple fixed-location, ~500+ multi-step, ~2,000+ high-DoF humanoid, ~100-500 fine manipulationNVIDIA's post-training guidance, new embodiment
NVIDIA GR00T end-to-end workflowat least 200 episodes, apple-to-plate on a Unitree G1A per-task figure for a bimanual humanoid
Pi0 post-training (2024)5 hours simplest tasks, 100+ hardestSpecialisation on 10,000+ hours of pre-training
DROID (2024)76k trajectories, 350 hours, 564 scenes, 84 tasksA pre-training corpus, not a single-task set

The two NVIDIA figures get quoted against each other and are not really in conflict: the FAQ's roughly 100 trajectories is a simple fixed-location pick and place, while the 200-episode figure is apple-to-plate on a Unitree G1 humanoid, which the FAQ's own bands put well above a desk arm. Read the band that matches your embodiment, not the smallest number on the page. DROID is a scale reference only, unpacked in our DROID article.

The counter-example worth remembering

ALOHA gave Thread Velcro twice the data of every other task, 100 demonstrations against 50, because it was the hardest. It still finished at 20 percent: 92 percent at the lift, 40 at the grasp, 20 at the insert, roughly halving at every stage. Doubling the episode count did not buy the millimetres.

ACT real-world taskDemonstrationsFinal success
Slot Battery5096%
Put On Shoe5092%
Slide Ziploc5088%
Open Cup5084%
Prep Tape5064%
Thread Velcro10020%

Turning published hours into SO-100 episodes

Papers report hours; recording sessions count episodes. The conversion needs one real number, so read it out of lerobot/svla_so100_pickplace, the reference SO-100 set released with the SmolVLA paper.

bash
curl -sL https://huggingface.co/datasets/lerobot/svla_so100_pickplace/resolve/main/meta/info.json \
  | python3 -c 'import json,sys; d=json.load(sys.stdin); print(d["total_episodes"], d["total_frames"], d["fps"])'
# 50 19631 30
# 19631 frames / 50 episodes / 30 fps = 13.1 seconds of robot motion per episode
Read the real episode length out of a real dataset rather than guessing it.
EpisodesRobot motion at 13.1 s eachBench time, record defaultsRoughly equivalent to
306.6 minabout 37 minthe SmolVLA floor here
5011 minabout 1 hthe ACT, GR00T and Pi0.5 floor; the ALOHA and SmolVLA per-task count
10022 minabout 2 hthe Isaac-GR00T FAQ figure for a simple fixed-location task
20044 minabout 4 hNVIDIA's apple-to-plate workflow figure (on a humanoid)
5001.8 habout 10 hthe FAQ figure for complex or multi-step scenes
1,3755 habout 28 hthe smallest Pi0 post-training budget, converted

The bench-time column is arithmetic, not a measurement: the lerobot-record defaults shipped in v0.6.1 (fps 30, episode_time_s 60, reset_time_s 60, num_episodes 50) plus 13.1 s of motion. The reset window dominates, and most operators cut reset_time_s to 10 or 15 seconds once they have a routine, roughly halving the wall clock. ALOHA's reported 30 to 60 minutes for 50 demonstrations is the order-of-magnitude check. Caveat on the last row: Pi0's hours are bimanual and mobile with far longer episodes.

A starting number for a single SO-100 bench

Combining the floors with the evidence gives a defensible place to start a first fine-tuning run. The third column matters more than the second.

Task shapeStart withVary across episodes
One object, fixed pose, fixed camera, controlled light40 to 60grasp point and approach angle only
One object, 5 start positions, fixed camera50 to 8010 to 15 per position, as in the SmolVLA datasets
One category, several instances, some background change100 to 2003 to 6 instances, 2 or 3 backgrounds, moved camera
Multi-step task (pick, move, place, release)200 to 500each stage's start state, plus partial-failure recoveries
Precision insertion, where millimetres decide300+, expect a plateau well below 90 percentthe tolerance itself: offset the target a few mm between episodes
Recording more versus recording differently
Record more when
  • Held-out loss is still falling at the end of training.
  • Half your episodes is clearly worse than all of them.
  • Your task sits in the Square or Transport band, where the curve was still climbing at 100 percent of the data.
  • The GR00T FAQ's iterative route applies: start near 100 demonstrations, train, then add human-gated corrections where the policy fails.
Record differently when
  • Half your episodes already scores the same as all of them. You have saturated.
  • Every episode starts from the same pose with the same object under the same light. Frames, not information.
  • The policy succeeds from poses you recorded and fails from ones you did not. Coverage, not volume.
  • The failure is a defect, not a shortage: a swapped camera index, a limit-parked joint, an unreadable task string.

Two experiments that answer it for your dataset

Everything above is other people's benches. Two runs on a 24 GB card, a couple of dollars each, tell you about yours: hold out episodes, then retrain on half the data. Every flag below exists in lerobot v0.6.1; check your install with lerobot-train --help first, and see train your first policy for the end-to-end version.

  1. 1
    Hold out episodes and watch the held-out loss

    --dataset.eval_split holds out a fraction of episodes per task; --eval_steps computes loss on them every N steps. lerobot rejects eval_steps > 0 unless eval_split > 0, so set both. Training loss falling while held-out loss flattens or rises means memorisation, and more of the same is the wrong purchase.

    bash
    lerobot-train \
      --dataset.repo_id=your-name/your_task \
      --dataset.eval_split=0.1 \
      --eval_steps=500 \
      --policy.type=act \
      --steps=100000 \
      --batch_size=8 \
      --seed=1000
  2. 2
    Train the same recipe on half the data

    --dataset.episodes takes an explicit list of indices. Train once on the even half and once on everything, same seed and step count, then evaluate both on the arm. If the half-data checkpoint matches the full one, the next fifty of the same will not help either.

    bash
    lerobot-train \
      --dataset.repo_id=your-name/your_task \
      --dataset.episodes='[0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48]' \
      --policy.type=act \
      --steps=100000 \
      --seed=1000 \
      --output_dir=outputs/half
  3. 3
    Delete the episodes you know are bad first

    There is no exclude flag on the trainer. Cut bad recordings out of the dataset with lerobot-edit-dataset, writing to a new repo id so the original survives. Sixty episodes with twelve defective ones trains like forty-eight, and the twelve teach the wrong thing.

    bash
    lerobot-edit-dataset \
      --repo_id your-name/your_task \
      --new_repo_id your-name/your_task_clean \
      --operation.type delete_episodes \
      --operation.episode_indices "[7, 19, 33]"
  4. 4
    Evaluate on the arm, not on the loss curve

    Loss is a poor proxy for success. Run each checkpoint on the robot from fixed start poses and score it. In v0.6.1 lerobot-record is a pure data-collection tool with no policy inference; lerobot-rollout runs a trained policy on real hardware. Ten trials per pose is roughly the papers' protocol.

    bash
    lerobot-rollout \
      --strategy.type=base \
      --policy.path=outputs/half/checkpoints/last/pretrained_model \
      --robot.type=so100_follower \
      --robot.id=my_arm \
      --robot.port=/dev/ttyACM0 \
      --robot.cameras='{top: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}}' \
      --task="Pick the cube and place it in the box." \
      --duration=30
The comparison that eats a day

A 50-episode run against a 100-episode run only means something if everything else is identical. GR00T's fine-tuning entry point (launch_finetune.py, a tyro CLI) exposes no seed, so two GR00T runs on the same data are not bit-for-bit reproducible and a few points between them prove nothing. lerobot's default seed is 1000 and settable, so run the comparison on ACT or SmolVLA, then carry it over to GR00T N1.7.

The AY-Robots tutorial page for recording your first LeRobot dataset with an SO-100 arm
The walkthrough at /learn/record-your-first-dataset, where the episode count is decided before the session rather than after it.

Getting the episodes recorded

Install lerobot with the extras the recording scripts need, find the ports, calibrate both arms, then record. Version 0.6.1 went to PyPI on 3 August 2026 with console entry points, so any tutorial invoking a script path under lerobot/scripts/ describes an older layout. core_scripts pulls the dataset, hardware and viz dependencies; the SO-100's Feetech bus servos need the feetech extra too.

bash
pip install 'lerobot[core_scripts,feetech]'

lerobot-find-port
lerobot-calibrate --robot.type=so100_follower --robot.id=my_arm --robot.port=/dev/ttyACM0

lerobot-record \
  --robot.type=so100_follower --robot.id=my_arm --robot.port=/dev/ttyACM0 \
  --teleop.type=so100_leader --teleop.id=my_leader --teleop.port=/dev/ttyACM1 \
  --robot.cameras='{top: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}}' \
  --dataset.repo_id=your-name/your_task \
  --dataset.single_task="Pick the cube and place it in the box." \
  --dataset.num_episodes=60 \
  --dataset.episode_time_s=20 \
  --dataset.reset_time_s=15 \
  --dataset.push_to_hub=false
push_to_hub defaults to true

In lerobot v0.6.1 DatasetRecordConfig.push_to_hub is True by default, so a plain lerobot-record uploads your session to the Hub when it finishes. Pass --dataset.push_to_hub=false to keep it local. The same config appends a date-time tag to your repo_id unless you pass --dataset.no_stamp=true.

Then split the session: rather than 60 episodes from one pose, record six blocks of ten with the object somewhere different in each, and move the camera between blocks two and three. That is RT-1 and Pi0.5 applied to a desk.

  • You own the files and the format, as long as you remember to turn the upload off.
  • You need both arms, cameras, a clean USB topology and a machine that holds 30 fps while writing video.
  • GR00T wants LeRobot v2.0 or v2.1 and lerobot 0.6.1 records v3.0, so budget a conversion step.
  • Training is your problem: A100 or H100 for GR00T and Pi0.5, a 24 GB card for ACT and SmolVLA.

Where more demonstrations will not save you

A large share of "I need more data" turns out to be something else wearing a data costume. Rule these out before booking another recording afternoon.

  • Defective episodes. Swapped camera indices, frozen frames, a joint parked against its limit. The bad ones teach the wrong thing. See loss falls but the policy does nothing.
  • Coverage, not volume. If the arm succeeds from recorded poses and fails elsewhere, that is a policy that only works in one setup. The fix is different poses, not more of the same.
  • Format. A LeRobot v3.0 dataset crashes the GR00T loader and surfaces as a failed job, not a shortage. See dataset rejected as v3.
  • Latency. The control loop is 20 to 485 ms per action step depending on the model, and public-internet round trips on top turn a working policy into a hesitant one. Remote inference suits slow pick and place, not fast reactive motion. No episode count fixes it.
  • The gripper. If the approach is right and the gripper closes on nothing, check the wrist camera before the episode count. See gripper does not close.
  • Lighting. NVIDIA's FAQ notes vision-language backbones struggle with hard shadows and hue shifts, and recommends colour jitter plus 20 to 50 episodes under different lighting rather than more under the same lamp.
The AY-Robots public dataset directory listing LeRobot datasets available for training
The dataset directory at /directory. Reusing an existing recording is the cheapest way to add episodes.

What the extra episodes cost

Recording time is the expensive input; the GPU is not. A second training run to test whether 100 episodes beats 50 costs less than the hour it takes to record the extra 50.

ItemTimeMoney
50 more episodes at 13 s, record defaultsabout 1 h at the bench0
GR00T N1.7, GR00T N1.5 or Pi0.5 run3 to 6 habout 4 to 12 USD (1.20 to 2.00 USD/h spot)
SmolVLA or ACT run2 to 5 habout 1 to 3 USD (0.30 to 0.60 USD/h spot)
The half-data control runsame as aboveone extra run, same tier

Full numbers are on the pricing page, and the training matrix links every model-and-arm pair to its guide, for example SmolVLA on the SO-100 or GR00T N1.7 on the SO-100. Still choosing between the 24 GB models? ACT against SmolVLA is the head-to-head, and the arena lists 85 VLA models with 332 benchmark results, each linked to its source.

The AY-Robots cost table: which GPU each policy needs, typical run time, price per run and episodes needed before a policy is useful
The cost table on /try puts the GPU price next to the episode count, the comparison that matters when deciding whether to record more.

Record the episodes properly the first time

The desktop client records LeRobot-format datasets straight from a teleoperation session: episodes, camera streams and joint states, in the format the trainers expect. It runs next to your arm.

Get the desktop client
The AY-Robots download page for the desktop client that records LeRobot datasets
The client at /download writes LeRobot episodes directly from a teleoperation session.
What is the absolute minimum number of episodes to train a policy?

On this platform, 30 for SmolVLA and 50 for ACT, GR00T N1.5, GR00T N1.7 and Pi0.5. Those are enforced gates; below them the trainer will not start. Above them it depends on the task: robomimic got 100 percent on a simple lift with 40 demonstrations, and 29.3 percent on a peg insertion with the same 40.

Is 50 episodes enough for a pick and place on an SO-100?

For a fixed camera, one object and a handful of start positions, it is a reasonable first run. The SmolVLA paper used exactly 50 per real-world SO-100 dataset, as 10 trajectories at each of 5 start positions, though it trained multi-task across three such datasets rather than on one. If the object, background or lighting varies, the Isaac-GR00T FAQ's roughly 100 trajectories is the next step up.

Should I record 200 episodes of one task or 50 each of four?

Four, if they are related. RT-1 measured it: dropping 25 percent of the tasks while keeping 97 percent of the frames hurt generalization about as much as deleting 49 percent of the data. The data scaling laws study agrees from the other side, recommending 50 demonstrations per environment-object pair and spending the rest on more pairs.

How do I know whether more episodes will help before recording them?

Train the same recipe twice with the same seed, once on half your episodes via --dataset.episodes and once on all of them, then evaluate both on the arm from fixed start poses. If the half-data checkpoint matches the full one, you have saturated. Also hold out episodes with --dataset.eval_split and set --eval_steps: if held-out loss flattens while training loss keeps falling, you are memorising.

Do longer episodes count the same as more episodes?

No. A policy learns from the variety of states it sees, and a longer episode of the same motion mostly adds correlated frames. The reference SO-100 pick-and-place dataset averages 13.1 seconds across its 50 episodes, and lerobot-record's 60 second episode_time_s is a ceiling, not a target.

Does pre-training mean I need fewer demonstrations?

It helps, measurably rather than magically. Pi0 swept fine-tuning budgets of 1, 5 and 10 hours and reports the pre-trained model often beating one trained from scratch, sometimes by as much as 2x, with the gap widest on the hardest tasks. Fine-tuning GR00T N1.7 or SmolVLA lets you start at the 30 to 50 episode floor, but task difficulty still rules: ALOHA gave Thread Velcro 100 demonstrations and still finished at 20 percent.

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started