The AY-Robots GPU cost table showing which card each policy needs, typical run time, price per run and the minimum number of episodes
training-costgpu-rentalvla-fine-tuninglerobotso-100

Cutting the Cost of Robot Policy Training: 5 Levers

AY-Robots ResearchAugust 23, 202620 min read

Real GPU rates, real trainer defaults, and the five places a robot training budget leaks: oversized models, demo step counts, dead datasets, forgotten instances, and reruns.

A fine-tuning run is one of the few line items in robot learning with an honest price tag. You can look the rate up before you spend it: on 2026-08-24, RunPod's public pricing page lists an A100 80 GB PCIe at 1.19 USD per hour on the community tier and 1.39 USD on secure cloud, an RTX 4090 at 0.34 USD community, and an H100 PCIe at 1.99 USD community. Hugging Face Jobs bills its a100-large flavour at 2.50 USD per hour. Those rates are set by a market you do not control.

The hours are different. The hours come out of decisions you make in a form: which policy you picked, how many training steps you asked for, whether the dataset was ever capable of training anything, and whether you remembered to destroy the pod. This article is about those decisions, because that is where the money is. The published rates per tier are on the pricing page, and what the platform bills against is described in the billing documentation.

What you need to know

  • Run cost is wall-clock hours times GPU rate. You control the hours far more than the rate.
  • Model choice is the single biggest multiplier: about 4 to 12 USD per run on the A100 80 GB / H100 tier against about 1 to 3 USD on a 24 GB card.
  • Upstream step counts are ceilings someone chose for a demo. Isaac-GR00T ships max_steps=10000, lerobot ships steps=100000. Neither number knows how many episodes you recorded.
  • The most expensive run is the one that was already dead at step 0 because the dataset format, the camera keys or the episode metadata were wrong.
  • Storage keeps billing after the GPU stops. On RunPod a stopped pod's volume disk costs 0.20 USD per GB per month, twice the running rate. On Vast.ai storage is billed for as long as the instance exists at all.
  • Cheaper training does not fix control-loop latency, thin data, or a badly built arm. Those bills are paid elsewhere.

A run is two numbers multiplied, and only one is yours

The arithmetic is not complicated, which is exactly why it is worth writing down. Every optimisation below is an attack on one of these three terms.

text
run_cost      = wall_clock_hours * gpu_rate_per_hour
wall_clock_hours = setup + (steps * seconds_per_step) / 3600

# Anchor: lerobot's own SmolVLA doc states that 20k steps
# takes "roughly ~4 hrs on a single A100 GPU" at batch_size=64.
seconds_per_step = 14400 / 20000 = 0.72   # includes data loading

# That run on RunPod's community A100 80 GB (1.19 USD/h, listed 2026-08-24):
4.0 h * 1.19 USD/h = 4.76 USD    # plus setup, plus the dataset download
Where the bill comes from. The seconds-per-step figure is derived from the run time lerobot documents, not measured here.

Two things fall out of that. First, setup is not free: pulling a 3 B base checkpoint and a few gigabytes of video onto a fresh pod happens on a clock that is already running. Second, steps is the only term you set directly, and it is the one people copy from a README without thinking.

On AY-Robots the whole run lands in one of two bands, because the backend rents the card by required VRAM. The GR00T N1.7, GR00T N1.5 and Pi0.5 tier runs 3 to 6 hours at 1.20 to 2.00 USD per hour, about 4 to 12 USD per run. The SmolVLA and ACT tier runs 2 to 5 hours at 0.30 to 0.60 USD per hour, about 1 to 3 USD per run. Both are small numbers. Cost only becomes a problem because almost nobody gets a working policy on run one.

PolicyGPU tierTypical runCost bandMin episodesInference latency
GR00T N1.7A100 80 GB or H1003 to 6 h4 to 12 USD50152 ms
GR00T N1.5A100 80 GB or H1003 to 6 h4 to 12 USD50165 ms
Pi0.5A100 80 GB or H1003 to 6 h4 to 12 USD50485 ms
SmolVLARTX 4090 or any 24 GB2 to 5 h1 to 3 USD30245 ms
ACTRTX 4090 or any 24 GB2 to 5 h1 to 3 USD5020 ms
The AY-Robots cost table listing which GPU each of the five policies needs, the typical run time, the price band and the number of episodes required
The /try cost table. The tier split is a VRAM decision, not a quality ranking: a 3 B model does not fit in 24 GB.

