AY-Robots cost table showing which GPU each of the five policies needs, the typical run time and price per run, and how many episodes are needed before the policy is useful
VLA trainingGPU costsSO-100fine-tuningrobot learningbudgeting

VLA Training Cost: What a Fine-Tuning Run Really Costs

AY-Robots ResearchAugust 23, 202623 min read

Real spot-market GPU prices, how long each of the five policies runs, what the arm and the demonstrations cost, and the four places the money quietly disappears.

The short version

  • A run on the A100 80 GB or H100 tier takes 3 to 6 hours and costs about 4 to 12 USD. On the RTX 4090 tier it is 2 to 5 hours and about 1 to 3 USD.
  • Measured on vast.ai at 13:44 UTC on 23 August 2026: a full RTX 4090 on demand for 0.13 to 0.38 USD/h, an A100 80 GB for 0.44 to 0.67, an H100 80 GB for 1.34 to 2.34. Full 80 GB cards are scarce, two and five single-card offers respectively.
  • The GPU is the cheapest line. The SO-ARM100 bill of materials puts a leader plus follower pair at 229.88 USD, which is 77 to 230 runs on the 24 GB tier.
  • Two hours of a person recording 50 episodes costs more than the training run those episodes feed.
  • Money disappears in four places: runs on broken data, 3B models on tasks an 80M policy handles, GPUs nobody destroyed, and reruns of a result you failed to keep.
  • AY-Robots sizes the card by the VRAM the model needs and rents it on the same spot market, so the run cost is the market cost.

The bill has four lines, and the GPU is the smallest one

When people ask what it costs to fine-tune a vision-language-action model for an SO-100, they almost always mean the GPU rental. That is the number that shows up as a charge on a card, so it is the one that feels real. It is also, by a wide margin, the smallest of the four numbers that decide what a working policy actually costs you.

LineWhat it isTypical size for one working policy
GPU timerenting a card for the run1 to 12 USD per run, and you will do 3 to 5
The robotservos, printed frame, cameras, cables, powerone time, 110 to 500 EUR by arm
Human hoursa person driving the arm to record demos1 to 4 hours per dataset, repeated per task
Wastebad data, oversized models, forgotten podsunbounded, and the only line you control

Training times below come from the five models' own papers and repositories, hardware cost from the published bill of materials, platform numbers from the AY-Robots policy catalog and pricing page. Where the platform does not help, this article says so.

What a GPU hour actually costs on the spot market

There is no single price for an A100 hour. On a marketplace like vast.ai every host sets its own rate, and the training run you launch lands on whichever machine is cheap and free at that second. The honest answer is a distribution. Here it is, measured 23 August 2026 at 13:44 UTC: single full cards, on demand, filtered by real VRAM.

Cardvast.ai on demand USD/h (low / median / high)Full-card offersvast.ai bid floorRunPod Community / SecureHugging Face
RTX 4090, 24 GB0.13 / 0.32 / 0.38240.110.34 / 0.74not offered
RTX 5090, 32 GB0.34 / 0.40 / 0.47290.190.69 / 0.99not offered
A100 80 GB, PCIe or SXM40.44 / 0.56 / 0.6720.131.19 PCIe, 1.39 SXM / 1.39, 1.592.50 as a Space
H100 80 GB, SXM or PCIe1.34 / 1.80 / 2.3450.441.99 PCIe, 2.69 SXM / 2.89, 3.294.50 as an endpoint
H100 NVL, 94 GB1.47 / 1.47 / 2.6440.402.59 / 3.19not offered
How this snapshot was taken, and what it is not

On-demand offers for a single full GPU (gpu_frac == 1.0) from the vast.ai public bundle API, which needs no account, filtered on gpu_ram so that only genuine 80 GB cards land in the 80 GB rows. That filter matters: in this read all three single-card A100 SXM4 offers were 40 GB parts, as were two of the four A100 PCIE offers, so pooling them into one "A100" row would have halved the price reported here. The Hugging Face column mixes two products: 2.50 USD/h is the Nvidia A100 - large Spaces hardware and 4.50 USD/h is a single H100 80 GB under Inference Endpoints, which Spaces does not offer. Treat the medians as indicative: the A100 80 GB row rests on two offers and the H100 row on five, and the identical query 36 seconds later returned a different 4090 count and a different top price on three of the five rows. RunPod list prices are the steadier number to plan against.

