
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.
| Line | What it is | Typical size for one working policy |
|---|---|---|
| GPU time | renting a card for the run | 1 to 12 USD per run, and you will do 3 to 5 |
| The robot | servos, printed frame, cameras, cables, power | one time, 110 to 500 EUR by arm |
| Human hours | a person driving the arm to record demos | 1 to 4 hours per dataset, repeated per task |
| Waste | bad data, oversized models, forgotten pods | unbounded, 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.
| Card | vast.ai on demand USD/h (low / median / high) | Full-card offers | vast.ai bid floor | RunPod Community / Secure | Hugging Face |
|---|---|---|---|---|---|
| RTX 4090, 24 GB | 0.13 / 0.32 / 0.38 | 24 | 0.11 | 0.34 / 0.74 | not offered |
| RTX 5090, 32 GB | 0.34 / 0.40 / 0.47 | 29 | 0.19 | 0.69 / 0.99 | not offered |
| A100 80 GB, PCIe or SXM4 | 0.44 / 0.56 / 0.67 | 2 | 0.13 | 1.19 PCIe, 1.39 SXM / 1.39, 1.59 | 2.50 as a Space |
| H100 80 GB, SXM or PCIe | 1.34 / 1.80 / 2.34 | 5 | 0.44 | 1.99 PCIe, 2.69 SXM / 2.89, 3.29 | 4.50 as an endpoint |
| H100 NVL, 94 GB | 1.47 / 1.47 / 2.64 | 4 | 0.40 | 2.59 / 3.19 | not offered |
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.
# 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
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.
| Job | Memory the upstream project asks for | Source |
|---|---|---|
| pi0 / pi0.5 inference | more than 8 GB, example RTX 4090 | openpi |
| pi0 / pi0.5 LoRA fine-tune | more than 22.5 GB, example RTX 4090 | openpi |
| pi0 / pi0.5 full fine-tune | more than 70 GB, example A100 80 GB or H100 | openpi |
| GR00T N1.7 inference | 1 GPU with 16 GB or more | Isaac-GR00T |
| GR00T N1.7 fine-tune | 40 GB or more recommended, H100 or L40 nodes | Isaac-GR00T |
| GR00T fine-tune, what it trains | projector and diffusion head; LLM and visual encoder frozen by default | finetune_config.py |
| GR00T post-training, reduced | 1 GPU with 24 GB, language model frozen | Isaac Lab Arena |
| SmolVLA fine-tune | single A100 for the reference 20,000-step run | lerobot docs |
| ACT training | a single 11 GB RTX 2080 Ti | ACT 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.
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.
| Policy | GPU tier | Default max steps | Default batch (grad accum) | Run window | Cost per run |
|---|---|---|---|---|---|
| GR00T N1.7, ~3B | A100 80 GB or H100 | 20,000 | 32, accum 1, applies | 3 to 6 h | 4 to 12 USD |
| GR00T N1.5, ~3B | A100 80 GB or H100 | 2,000 | 1, accum 16, applies | 3 to 6 h | 4 to 12 USD |
| Pi0.5, ~3B | A100 80 GB or H100 | 30,000 | 1, accum 16, no effect | 3 to 6 h | 4 to 12 USD |
| SmolVLA, ~450M | RTX 4090 or any 24 GB | 20,000 | 2, accum 8, no effect | 2 to 5 h | 1 to 3 USD |
| ACT, ~80M | RTX 4090 or any 24 GB | 100,000 | 8, accum 1 | 2 to 5 h | 1 to 3 USD |

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.
| Arm | Servos | Voltage | Parts cost | Support on AY-Robots |
|---|---|---|---|---|
| SO-100 | Feetech STS3215 bus servos | 7.4 V | 110 to 150 EUR | full, reference arm |
| SO-101 | Feetech STS3215 | 7.4 V | 130 to 170 EUR | full |
| Koch v1.1 | Dynamixel XL330 / XL430 | 5 V and 12 V rails | 250 to 350 EUR | compatible |
| LeKiwi | Feetech STS3215 arm, wheeled base | 7.4 V arm, 12 V base | 400 to 500 EUR | compatible |
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.
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.
- 1Record 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-recordconsole entry point (lerobot.scripts.lerobot_record), not the oldpython -m lerobot.scripts.recordmodule path. AY-Robots targets 0.5.1, and the 0.5.1 wheel declares the samelerobot-recordandlerobot-trainentry 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.bashlerobot-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" - 2Look 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? - 3Train, 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_freqdefaults 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_hubrequires--policy.repo_idand 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.bashlerobot-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
| Episodes | Recording at 60 s | Resetting at 60 s | Wall clock | Plus 20 percent re-records | At 15 USD per human hour |
|---|---|---|---|---|---|
| 30, the SmolVLA minimum | 30 min | 30 min | 1 h 00 min | 1 h 12 min | about 18 USD |
| 50, the other four minimums | 50 min | 50 min | 1 h 40 min | 2 h 00 min | about 30 USD |
| 100, a comfortable dataset | 100 min | 100 min | 3 h 20 min | 4 h 00 min | about 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.
| Card | Median rate in the snapshot | Idle for 24 h | Idle for 7 days | That is worth |
|---|---|---|---|---|
| RTX 4090 | 0.32 USD/h | 7.68 USD | 53.76 USD | about 27 SmolVLA or ACT runs at 2 USD |
| A100 80 GB | 0.56 USD/h | 13.44 USD | 94.08 USD | about 12 GR00T runs at 8 USD |
| H100 80 GB | 1.80 USD/h | 43.20 USD | 302.40 USD | about 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.
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.
- 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.
- 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.
- Find a card matching the VRAM the model needs: 24 GB for ACT and SmolVLA, 80 GB for GR00T and Pi0.5.
- Rent on demand if the run cannot survive a pause, interruptible if it checkpoints often.
- Install the toolchain: lerobot for ACT, SmolVLA and Pi0.5, the Isaac-GR00T repository with its own tyro launcher for GR00T.
- Convert the dataset if needed. A LeRobot v3.0 dataset crashes the GR00T loader and must be converted down to v2.1.
- Launch, watch the loss, push checkpoints somewhere durable as they are written.
- Destroy the instance, then check that you destroyed it.
# 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>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.
You pick the model, the dataset and the hyperparameters in a form. The backend rents a spot GPU sized by the VRAM the model needs, runs the trainer and writes checkpoints to object storage.
- Pick your combination on the training matrix: five models, four arms, one guide per cell.
- Point it at a dataset: one recorded with the desktop client, a Hugging Face repo id, or one from your own machine.
- Accept the defaults or adjust them. The table above is what actually gets sent to the trainer.
- The backend picks the card by required VRAM, so you never shop for GPUs.
- Checkpoints land in object storage as they are written, so an interrupted run is not a lost run.
| Tier | Models | Run time | Cost per run |
|---|---|---|---|
| A100 80 GB or H100 | GR00T N1.7, GR00T N1.5, Pi0.5 | 3 to 6 hours | about 4 to 12 USD |
| RTX 4090 or any 24 GB card | SmolVLA, ACT | 2 to 5 hours | about 1 to 3 USD |
What it does not do: make a bad dataset good, give GR00T a seed it never had, or remove the latency limit described below. It removes the GPU shopping, the environment build and the pod you forgot to destroy. The mechanics are in the training docs.
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.

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.
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.
| Line | Lean path | Comfortable path |
|---|---|---|
| Arm | SO-100 follower only, 121.94 USD in the BOM | leader plus follower, 229.88 USD in the BOM |
| Model | SmolVLA or ACT, 24 GB tier | GR00T N1.7, A100 80 GB or H100 tier |
| Episodes recorded | 30, the SmolVLA minimum | 50 to 100 |
| Human time to record | about 1 h 12 min | 2 to 4 hours |
| Cost of one run | 1 to 3 USD | 4 to 12 USD |
| Runs before it works | 3 to 5 | 3 to 5 |
| Total GPU spend | 3 to 15 USD | 12 to 60 USD |
| Largest line on the bill | the arm, then your time | the 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.

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 pricingSources
- SmolVLA: A Vision-Language-Action Model for Affordable and Efficient Robotics
- GR00T N1: An Open Foundation Model for Generalist Humanoid Robots
- Learning Fine-Grained Bimanual Manipulation with Low-Cost Hardware (ACT / ALOHA)
- pi-0.5: a Vision-Language-Action Model with Open-World Generalization
- NVIDIA Isaac-GR00T: hardware requirements, launch_finetune.py and finetune_config.py defaults
- huggingface/lerobot: CLI entry points, policies and LeRobotDataset v3
- Physical Intelligence openpi: GPU memory requirements for pi0 and pi0.5
- SO-ARM100 / SO-101 bill of materials and STS3215 voltage variants
- LeRobot docs: fine-tuning SmolVLA, 20k steps in about 4 hours on one A100
- LeRobot docs: lerobot-record defaults, episode and reset times, dataset advice
- RunPod GPU pricing: Community Cloud and Secure Cloud hourly rates per card
- Vast.ai: on-demand versus interruptible rentals, bidding and what a pause does to your processes
- Hugging Face pricing: Spaces hardware hourly rates, A100 80 GB at 2.50 USD/h
- Isaac Lab Arena: GR00T N1.6 post-training hardware options and wall-clock reference figures
- lerobot on PyPI, version 0.6.1 released 3 August 2026
Ready for high-quality robotics data?
AY-Robots connects your robots to skilled operators worldwide.
Get Started