Lever 1: stop paying foundation-model prices for a fixed-camera task

The gap between the two tiers is roughly four times the money, and a longer wait for every attempt. It exists because a vision-language-action model with 3 B parameters cannot be fine-tuned on a 24 GB card. NVIDIA's own hardware guide for Isaac-GR00T puts the fine-tuning minimum at 1 GPU with 40 GB+ VRAM and notes that the default configuration, which tunes only the projector and the diffusion action head, keeps peak VRAM under about 35 GB per GPU.

So the first question is not "which model is best" but "does my task need what the big model brings". What it brings is web-scale semantics: language conditioning that survives rephrasing, and some tolerance for objects it has not seen. If your task is one bin, one camera rig, one object type and one instruction, you are paying for generalisation you will never exercise. ACT's original paper reports 80 to 90 percent success on 6 real-world fine manipulation tasks from "only 10 minutes worth of demonstrations", with no pretraining at all. The SmolVLA paper makes the same argument from the other side: the model is "designed to be trained on a single GPU and deployed on consumer-grade GPUs or even CPUs", with performance its authors report as "comparable to VLAs that are 10x larger". Whether that holds for your task is an empirical question, and it is a cheap one to ask.

Dropping from the 3 B tier to the 24 GB tier
What you save
  • About 4 to 12 USD per run becomes about 1 to 3 USD per run.
  • 3 to 6 hours becomes 2 to 5 hours, so you get more attempts per evening.
  • SmolVLA and ACT also run locally, so a smoke test costs nothing at all.
  • ACT infers in 20 ms against GR00T N1.7's 152 ms, which matters more than the training bill if the task is fast.
What you give up
  • ACT has no base model. It only exists after training on your task, so it starts from scratch every time and cannot transfer.
  • Language conditioning gets weak or disappears. One policy per task, not one policy per instruction.
  • Generalisation to a new object, a new background or a moved camera drops sharply.
  • SmolVLA needs 30 episodes minimum and ACT 50, so you do not save on the data-collection side.
Try the cheap tier first, then escalate

The order that wastes the least money is: run ACT or SmolVLA on the data you already have, see whether the task is learnable at all, and only move to GR00T N1.7 or Pi0.5 when you have evidence that the failure is a capability gap rather than a data gap. A failed 2 USD run tells you almost as much as a failed 10 USD run. The ACT against SmolVLA comparison and the arena leaderboard, which holds 332 benchmark results across 85 models, are the places to check that assumption before you commit.

The Find your combination matrix on the AY-Robots training page, with the five policies as rows and four robot arms as columns, every cell linking to a specific guide
The /train matrix. Picking the row is the four-times decision; picking the column just changes the calibration details.

Lever 2: max_steps is a ceiling somebody picked, not a target

Upstream defaults are chosen so that a demo dataset produces a demo video. They are not sized for your 50 episodes. Read against the source on 2026-08-24: Isaac-GR00T's FinetuneConfig ships max_steps: int = 10000 with global_batch_size: int = 64 and save_steps: int = 1000. lerobot's TrainPipelineConfig ships steps: int = 100_000 with batch_size: int = 8 and save_freq: int = 20_000.

SettingIsaac-GR00T upstreamlerobot upstreamAY-Robots sendsCost effect
Steps10000100000GR00T N1.7: 20000, ACT: 100000Linear. Halving the steps halves the GPU hours.
Batch size64 (global, pre-accumulation)8GR00T N1.7: 32, ACT: 8, SmolVLA: 2Bigger batch is fewer steps for the same data, until VRAM stops you.
Checkpoint intervalsave_steps 1000save_freq 20000saveSteps on GR00T runsFree to change, and it decides whether a dead run is salvageable.
Checkpoints keptsave_total_limit 5no cap in the train confignot exposedSilently deletes early checkpoints. Can force a full re-run.
Held-out evalnot in FinetuneConfigeval_steps 0, eval_split 0.0 (both off)not exposedOff by default, so nothing tells you the run stopped improving.

