ACT · right-arm cup grasp run act_20260820-0429 Jetson Orin Nano Super read 2026-08-21

Did ACT Converge?

Short answer: no — but nothing went wrong. The run completed all 20,000 steps with a clean, monotone curve and finished at loss 0.138. It was still improving when the step budget ran out. Here is the evidence, and the two things this curve cannot tell you.

!

Healthy training, cut short — and no validation was run

Over the last 5,000 steps the mean loss still fell 13.2%. A converged run is flat there. Separately, eval_freq was None, so every number on this page is training loss: it measures fit to the recorded demonstrations, not whether the policy generalises. 0.138 is not evidence that the policy learned the task.

Final loss
0.138
from 11.630 at step 100 — a 98.8% fall
Last 5k steps
−13.2%
still falling
Epochs trained
2.06
batch 2 × 20k steps ÷ 19,453 frames
Validation
None
no eval ran

01 — The curve

Loss over 20,000 steps

Log scale, because the run spans two orders of magnitude. Monotone, no divergence, no oscillation. The ten ticks under the axis are the checkpoint saves — filled where the weights still exist, hollow where they were deleted.

Total loss 200 points · logged every 100 steps · log₁₀ y-axis

02 — The convergence test

The last 5,000 steps, on a linear scale

Log scale flatters the tail of every loss curve. Zoomed in and linear, the trend is still clearly downward — the dashed line is a least-squares fit over these 50 points, sloping −0.0094 per 1,000 steps. That is what "cut short" looks like.

Loss, steps 15,100 → 20,000 mean 0.1750 → 0.1519 · −13.2% · σ 0.0140

03 — Components

What the total loss is made of

ACT's loss is L1 action error plus a KL term. L1 is the one that matters for behaviour; it is also still descending. KLD collapsed to 0.004 despite kl_weight = 10.0, which means the CVAE latent is effectively unused.

L1 action error
KL divergence
Gradient norm

04 — Checkpoints

Ten were saved. Two survive.

save_freq = 2000 wrote a checkpoint every 2,000 steps and all ten completed. Eight were then deleted from the Jetson under disk pressure and had never been uploaded. The two that survive do so because someone pushed them to the Hub.

StepLossL1KLD Grad normEpochWeightsWhere

The plan had been to test 8k / 12k / 16k / 20k on hardware. Those four are gone. What remains — 4,000 vs 20,000 — is still a usable contrast: step 4,000 is visibly undertrained (loss 1.178, 0.41 epochs). If both behave the same on the real arm, the bottleneck is not training length.

05 — Read before comparing

No validation split

eval_freq = None. Nothing here measures overfitting. The only generalisation evidence in the project comes from the sibling SmolVLA run, which was held out a cup position: unseen 0.2300 vs trained 0.2348, a ratio of 0.98×. That is still offline replay of recorded observations, not a closed-loop rollout.

2.06 epochs is very few

Effective batch size was 2 on 8 GB of unified memory. 20,000 steps moved 40,000 samples through a 19,453-frame dataset. ACT is normally trained far longer; the curve's shape is consistent with a run that stopped early rather than one that finished.

The latent collapsed

KLD fell from 1.122 to 0.004 against kl_weight = 10.0. The model has degenerated to deterministic chunk regression. Not unusual for ACT on a small single-task set, but do not treat the latent as carrying anything.

Never run on the robot

As of 2026-08-21 neither checkpoint has driven the physical arm. The policy-to-motor path goes through the safety wrapper first: NaN/inf rejection, per-joint absolute and per-step clamps, Cartesian envelope rejection, base zeroing, head lock.