bash
# Live, full-card, single-GPU, on-demand offers from the vast.ai public bundle API.
# No account and no API key needed. gpu_ram is in MB, so an 80 GB card is >= 80000.
python3 - <<'PY'
import json, statistics, urllib.parse, urllib.request

def offers(name, min_ram):
    q = {"rentable": {"eq": True}, "num_gpus": {"eq": 1}, "gpu_name": {"eq": name},
         "order": [["dph_total", "asc"]], "limit": 500, "type": "on-demand"}
    url = "https://console.vast.ai/api/v0/bundles/?q=" + urllib.parse.quote(json.dumps(q))
    with urllib.request.urlopen(url, timeout=60) as r:
        return [o for o in json.load(r)["offers"]
                if o["gpu_frac"] == 1.0 and o["gpu_ram"] >= min_ram]

groups = {
    "RTX 4090 24 GB": (["RTX 4090"], 24000),
    "RTX 5090 32 GB": (["RTX 5090"], 30000),
    "A100 80 GB":     (["A100 PCIE", "A100 SXM4"], 80000),
    "H100 80 GB":     (["H100 SXM", "H100 PCIE"], 80000),
    "H100 NVL 94 GB": (["H100 NVL"], 90000),
}
for label, (names, min_ram) in groups.items():
    o = [x for n in names for x in offers(n, min_ram)]
    if not o:
        print(label, "no offers"); continue
    p = sorted(x["dph_total"] for x in o)
    b = sorted(x["min_bid"] for x in o if x.get("min_bid"))
    bid = f"{b[0]:.2f}" if b else "n/a"
    print(f'{label}: n={len(p)} | {p[0]:.2f} / {statistics.median(p):.2f} / {p[-1]:.2f}'
          f' USD/h | bid floor {bid}')
PY
The exact query behind the table above, run twice while writing this section. Run it before trusting any GPU pricing article, including this one.
AY-Robots cost table showing which GPU each policy needs, typical run time and price per run, and how many episodes are needed before the policy is useful
The cost table on /try: card, run time, price per run and minimum episodes per policy.

Why the 3B models cannot use the cheap card

A 4090 hour and an H100 80 GB hour differ by roughly six times at the medians above. What forces you onto the expensive card is not speed, it is memory. openpi puts the floor for a full Pi0.5 fine-tune at 70 GB, and NVIDIA recommends 40 GB or more for GR00T. Note what the GR00T number is not. Its fine-tune config freezes the language model and the visual encoder by default (tune_llm and tune_visual are False, the projector and the diffusion head True), which is why the catalog lists roughly 40 M trained parameters out of 3 B. The 40 GB is not optimizer state for 3 B weights, it is the frozen backbone plus activations. Reduced-scope variants drop lower: openpi's LoRA path wants 22.5 GB and names the 4090, and NVIDIA's Isaac Lab Arena workflow lists a 24 GB single-GPU option for GR00T post-training. The platform tiers on the floor each vendor publishes for the configuration it actually runs. The pi0 flow-matching write-up explains where that flow-matching footprint comes from.

JobMemory the upstream project asks forSource
pi0 / pi0.5 inferencemore than 8 GB, example RTX 4090openpi
pi0 / pi0.5 LoRA fine-tunemore than 22.5 GB, example RTX 4090openpi
pi0 / pi0.5 full fine-tunemore than 70 GB, example A100 80 GB or H100openpi
GR00T N1.7 inference1 GPU with 16 GB or moreIsaac-GR00T
GR00T N1.7 fine-tune40 GB or more recommended, H100 or L40 nodesIsaac-GR00T
GR00T fine-tune, what it trainsprojector and diffusion head; LLM and visual encoder frozen by defaultfinetune_config.py
GR00T post-training, reduced1 GPU with 24 GB, language model frozenIsaac Lab Arena
SmolVLA fine-tunesingle A100 for the reference 20,000-step runlerobot docs
ACT traininga single 11 GB RTX 2080 TiACT paper