Notice that the platform's GR00T N1.7 default of 20000 steps at batch 32 pushes the same number of samples through the model as NVIDIA's 10000 steps at batch 64. It is the same amount of work, split differently. The ACT default of 100000 steps at batch 8 is lerobot's own default, unchanged. Neither is a claim that your dataset needs that many steps.

The practical move is to shorten the checkpoint interval rather than the run. A run that writes a checkpoint every 1000 steps can be killed the moment the loss curve flattens, and you keep everything up to that point. A run that writes one every 20000 steps has to be watched to the end or thrown away.

bash
# lerobot: save often, log often, and hold out a slice so you can see the plateau
lerobot-train \
  --policy.path=lerobot/smolvla_base \
  --dataset.repo_id=${HF_USER}/mydataset \
  --dataset.eval_split=0.1 \
  --eval_steps=2000 \
  --batch_size=64 \
  --steps=20000 \
  --save_freq=2000 \
  --log_freq=200 \
  --output_dir=outputs/train/my_smolvla \
  --job_name=my_smolvla_training \
  --policy.device=cuda \
  --wandb.enable=true
The base command is lerobot's documented SmolVLA fine-tune. The eval and save frequencies are the additions that let you stop early.
save_total_limit deletes the checkpoint you wanted

Isaac-GR00T's FinetuneConfig defaults to save_total_limit: int = 5, described in the source as "Maximum number of checkpoints to keep before older ones are deleted". With the default save_steps=1000 and a 10000-step run, steps 1000 through 5000 are gone by the time the run finishes. If your policy peaked early, which happens on small datasets, you cannot go back and get it. Raise the limit or accept that you may pay for the run twice. The related failure of a loss that falls while the policy does nothing is exactly the case where you want those early checkpoints.

The numbered step list on the AY-Robots GR00T N1.7 on SO-100 training guide, showing each stage of a run
The GR00T N1.7 run, step by step. The parameters that decide the bill are set before step 1, not during.

Lever 3: the run that was already dead at step 0

This is the expensive one, and it is expensive twice: you pay for the GPU hours and you pay for the evening. A run on a dataset that could never have trained anything still bills at full rate, and unless you set up a held-out split, the loss curve will look plausible while it does it.

There are four common ways a dataset kills a run. The format is wrong: a LeRobot dataset in v3.0 crashes the GR00T loader, which wants v2.0 or v2.1. The metadata is wrong: a partial Hugging Face snapshot leaves episode entries in meta/episodes.jsonl that point at files which were never downloaded. The camera keys do not match the modality config the trainer expects. Or the episodes themselves are unusable, which no schema check will catch: the recording-side quality rules decide that long before the trainer ever sees the data.

  1. 1
    Convert the dataset before you rent anything

    Isaac-GR00T ships a converter for exactly this. It lives in its own directory with its own pyproject.toml, and the README is explicit that you must install from that directory rather than the repo root.

    bash
    cd scripts/lerobot_conversion
    uv venv && source .venv/bin/activate
    uv pip install -e . --verbose
    python convert_v3_to_v2.py --repo-id <hf_user>/<dataset>
  2. 2
    Repair broken episode metadata

    The repair script drops broken episode entries from meta/episodes.jsonl, updates the summary fields in meta/info.json and regenerates stats. The dataset path is positional and --dry-run reports the damage without writing. Running it on a laptop costs nothing. Discovering the problem on a rented A100 costs an hour.

    bash
    python scripts/repair_lerobot_metadata.py /path/to/dataset --dry-run
    python scripts/repair_lerobot_metadata.py /path/to/dataset
  3. 3
    Do a 50-step smoke run on the cheap tier

    Before a 20000-step run on an 80 GB card, run 50 steps of ACT or SmolVLA locally or on a 24 GB card. It exercises the loader, the camera keys, the normalisation statistics and the checkpoint writer. Everything that fails at step 0 fails here for free.

    bash
    lerobot-train \
      --policy.type=act \
      --dataset.repo_id=${HF_USER}/mydataset \
      --steps=50 \
      --save_freq=25 \
      --batch_size=2 \
      --output_dir=outputs/smoke \
      --job_name=smoke
  4. 4
    Watch the first checkpoint, not the last

    If the first checkpoint at step 1000 or 2000 produces nothing but a mean action, kill the run. The remaining 18000 steps will not repair a dataset. Send the money to a second recording session instead.

