act-so101-pickplace-dr2 β€” targeted-coverage retrain (a coverage whack-a-mole result)

ACT (~52M) trained from scratch on so101-sim-pickplace-dr2 β€” 210 domain-randomized SO-ARM100 pick-and-place demonstrations of which ~30% deliberately oversample a small near-field spawn band (r∈[0.19,0.23], θ∈[βˆ’14Β°,+2Β°]) covering the pocket where the previous best policy, ACT-DR, put all 5 of its 50-episode-eval failures (spawn r β‰ˆ 0.19–0.21 m). Same recipe otherwise (chunk 45, n_action_steps 15, batch 8; 75k steps to approximately match epochs on the larger set, ~25.7 vs ~28.7). The hypothesis was β‰₯95% nominal. The result is a documented negative: the targeted data closed the measured hole everywhere we probed β€” and opened a new one.

Results

50 evaluation episodes, fixed eval seed (identical spawn sequence for both models):

50-ep nominal failures (episode #)
ACT-DR 45/50 (90%) {1, 10, 22, 25, 26} β€” all near-field, spawn rβ‰ˆ0.19–0.21
ACT-dr2 (this model) 44/50 (88%) {3, 6, 8, 26, 43, 44} β€” five far-field, spawn rβ‰ˆ0.256–0.266, plus shared ep 26

The two failure sets share only episode 26. dr2 fixed 4 of ACT-DR's 5 failures and introduced 5 new ones β€” a coverage swap, confirmed on fixed spawn grids (scripts/probe_spawns.py):

12-spawn fixed grid ACT-DR ACT-dr2
old pocket (r 0.200–0.212, ΞΈ βˆ’10Β°β€¦βˆ’3Β°) 5/12 12/12
far field (r 0.250–0.268, ΞΈ βˆ’9Β°β€¦βˆ’1Β°) 12/12 4/12 (0/8 at r β‰₯ 0.259)

Robustness sweep (15 eps/level, same seed across levels):

nominal + visual DR + physics DR + full DR
ACT-DR 87% 87% 87% 100%
ACT-dr2 80% 87% 73% 93%

Temporal ensembling (inference-only, coeff 0.01, 20 eps): 18/20 (90%) β€” comparable to ACT-DR's 18/20 under the same protocol.

What this negative result teaches

  • Oversampling a failure pocket inside a fixed step budget appears to reallocate precision rather than add it. Under an equal-weight L1 loss, ~30% of gradient mass now serves a narrow near-field band; per-epoch relative exposure to the rest of the workspace drops correspondingly, and the policy regressed exactly where demands are highest β€” near maximum reach (r β‰₯ 0.259 m, with the spawn range capped at 0.27 m). ACT-DR, trained on the uniform 150-episode set, is 12/12 there. (Caveat: dr2 also differs in episode count and steps; the isolating control is below.)
  • Point evals hide this. Nominal success barely moved (90% β†’ 88%, well within noise at n=50). Only the per-episode failure comparison and the fixed spawn grids exposed that the model is different, not merely equal.
  • The residual shared failure (episode 26, the nearest-to-base spawn) resists both data distributions.

Follow-ups this predicts: append pocket episodes to the full uniform set at a lower mixing fraction (e.g. 10–15%), or reweight per-sample loss instead of resampling β€” either preserves far-field exposure while still covering the pocket. The cleanest attribution experiment is an untargeted 210-episode control retrain at 75k steps, which isolates the reweighting effect from the episode-count/step changes.

Training

  • LeRobot 0.6.0 lerobot-train, single Kaggle T4, AMP β€” 75k steps (~25.7 epochs of 210 episodes; ACT-DR: 60k steps β‰ˆ 28.7 epochs of 150)
  • --policy.type=act --policy.chunk_size=45 --policy.n_action_steps=15 --batch_size=8

Use

from lerobot.policies import make_pre_post_processors
from lerobot.policies.act.modeling_act import ACTPolicy

repo = "ahmedsohail2003/act-so101-pickplace-dr2"
policy = ACTPolicy.from_pretrained(repo).to("cuda").eval()
pre, post = make_pre_post_processors(
    policy_cfg=policy.config, pretrained_path=repo,
    preprocessor_overrides={"device_processor": {"device": "cuda"}},
)
# batch: observation.state (1,6) + observation.images.front / .wrist (1,3,224,224) in [0,1]
action = post(policy.select_action(pre(batch)))

The Sim2Cell ACT family

Model Data Nominal Robustness (n/v/p/f)
act v1 (local) 100 nominal eps 65% (20 eps) 60/60/53/40
-v2 160 eps + recovery demos 50% (20 eps) 47/33/40/33
-dr 150 DR eps 90% (50 eps) 87/87/87/100
-dr2 (this) 210 DR eps, 30% pocket 88% (50 eps) 80/87/73/93

Full study in the Part A README.

Provenance

Data recorded by a scripted expert (success-filtered) in the author's MuJoCo work-cell; robot model from MuJoCo Menagerie (trs_so_arm100, Apache-2.0).

Downloads last month
-
Safetensors
Model size
51.6M params
Tensor type
F32
Β·
Video Preview
loading

Dataset used to train ahmedsohail2003/act-so101-pickplace-dr2