That table is why the platform splits the five models into two tiers. GR00T N1.7, GR00T N1.5 and Pi0.5 go on A100 80 GB or H100 because that is what the vendors ask for. SmolVLA and ACT go on an RTX 4090 or any 24 GB card because that is genuinely enough.

The trap that eats a day: renting the cheap card for the big model

A GR00T or Pi0.5 run on a 24 GB card does not fail at second zero. It downloads the base checkpoint, builds the dataset index, starts the first forward pass and dies a few hundred steps in with a CUDA out-of-memory error. You paid for the download and the setup and got nothing. Fixes: out of memory during training.

How long each of the five models actually runs

Run time is the other half of the cost: 2.00 USD per hour is irrelevant if the job is 40 minutes and ruinous if it is 40 hours. These are the defaults AY-Robots really sends to the trainer, with the run window and cost for each tier.

PolicyGPU tierDefault max stepsDefault batch (grad accum)Run windowCost per run
GR00T N1.7, ~3BA100 80 GB or H10020,00032, accum 1, applies3 to 6 h4 to 12 USD
GR00T N1.5, ~3BA100 80 GB or H1002,0001, accum 16, applies3 to 6 h4 to 12 USD
Pi0.5, ~3BA100 80 GB or H10030,0001, accum 16, no effect3 to 6 h4 to 12 USD
SmolVLA, ~450MRTX 4090 or any 24 GB20,0002, accum 8, no effect2 to 5 h1 to 3 USD
ACT, ~80MRTX 4090 or any 24 GB100,0008, accum 12 to 5 h1 to 3 USD
Comparison table of the five trainable policies on AY-Robots showing parameter count, required GPU, inference latency and minimum episode count
The five policies side by side: parameters, GPU tier, latency per action step, minimum episodes.

Where those run windows come from upstream

  • SmolVLA: the lerobot documentation states that 20,000 steps takes roughly 4 hours on a single A100. The platform runs the same 20,000 steps on the cheaper 24 GB tier, hence a window rather than a flat 4 hours.
  • ACT: the original ALOHA paper reports around 5 hours on a single 11 GB RTX 2080 Ti for an 80M-parameter model. A 4090 is several generations newer but the platform budgets 100,000 steps, so the window lands in the same place.
  • GR00T: NVIDIA's reference workflow for the N1.6 generation quotes roughly 4 to 8 hours for 20,000 steps at batch 24 on eight L40S cards, and 2 to 3 hours for 30,000 steps at batch 16 on a single Ada 6000. Single-card fine-tuning of a 3B VLA in a few hours is normal, not optimistic.
  • Pi0.5: openpi publishes no wall-clock figure, but it does publish the 70 GB floor for a full fine-tune, which pins the card and therefore the rate.

Worth pausing on the number you are not paying. The GR00T N1 paper reports roughly 50,000 H100 GPU hours to pretrain the 2.2B model, on a cluster of up to 1024 GPUs, at a pretraining batch size of 16,384 for 200,000 gradient steps. At the 1.34 to 2.34 USD per hour measured above that is on the order of 67,000 to 117,000 USD of rented compute. The SmolVLA paper puts its project at approximately 30,000 GPU hours over 481 community datasets, 22.9K episodes and 10.6M frames. You inherit all of it for the price of a download; your 8 USD buys the last 20,000 steps. Why VLAs are built this way covers that split.

The arm: a one-time cost that dwarfs the GPU bill

A training run costs less than lunch. The robot does not. That is why the SO-100 matters: it is the cheapest arm the whole imitation learning toolchain actually supports.

ArmServosVoltageParts costSupport on AY-Robots
SO-100Feetech STS3215 bus servos7.4 V110 to 150 EURfull, reference arm
SO-101Feetech STS32157.4 V130 to 170 EURfull
Koch v1.1Dynamixel XL330 / XL4305 V and 12 V rails250 to 350 EURcompatible
LeKiwiFeetech STS3215 arm, wheeled base7.4 V arm, 12 V base400 to 500 EURcompatible