The default timeout that eats a run

If you dispatch training to Hugging Face Jobs, note the documented behaviour: "Jobs have a default timeout (30 minutes), after which they will automatically stop." A lerobot run at the default save_freq=20000 will not have written a single checkpoint by then. You get billed for half an hour of an a100-large at 2.50 USD per hour and receive nothing. Set timeout="6h" and lower save_freq before you dispatch. The same class of problem on this platform shows up as a job stuck in the queue or a dataset rejected for being v3.0.

Lever 4: the card you stopped and the disk you forgot

Stopping is not destroying, and every marketplace documents this in a place people do not read until the invoice arrives. Vast.ai's billing FAQ states it plainly: "You are charged the storage cost (which depends on the size of your storage allocation) for every second your instance exists and is online, regardless of what state it is in: active, inactive, loading, etc." Their pricing guide adds: "Storage charges continue even when instances are stopped. Delete instances completely to cease storage billing."

RunPod goes one step further and charges more for the idle case. Their pricing documentation lists volume disk at 0.10 USD per GB per month while the pod runs and 0.20 USD per GB per month while it is stopped. Container disk is not charged on a stopped pod; the volume is. And if the balance runs out, pods without a network volume are terminated and their data cannot be recovered, which is how people lose checkpoints they were paying to keep.

What is left behindVast.aiRunPodMonthly cost of a 200 GB checkpoint dir
Instance runningGPU per second plus storageGPU per hour plus 0.10 USD/GB/mo20 USD storage plus the GPU
Instance stoppedstorage still billed for as long as it existsvolume disk 0.20 USD/GB/mo40 USD on RunPod, storage rate on Vast
Instance destroyednothingnothing0 USD, and the data is gone
Network volume, no podn/a0.07 USD/GB/mo under 1 TB14 USD
What the platform does here

Cloud inference pods provisioned through /api/inference/pod carry an idle watchdog and destroy themselves after an idle period, so a policy you forgot to stop does not keep billing silently. That covers the inference side. Training checkpoints are written to object storage, so there is no rented disk sitting there attached to a stopped card. See the billing documentation for how the platform accounts for a run.

If you do rent the card yourself, the discipline is short: write checkpoints to object storage during the run rather than to the pod's volume, verify the objects landed, then destroy the instance rather than stopping it. "I will look at it tomorrow" is how a 200 GB volume ends up costing 40 USD for the month nobody looked at it.

Lever 5: do not buy the same answer twice

Two upstream defaults quietly make repeat runs likely. Isaac-GR00T's resume_from_checkpoint defaults to False, documented in the source as "Default False so a rerun against an existing output_dir starts fresh instead of silently merging with a previous experiment". That is the right default for correctness and the wrong one for your wallet if you assumed a rerun would continue. And save_only_model, which looks like a tidy way to save disk, carries the note "Cannot resume training from these checkpoints".

bash
# GR00T: resume rather than restart, and keep the optimizer state so you can
uv run python gr00t/experiment/launch_finetune.py \
  --base-model-path nvidia/GR00T-N1.7-3B \
  --dataset-path /data/my_so100_dataset \
  --embodiment-tag NEW_EMBODIMENT \
  --modality-config-path examples/SO100/so100_config.py \
  --output-dir ./outputs/run_a \
  --max-steps 20000 \
  --save-steps 1000 \
  --save-total-limit 20 \
  --resume-from-checkpoint    # tyro turns the bool field into this flag
The entry point is a tyro CLI, so dataclass fields become dashed flags. save_only_model and resume_from_checkpoint are mutually exclusive, enforced at run time.
GR00T runs are not reproducible, so a rerun is a new experiment

