- Trainer key
- act
- The value the training API expects
- Vendor
- Stanford (ALOHA)
- Action Chunking Transformer, trained from scratch
- Parameters
- about 80 million
- GPU tier
- RTX 4090 or any card with 24 GB
- 24 GB class
- Inference
- 20 ms per action step
- Measured in the training pool, not on your laptop
- Default schedule
- 100,000 steps
- Batch 8, gradient accumulation 1, learning rate 1e-5
- Minimum episodes
- 50 episodes
- Below this, results are usually not worth evaluating
- Dataset format
- LeRobot v2.1
ACT, the Action Chunking Transformer from the Stanford ALOHA project, is an 80 million parameter policy trained from scratch on your own demonstrations. It predicts a chunk of future actions from one observation (lerobot default: chunkSize 100, nActionSteps 100) and runs at about 20 ms per action step, an order of magnitude faster than the vision-language models here. It has no pretraining and no language conditioning, so it does one task very well and nothing else at all.
What ACT is, in one paragraph
ACT is a transformer of about 80 million parameters that maps camera frames and joint states onto sequences of joint commands. It came out of the Stanford ALOHA work and it is the smallest model this platform trains. Unlike the other four it starts from random weights: no foundation model underneath, no corpus of other people’s robots, no text encoder. Everything it knows arrived in your dataset, and a model with nothing to unlearn has nothing to fight.
Action chunking, explained properly
A plain behavior-cloning policy works one frame at a time: look, predict one action, execute, look again. The problem is compounding error. Each slightly wrong action puts the arm in a state a little further from the training data, where the next prediction is worse, and the drift accelerates. Halfway through an episode the policy is reasoning about a situation it has never seen, and it put itself there.
ACT changes the unit of prediction. From one observation it emits a whole chunk of future actions, a fixed-length sequence covering the next chunkSize timesteps. The runtime executes the first nActionSteps of that chunk, then takes a fresh observation and predicts again.
# What the runtime does with an ACT checkpoint, in pseudocode.
while not done:
obs = read_cameras_and_joints() # one observation
chunk = policy(obs) # chunk_size actions, predicted jointly
for action in chunk[:n_action_steps]:
send_to_arm(action) # executed open loop, no new observationTwo separate things follow, and they get conflated constantly. Decision points per episode drop by a factor of nActionSteps, so there are fewer chances to drift and less time for an error to feed on itself. And the actions inside a chunk were generated together rather than independently, so they form one coherent trajectory. That is what produces smoothness: not filtering after the fact, but a model committing to a path instead of averaging possibilities at every frame.
While the runtime plays back a chunk it is not looking at the cameras. With both values at 100 and a 30 Hz control loop, that is over three seconds of open-loop motion, and if the object shifts during them ACT does not notice until the chunk ends. This is the honest cost of chunking, and why nActionSteps exists as a separate number.
chunkSize and nActionSteps
ACT is the only model whose training form exposes these two knobs, and the lerobot default is 100 for both. The hard constraint is that nActionSteps must be less than or equal to chunkSize: the runtime cannot execute more actions than the model predicts. They are not symmetric. chunkSize is architectural and baked in at training time, so raising it later means training again. nActionSteps only governs how much of each prediction gets used.
| Setting | Behavior on the arm | Use when |
|---|---|---|
| chunkSize 100, nActionSteps 100 | One inference per 100 executed actions | Static scene, repetitive task, the case ACT was designed for |
| chunkSize 100, nActionSteps 20 | Plans 100 ahead, replans five times as often, discards the tail | The scene can shift mid-episode, or accuracy decays late in a chunk |
| chunkSize 50, nActionSteps 50 | Shorter plans, shorter horizon | Short tasks where 100 steps outlast the whole episode |
| nActionSteps above chunkSize | Invalid configuration | Never |
Replanning often is nearly free: an inference costs about 20 ms while the arm runs at tens of hertz. The real cost is at the seams, because a fresh chunk need not continue the previous one smoothly, so every boundary can kink the trajectory. Long execution windows give smooth motion and slow reactions, short ones the reverse.
Configure a run
- 1Confirm the dataset is one task
Check the task strings. If two tasks are mixed in, split the dataset first: ACT cannot tell them apart and will average them.
- 2Pick ACT in the training form
Open Training, select the dataset, choose ACT. Batch size 8, learning rate 1e-5 and 100,000 steps are prefilled, with no gradient accumulation because at this size there is no need for it.
textTraining form, ACT on an SO-100 dataset Model ACT Batch size 8 default Learning rate 1e-5 default Steps 100000 default Chunk size 100 lerobot default, what the model predicts Action steps 100 lerobot default, must be <= chunk size Seed 1000 set it so the run is reproducible - 3Leave chunkSize at 100 unless episodes are short
If a typical episode is shorter than the chunk, the model spends capacity predicting past the end of the task. That is the one case for lowering it before a first run.
- 4Start it and let it finish
Do not kill a run at 30,000 steps because the loss looks flat. A from-scratch model at 1e-5 spends a long time looking unimpressive.
- 5Compare checkpoints on the arm
Keep two or three from the second half of the run and evaluate each physically. The final one is not automatically the best, and the loss gap will not tell you which is.
From scratch, and what that costs you
- One policy per task. There is no task string to switch behavior with, so a second task means a second dataset and a second checkpoint.
- No generalization past your demonstrations. Move a camera, change the lighting, swap in a differently colored cube, and performance drops with no prior to cushion it.
- It wants more of your data than SmolVLA does, about 50 episodes as a working minimum, because nothing else carries the load.
- Whatever it does is what you showed it. Two approach strategies produce a policy that averages them into one that suits neither.
The flip side is diagnostic clarity. When an ACT policy fails, the cause is in your dataset or your setup, never in an interaction with pretraining you cannot inspect. That is why /learn/train-your-first-policy points beginners at ACT before anything larger.
With no language input, ACT has to infer which task you want from the image alone, and at the start of an episode two tabletop tasks often look nearly identical. It will pick, it will pick badly, and the failure looks like general incompetence rather than the labeling problem it is.
Why 100,000 steps, and why that is still cheap
The default schedule is 100,000 steps at batch size 8 with no accumulation, so 800,000 sample presentations. Next to GR00T N1.7 finishing at 20,000 that looks alarming, but it is the wrong comparison: those 20,000 steps adjust a pretrained network, these 100,000 build one. Cutting the schedule short is how people talk themselves into a policy that almost works.
| ACT | SmolVLA | GR00T N1.7 | |
|---|---|---|---|
| Default steps | 100000 | 20000 | 20000 |
| Batch and accumulation | 8 and 1 | 2 and 8 | 32 and 1 |
| Learning rate | 1e-5 | 1e-4 | 1e-4 |
| GPU tier | 24 GB | 24 GB | 80 GB |
| Trained from | random weights | pretrained checkpoint | pretrained checkpoint |
The step count is not the price. A 24 GB card rents for 0.30 to 0.60 USD per hour, a typical run takes 2 to 5 hours, and the whole thing lands around 1 to 3 USD. The learning rate of 1e-5 is low because the schedule is long: small, patient updates across many steps rather than large ones across few.
Twenty milliseconds, and what it unlocks
About 20 ms per action step puts ACT roughly an order of magnitude below every vision-language model here. At a 30 Hz control loop the budget per step is about 33 ms, so ACT fits inside it with room left. The arm moves continuously instead of pausing to think, which changes which tasks are feasible at all.
| Model | Inference per action step | What it looks like on the arm |
|---|---|---|
| ACT | about 20 ms | Continuous motion, no visible decision pauses |
| GR00T N1.7 | about 152 ms | Fluent, with a perceptible rhythm at decision points |
| SmolVLA | about 245 ms | Deliberate, visibly stepped |
| Pi0.5 | about 485 ms | Hesitation between steps, noticeable on fast motions |
Latency and chunking compound usefully. Because inference is cheap you can lower nActionSteps for reactivity without the arm stalling at chunk boundaries, a trade the slower models cannot make: a 485 ms model replanning every few steps would spend most of its time thinking. ACT is also not cloud-only, and an 80 million parameter checkpoint does not need a special machine to run it.
When ACT wins, and when it is the wrong tool
| Reach for ACT | Reach for a foundation model |
|---|---|
| One task, one scene, repeated many times | Several tasks served by one checkpoint |
| Speed matters and the motion must look fluid | Scene variation you never demonstrated |
| 50 or more consistent episodes of exactly this task | The highest achievable success rate, with episodes to pay for it |
| A result today for a couple of dollars | Language conditioning, so SmolVLA or GR00T N1.7 |
| A repetitive cell running the same motion for weeks | Contact-rich precision, where Pi0.5 is the specialist |
The honest failure mode is that ACT does not degrade gracefully. A vision-language model handed a slightly unfamiliar scene often does something approximately sensible, because its pretraining has seen many scenes. ACT does something arbitrary. On a fixed workstation you control that is a non-issue. If your scene varies in ways you cannot enumerate, take the pretraining and accept the latency.
Plenty of projects that end on a VLA should still begin with an ACT run, because it is the fastest proof that the arm, the cameras, the dataset and the evaluation loop work together. The dataset transfers unchanged. Only the model choice changes.
Where to go next
- /train/act-on-so-100 for the full run on an SO-100, chunk settings in context
- /compare/act-vs-smolvla is the specialist against the generalist
- /compare/groot-n1-7-vs-smolvla before you conclude that bigger is the answer
- /learn/train-your-first-policy for loss curves and checkpoint selection
- /live gives you a real SO-100 to drive in the browser, no signup
- /download has the desktop client with the driver built in
What should I set nActionSteps to if I do not want to think about it?▾
Leave both at 100, the lerobot default and the configuration ACT is most often used in. Lower it only for a named symptom: the object moves during the episode, or the arm is accurate early in a chunk and drifts by the end.
Does the task string do anything for ACT?▾
It is recorded and stored with the episode, but ACT does not read it. The string matters for SmolVLA and the other vision-language models, so keep it clean in case you train one of those on the same dataset later.
Why is the learning rate lower than SmolVLA’s?▾
ACT defaults to 1e-5 against SmolVLA’s 1e-4 because it trains from scratch over a much longer schedule. Small updates across 100,000 steps suit a network building its representations. A fine-tune wants larger updates over a short run.
Can I run an ACT policy on a laptop?▾
Yes. About 80 million parameters at roughly 20 ms per action step, and it is not cloud-only, so the desktop client runs the checkpoint locally. Training is the part that goes to a rented GPU.
Should my very first run be ACT or SmolVLA?▾
ACT if you want a working single-task result quickly in a fixed scene. SmolVLA if you want language conditioning, or if you are heading for a vision-language model and want the first run to double as a check on your data.
Undecided? The comparison table puts all five side by side.