The upstream bill of materials in the SO-ARM100 repository is more granular and worth checking against your region: its Parts For Two Arms list totals 229.88 USD or 226.30 EUR for a leader plus follower setup, and its Parts for One Follower Arm list totals 121.94 USD or 124.30 EUR. Six STS3215 servos at 13.89 USD each are 83.34 of that 121.94, so the servos are the arm. At 1 to 3 USD per SmolVLA or ACT run, one pair of arms is worth between 77 and 230 training runs. If you are still choosing, SO-100 against SO-101 is the comparison that matters, because the two are close enough that the decision is about availability rather than capability.

7.4 V, not 12 V

The STS3215 ships in a 7.4 V and a 12 V variant; the repository notes the 12 V part also needs a 12 V 5 A supply instead of the 5 V one, so the two are not interchangeable. Feeding 12 V into 7.4 V servos destroys them, and six servos are two thirds of a follower arm's parts cost. Check the label on every servo before the first power-up. If servos already behave strangely: servo not responding, arm twitches then sags.

Human hours: the line nobody puts in the spreadsheet

This is the number that turns the cost discussion upside down. Recording demonstrations is a person moving a robot arm, one episode at a time, in real time. There is no batching it and no renting it by the second. The LeRobot dataset recorder ships with defaults that make the arithmetic easy, all three confirmed in DatasetRecordConfig: 60 seconds per episode, 60 seconds to reset the scene, 50 episodes. The money column below assumes 15 USD for an hour of someone's time, which is an assumption rather than a platform number. Substitute your own rate; the ratio is the point.

  1. 1
    Record the dataset with the defaults you will actually be billed for

    This is lerobot 0.6.1, the version on PyPI as of 3 August 2026. Note the CLI shape: recording runs through the lerobot-record console entry point (lerobot.scripts.lerobot_record), not the old python -m lerobot.scripts.record module path. AY-Robots targets 0.5.1, and the 0.5.1 wheel declares the same lerobot-record and lerobot-train entry points, so the shape below is stable across both. The three timing flags are the upstream defaults, so this is also the command the arithmetic in the next table assumes.

    bash
    lerobot-record \
        --robot.type=so100_follower \
        --robot.port=/dev/ttyACM0 \
        --robot.id=my_follower_arm \
        --robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30} }" \
        --teleop.type=so100_leader \
        --teleop.port=/dev/ttyACM1 \
        --teleop.id=my_leader_arm \
        --dataset.repo_id=${HF_USER}/pick-place-cube \
        --dataset.num_episodes=50 \
        --dataset.episode_time_s=60 \
        --dataset.reset_time_s=60 \
        --dataset.single_task="Grab the black cube and put it in the bin"
  2. 2
    Look at what you recorded before you rent a single GPU minute

    Inspecting a dataset costs zero USD per hour. Discovering the same problem from a loss curve costs 2.00 USD per hour on the H100 tier and tells you four hours late. Push the dataset and scrub it in the LeRobot viewer, or browse the AY-Robots dataset directory.

    bash
    # the recorder pushes to the Hub by default; disable with --dataset.push_to_hub=False
    echo https://huggingface.co/datasets/${HF_USER}/pick-place-cube
    
    # then open https://huggingface.co/spaces/lerobot/visualize_dataset
    # and scrub through episodes: are both camera streams alive on every episode?
    # is the gripper actually closing? does the arm sit at a joint limit?
  3. 3
    Train, and make sure the checkpoint outlives the pod

    A rented machine is temporary by definition, so write checkpoints somewhere durable during the run. Two flags decide whether you keep what you paid for. --save_freq defaults to 20,000 steps, so a default 20,000-step SmolVLA run writes its first checkpoint when the run is already over; lower it before you rent anything interruptible. --save_checkpoint_to_hub requires --policy.repo_id and does not exist in lerobot 0.5.1, so on that version you copy the output directory off the machine yourself. The batch size below is the upstream doc's example; the AY-Robots form sends 2 for SmolVLA and writes to object storage as checkpoints appear.

    bash
    lerobot-train \
        --policy.path=lerobot/smolvla_base \
        --dataset.repo_id=${HF_USER}/pick-place-cube \
        --batch_size=64 \
        --steps=20000 \
        --save_freq=2000 \
        --output_dir=outputs/train/my_smolvla \
        --job_name=my_smolvla_training \
        --policy.device=cuda \
        --policy.repo_id=${HF_USER}/my_smolvla \
        --save_checkpoint_to_hub=true