Read the whole of FinetuneConfig and there is no seed field. lerobot exposes seed: int | None = 1000 and an optional cudnn_deterministic flag, so a lerobot run can be repeated. A GR00T run cannot be repeated bit for bit, which means "let me just run it again to check" is not a check, it is a second experiment at full price. Decide what you are testing before you spend the hours. The GR00T N1.7 on SO-100 guide lists the exact defaults a run starts from.

The same logic applies to hyperparameter sweeps. On a 4 to 12 USD run, a five-point learning-rate sweep is 20 to 60 USD, and on a 50-episode dataset it will mostly tell you about noise. Change one thing at a time, and change the thing with the largest effect first: more episodes beats a better learning rate almost every time.

Doing it yourself against doing it here

You rent the card, you own every second of it. This is the cheapest path per GPU-hour and the most expensive path per mistake.

  1. 1
    Pick an offer and bid

    Interruptible capacity on Vast.ai is documented as often 50 percent or more cheaper than on-demand, at the cost of being pre-empted. Worth it only if your run checkpoints often enough to survive a pause. gpu_ram is per-GPU VRAM in GB, so 40 is the Isaac-GR00T fine-tuning minimum.

    bash
    vastai search offers 'gpu_ram>=40 num_gpus=1 disk_space>200 verified=true rentable=true' -o 'dlperf_usd-'
  2. 2
    Install the trainer and pull the base model

    This is billable time before step 0. A 3 B checkpoint plus a video dataset is not a small download.

    bash
    git clone https://github.com/NVIDIA/Isaac-GR00T
    cd Isaac-GR00T
    uv sync --python 3.12
  3. 3
    Launch with a short save interval

    Frequent checkpoints are what make a cheap interruptible instance usable and what let you stop the run the moment it flattens.

    bash
    uv run python gr00t/experiment/launch_finetune.py \
      --base-model-path nvidia/GR00T-N1.7-3B \
      --dataset-path /data/my_so100_dataset \
      --embodiment-tag NEW_EMBODIMENT \
      --modality-config-path examples/SO100/so100_config.py \
      --global-batch-size 32 \
      --max-steps 20000 \
      --save-steps 1000 \
      --num-gpus 1
  4. 4
    Copy the checkpoints off, then destroy

    Verify the objects are readable at their destination before the instance goes away. Vast.ai's own documentation is explicit: destroying an instance stops all billing, while stopping it only halts compute billing and lets disk storage charges continue.

    bash
    aws s3 sync ./outputs s3://my-bucket/run_a/ && vastai destroy instance <id>
  • Cheapest per hour, especially on interruptible capacity.
  • You can run anything: custom modality configs, LoRA through lerobot's PeftConfig, multi-GPU torchrun.
  • You carry the CUDA and driver debugging, on the clock.
  • You carry the idle-disk risk and the forgotten-instance risk personally.

Where a cheaper run does not help at all

Three bills are unaffected by anything in this article, and it is worth naming them so the optimisation stops at the right place.

CostRough sizeWhy training savings do not touch it
The arm110 to 150 EUR for an SO-100 in parts, 400 to 500 EUR for a LeKiwiOne-time hardware. A 2 USD run and a 12 USD run both need a working arm.
Recording hoursthe largest line item, and it is human time30 to 50 episodes of teleoperation cannot be rented on a spot market.
Control-loop latency20 ms for ACT up to 485 ms for Pi0.5, per action stepAdding public-internet round trips to that budget turns a working policy hesitant. Cheap remote inference is viable for slow pick-and-place, not for fast reactive motion.

That last row is the honest limit of the whole cloud-training story. Training happily lives in a data centre. Inference latency does not: for fast tasks the policy has to sit next to the servos. This is the same trade-off examined in the general VLA overview, and the practical consequences are in the training documentation. The recording hours in the row above are the same problem seen from the other end: teleoperation time is the one input to a policy that no amount of GPU discount reduces.

The 7.4 V rule, because a destroyed arm outweighs every run you will ever pay for

SO-100, SO-101 and LeKiwi arms use Feetech STS3215 bus servos on a 7.4 V rail. Feeding them 12 V destroys them. Koch v1.1 uses Dynamixel servos on 5 V and 12 V rails, which is why a power supply cannot be swapped between builds. One wrong brick costs more than a hundred training runs. The SO-100 hardware page lists the correct supply, and the full SO-100 guide covers the build.