EpisodesRecording at 60 sResetting at 60 sWall clockPlus 20 percent re-recordsAt 15 USD per human hour
30, the SmolVLA minimum30 min30 min1 h 00 min1 h 12 minabout 18 USD
50, the other four minimums50 min50 min1 h 40 min2 h 00 minabout 30 USD
100, a comfortable dataset100 min100 min3 h 20 min4 h 00 minabout 60 USD

Compare the right-hand column with the 1 to 12 USD the run costs. At that assumed rate, a 50-episode dataset costs two to seven times as much to record as it costs to train on, before calibration, camera setup and the episodes you throw away. That is why getting the data right the first time has a direct dollar value. The lerobot guide suggests at least 50 episodes with 10 per object location; the SmolVLA docs report that a 25-episode version of the same task was not enough.

Where the money actually goes missing

1. Runs on data that was never going to work

A 20,000-step GR00T run on a dataset with two swapped camera streams costs the same as one on a clean dataset, takes the same time, and produces a loss curve that looks fine. The failure shows up on the arm, hours later. Training steps are billed by the hour and diagnosis is billed in days. Two symptoms worth memorising: the loss falls but the policy does nothing usually means the observations do not carry what the task needs, and the policy only works in one setup means the dataset had less variation than you thought.

2. Paying foundation-model prices for a fixed-camera task

ACT is roughly 80M parameters and was designed to train from scratch on 50 demonstrations of one task. GR00T N1.7 is roughly 3B with a pretrained backbone. For a bolted-down camera, a fixed table and one object, the 80M model frequently gets there, runs at about 20 ms per action step instead of 152 ms, and costs 1 to 3 USD per run instead of 4 to 12. Spend 3 USD finding out whether the cheap model works before spending 12 USD on the expensive one. ACT against SmolVLA and GR00T N1.7 against Pi0.5 show where each stops being the right answer; the model arena has 85 models and 332 benchmark results.

3. The GPU you forgot about

The cheapest mistake to prevent and the most common one to make. An instance started on a Friday to debug something bills through the weekend at the same rate as a real run.

CardMedian rate in the snapshotIdle for 24 hIdle for 7 daysThat is worth
RTX 40900.32 USD/h7.68 USD53.76 USDabout 27 SmolVLA or ACT runs at 2 USD
A100 80 GB0.56 USD/h13.44 USD94.08 USDabout 12 GR00T runs at 8 USD
H100 80 GB1.80 USD/h43.20 USD302.40 USDabout 38 GR00T runs at 8 USD

On AY-Robots this failure is designed out for inference: pods provisioned by the inference API carry an idle watchdog and destroy themselves after an idle period. If you rent the card yourself, that watchdog is your calendar reminder.

4. Paying twice for the same answer

GR00T's fine-tuning entry point is a tyro CLI that exposes no seed. That is not a platform limitation, it is the upstream tool: there is no seed field in gr00t/configs/finetune_config.py, and the repository's own training tips warn that runs vary by 5 to 6 percent because the image augmentations are non-deterministic. lerobot defaults to seed 1000 in both 0.5.1 and 0.6.1, so ACT, SmolVLA and Pi0.5 runs can at least be rerun from the same initialization and data order. That is not a promise of bit-identical weights on a GPU, but it is the difference between a rerun and a new experiment. If a GR00T run produces a policy that works and you did not keep the checkpoint, you pay full price for a result that may differ by more than the difference you were chasing. There is a second way to lose a checkpoint you paid for: the CLI defaults to --save-total-limit 5, documented as the maximum number of checkpoints kept before older ones are deleted. Storage is cents; a rerun is 4 to 12 USD and six hours.

Interruptible capacity is half price and will kill your run