A worked budget for a first working policy

Assume an SO-100, one task, and the ordinary case where the first attempt does not work. This is the sequence that gets there for the least money, with the platform's own cost bands.

StageWhat you doCostWhat it buys
1. Record30 to 50 episodes with the desktop client0 USD, several hours of your timeThe thing that actually decides success.
2. ValidateConvert format, repair metadata, 50-step smoke run locally0 USDKills the dead-at-step-0 run before it costs anything.
3. Cheap baselineACT on the 24 GB tier, checkpoint every 2000 steps1 to 3 USDIs the task learnable from this data at all.
4. Read the checkpointsRun the earliest usable checkpoint on the armGPU time onlyTells you whether to record more data or change model.
5. Escalate if neededGR00T N1.7 or Pi0.5 on the 80 GB tier4 to 12 USDLanguage conditioning and generalisation, if the task needs them.
Total to a first honest answer1 to 3 USD if the cheap tier answers it, 5 to 15 USD if you escalateTwo runs, not five.

The reason this ordering is cheap is not that any single run is cheap. It is that steps 2 and 3 remove most of the reasons a 12 USD run fails, before you buy it. If you want the guided version of the same sequence, the first-policy walkthrough runs through it, and the per-model guides such as SmolVLA on the SO-100 and ACT on the SO-100 carry the exact defaults for each combination.

What is the cheapest way to train a policy for an SO-100?

Record 30 or more episodes, validate the dataset locally, then train ACT or SmolVLA on the 24 GB tier, which costs about 1 to 3 USD per run on AY-Robots. Both also run locally, so if you already own a 24 GB card the marginal cost of a run is electricity. Only move to GR00T N1.7 or Pi0.5, at about 4 to 12 USD per run on the 80 GB tier, once you have evidence that the cheap model's failure is a capability gap rather than a data problem.

How many training steps do I actually need?

Nobody can tell you a number in advance, which is why the answer is to checkpoint often and stop when the curve flattens rather than to guess a step count. lerobot documents 20000 SmolVLA steps as roughly 4 hours on a single A100, and a few hours for 100000 ACT steps on a single GPU. Isaac-GR00T defaults to 10000. Those are starting points sized for demo datasets, and on 50 episodes you will often see the useful checkpoint well before the end.

Is an interruptible or spot instance worth the risk?

Vast.ai documents interruptible capacity as often 50 percent or more cheaper than on-demand, in exchange for being pre-empted. That trade only works if your run writes checkpoints frequently and can resume from them. With Isaac-GR00T that means leaving save_only_model at False, because those checkpoints explicitly cannot be resumed from, and passing resume_from_checkpoint on the restart since it defaults to False.

Why did my GPU bill keep growing after the run finished?

Almost certainly storage on a stopped instance. Vast.ai charges storage for every second the instance exists regardless of state, and RunPod charges 0.20 USD per GB per month for a stopped pod's volume disk, which is twice the running rate. Destroy the instance rather than stopping it, after verifying that the checkpoints were copied somewhere else.

Does a bigger batch size make a run cheaper?

Up to the point where VRAM stops you, yes, because you push the same amount of data through in fewer steps. NVIDIA's hardware guide notes that the default GR00T fine-tune, which tunes only the projector and diffusion head, keeps peak VRAM under about 35 GB per GPU, while enabling tune_llm or tune_visual pushes the recommendation to 80 GB or more. Turning those flags on is therefore also a decision to rent a larger card.

Can I use LoRA to make fine-tuning cheaper?

lerobot ships a PeftConfig with a LoRA rank default of r=16, so the option exists for the policies it trains. It reduces memory and checkpoint size rather than wall-clock hours per step, so the saving shows up mainly as being able to use a smaller card. It is not exposed on the AY-Robots training form, so on this platform it is a do-it-yourself route.

See what a run costs before you start one

The pricing page lists the GPU tier each of the five policies needs, the typical run time and the price band, with no signup required to look.

See pricing

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started