The bid floors above are a fraction of the on-demand rate, and vast.ai says the bidding system can cut client costs by fifty percent or more. The catch, in its own words: an interruptible instance can be paused at any time if another user bids higher or an on-demand rental is created for the same resources, and that pause "stops all processes that are running". On-demand always takes precedence. Fine for a run that writes a checkpoint every few hundred steps, a total loss for one that writes at the end, which is exactly what the defaults give you: the Isaac-GR00T CLI writes every --save-steps (default 1000), but lerobot's --save_freq defaults to 20,000 steps, so a default SmolVLA run checkpoints once, at the finish line. Lower it, or do not bid. The AY-Robots training form exposes the GR00T knob as saveSteps.

Renting the card yourself
Advantages
  • The lowest hourly rate there is.
  • Full control of the image, CUDA version, lerobot or Isaac-GR00T revision and every flag.
  • Interruptible bidding halves the rate if your run checkpoints often enough to survive a pause.
  • Nothing is abstracted away, so when a run behaves oddly you can see why.
Trade-offs
  • Setup bills at GPU rates: drivers, dependencies, the multi-gigabyte base checkpoint and the dataset download all cost the same per hour as training.
  • An outbid interruptible instance is paused and its processes killed. An unsaved run is money burned, and the lerobot default writes its first checkpoint at step 20,000.
  • Nothing destroys the pod for you. The idle table above is the bill for forgetting.
  • Supply for single full 80 GB cards is thin: two A100 80 GB and five H100 80 GB full-card offers in this read. The listing also churns, so the cheapest listed price and the price you can actually rent are not the same number.
  • Every hour on infrastructure is an hour not spent recording the episodes that decide whether the policy works.

Doing it yourself versus letting the platform rent the card

You pick the machine, build the environment and destroy the pod. The hourly rate is the market rate above; everything else is your time.

  1. Find a card matching the VRAM the model needs: 24 GB for ACT and SmolVLA, 80 GB for GR00T and Pi0.5.
  2. Rent on demand if the run cannot survive a pause, interruptible if it checkpoints often.
  3. Install the toolchain: lerobot for ACT, SmolVLA and Pi0.5, the Isaac-GR00T repository with its own tyro launcher for GR00T.
  4. Convert the dataset if needed. A LeRobot v3.0 dataset crashes the GR00T loader and must be converted down to v2.1.
  5. Launch, watch the loss, push checkpoints somewhere durable as they are written.
  6. Destroy the instance, then check that you destroyed it.
bash
# GR00T N1.7, single GPU, Isaac-GR00T as of August 2026.
# Note the entry point: gr00t/experiment/launch_finetune.py, a tyro CLI.
# scripts/gr00t_finetune.py does not exist in this repository; tutorials that
# still reference it are stale. The per-embodiment walkthrough is
# getting_started/finetune_new_embodiment.md.
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 ./so100-checkpoints \
    --max-steps 20000 \
    --global-batch-size 32 \
    --dataloader-num-workers 4

# v3.0 dataset? Convert it down first or the loader will crash. The helper
# has its own pyproject and must be installed in its own environment:
cd scripts/lerobot_conversion
uv venv && source .venv/bin/activate
uv pip install -e .
python convert_v3_to_v2.py --repo-id <DATASET_REPO_ID>
The current Isaac-GR00T fine-tune entry point, matching the command in the repository README. This CLI has no seed flag, so GR00T runs are not bit-for-bit reproducible.

Realistic cost for one GR00T run: 3 to 6 hours on an H100 80 GB at 1.34 to 2.34 USD per hour is 4 to 14 USD, plus 20 to 40 minutes of setup that also bills, plus your own time.

What the platform charges and how it picks the card

The logic is deliberately boring. Every model in the catalog declares a GPU tier; the backend takes the required VRAM and rents a matching card on the same spot market measured above. That is why the quoted cost is a range, not a price. GR00T and Pi0.5 are cloud-only here because of the 40 GB and 70 GB floors. SmolVLA and ACT also run locally on your own 24 GB card, where the cloud cost is zero and the electricity is your problem.

The AY-Robots pricing page showing what a training run and platform access cost
The pricing page. Per-run figures track the spot market rather than a fixed list price.

One knob deserves a warning. Gradient accumulation genuinely applies for both GR00T variants, so raising it buys a larger effective batch on the same card. For Pi0.5 and SmolVLA it does not apply at all: lerobot 0.5.1 has no gradient-accumulation option in its training config, so setting the field to 16 costs nothing and buys nothing. If a queued job never starts, the stuck-in-queue page covers what to check; if the dataset is rejected before the run begins, it is almost always the v3.0 format problem.

The limit this platform does not solve: latency

A rented GPU serving your policy over the public internet adds round trips to a control loop that is already 20 to 485 ms per action step. Fine for slow pick-and-place, not for fast reactive motion. Cloud inference evaluates a checkpoint well and runs production manipulation badly: if the task needs speed the compute has to sit next to the servos, and that is a cost this article cannot make disappear. See inference latency.

A worked budget for a first working policy

All four lines together, starting from nothing. The GPU total assumes 3 to 5 runs: the first proves the pipeline works, the second exposes a data problem, the third or fourth is the one you keep.

LineLean pathComfortable path
ArmSO-100 follower only, 121.94 USD in the BOMleader plus follower, 229.88 USD in the BOM
ModelSmolVLA or ACT, 24 GB tierGR00T N1.7, A100 80 GB or H100 tier
Episodes recorded30, the SmolVLA minimum50 to 100
Human time to recordabout 1 h 12 min2 to 4 hours
Cost of one run1 to 3 USD4 to 12 USD
Runs before it works3 to 53 to 5
Total GPU spend3 to 15 USD12 to 60 USD
Largest line on the billthe arm, then your timethe arm, then your time

The pattern holds at this size of robot: compute is a rounding error, hardware is a real one-time cost, human hours are the recurring expense. To test the training half before buying anything, the no-hardware entry points let you compare models and rent a GPU without an arm, and the live arm is a physical SO-100 you can drive in the browser with no signup. For the whole pipeline end to end, the complete SO-100 guide covers setup, teleoperation and training, and train your first policy is the short version.

The AY-Robots training matrix with five policies as rows and four robot arms as columns, every cell linking to a specific training guide
The /train matrix: row for your budget, column for your arm, cell for the guide with that pairing's defaults and cost.
What does one VLA fine-tuning run cost end to end?

About 4 to 12 USD for GR00T N1.7, GR00T N1.5 or Pi0.5 on the A100 80 GB or H100 tier (3 to 6 hours at 1.20 to 2.00 USD per hour), and about 1 to 3 USD for SmolVLA or ACT on the RTX 4090 tier (2 to 5 hours at 0.30 to 0.60 USD per hour). Renting the card yourself lands in the same range once setup time is counted, since it bills at the training rate.

Is an H100 worth paying for over an A100 80 GB?

For a single SO-100 policy, usually not. Both clear the memory floor GR00T and Pi0.5 need, and in the 23 August 2026 read a full A100 80 GB started at 0.44 USD per hour against 1.34 for an H100 80 GB. The H100 finishes sooner, so part of the rate comes back as fewer hours, but the total is still higher for a run this small. The real argument for the H100 is availability: five single H100 80 GB offers on that market against two A100 80 GB, and a card you cannot rent has no price.

How many runs does it take before a policy actually works?

Plan for three to five. The first proves the pipeline is wired correctly. The second commonly exposes a dataset problem such as a camera stream that died partway through. The third or fourth is the one you keep.

Can I train SmolVLA or ACT on my own GPU instead of renting?

Yes. Both are supported locally on AY-Robots and both fit comfortably in 24 GB; the original ACT paper trained its 80M model in about 5 hours on an 11 GB RTX 2080 Ti. GR00T and Pi0.5 are cloud-only here because the vendors' documented fine-tuning floors are 40 GB and 70 GB, and the largest consumer card on the market is the 32 GB RTX 5090.

Why does the same number of steps cost different amounts across models?

Steps are not comparable across policies. ACT defaults to 100,000 steps at batch 8 on a 24 GB card; GR00T N1.5 defaults to 2,000 steps at batch 1 with gradient accumulation 16 on an 80 GB card. The bill is hours multiplied by the rate of the card the memory footprint forces you onto, not the step counter.

See what your run would cost before you start it

Each of the five policies lists its GPU tier, run time and price per run, and the training backend rents the card on the same spot market these numbers were measured on.

Check the pricing

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started