Skip to content

Move LeRobot pin to 0.6.1 + draccus 0.11.6 (drops GPL pyyaml-include) - #355

Merged
rylinjames merged 9 commits into
mainfrom
feat/lerobot-0.6.1
Oct 13, 2026
Merged

rylinjames merged 9 commits into
mainfrom
feat/lerobot-0.6.1

Conversation

@rylinjames

Copy link
Copy Markdown
Collaborator

Implements the Tether half of Studio ADR 0003: LeRobot 0.5.1 -> 0.6.1 with draccus 0.11.6, which removes the GPL-3.0+ pyyaml-include that draccus 0.10.0 pulled in. transformers stays 5.3.0 (owner decision), so the monolithic exporter's masking-API gate is unchanged.

What changes

  • src/tether/_lerobot_version.py: one QUALIFIED_LEROBOT_VERSION = "0.6.1" used by the monolithic exporter gate, local dataset admission and preflight text.
  • Local dataset admission (finetune/local_dataset.py) pins the 0.6.1 wheel (1894516...), source commit 7e241bd (tag v0.6.1) and 13 upstream file hashes. Each hash was checked against the PyPI wheel, and the per-file upstream diffs were reviewed (Studio docs/research/verification/lerobot-06-implementation-20261011/). Also pins the Studio v2 statistics adapter hash.
  • lerobot.types -> lerobot.lerobot_types; the GR00T probe follows N1.7 module names.
  • Resume refuses LeRobot 0.5.x train_config.json (eval_freq, use_rabc*) with a typed cross-version-resume-unsupported error. Unreadable configs also get a typed error.
  • Extras: native, monolithic, lerobot and rtc pin lerobot==0.6.1 + draccus==0.11.6. SmolVLA deps are spelled out so pip resolves with transformers 5.3.0, and [tool.uv] override-dependencies keeps 5.3.0 for uv.
  • Parity vehicles (pi0, pi0.5, GR00T): lerobot 0.6.1 runtime, new volume subtree /lerobot-061-20261011/, --tether-revision and --watchdog-seconds entry args. They use torch>=2.8,<2.12. Every onnx-diagnostic 0.9.x calls a torch symbol that 2.7.1 lacks, so a 2.7.1 pin would have failed the export.

Review notes

  • The base torch and numpy requirements are deliberately unchanged from main. An exact torch==2.7.1 base pin was proposed and reverted: it is outside ADR 0003, which pins Studio's eval runtime and not every public install.
  • tests/test_lora_argv_parser.py: the local stub now returns the real verify_local_export shape. This failure predates this PR (since Admit local LeRobot v3 datasets as training input (S-48) #354) and only showed when lerobot was installed.
  • New test: pinned source hashes equal the installed bytes when lerobot 0.6.1 is present. It was mutation-checked; before this test, a wrong pin passed every Tether test.

Tests (at 165102a)

  • Full suite, S11 interpreter: 4197 passed, 127 skipped, 0 failed.
  • Full suite under a LeRobot 0.6.1 / torch 2.7.1 / transformers 5.3.0 interpreter: 4245 passed, 78 skipped, 1 failed. The failure is test_dispatch_by_model_id, which also fails on the 0.5.1 baseline in that interpreter. Root cause: onnx-diagnostic 0.9.x needs torch>=2.8.
  • Studio full suite against this source: 3779 passed, 0 failed.

Not done: pi0 and pi0.5 GPU parity receipts. Studio's pin and producer bindings move only after those run on the merged main commit.

🤖 Generated with Claude Code

rylinjames and others added 9 commits October 12, 2026 11:59
draccus 0.11.6 drops the GPL-3.0+ pyyaml-include that draccus 0.10.0 (required
by lerobot 0.5.1) pulled in. transformers stays 5.3.0 by override, so the
monolithic exporter's masking-API gate is unchanged.

- One QUALIFIED_LEROBOT_VERSION constant (src/tether/_lerobot_version.py) for
  the monolithic exporter gate, local dataset admission and preflight text.
- Local dataset admission pins the LeRobot 0.6.1 wheel, source commit
  7e241bd and 13 reviewed upstream file hashes (diffs reviewed in Studio
  docs/research/verification/lerobot-06-implementation-20261011/), plus the
  Studio v2 statistics adapter hash.
- lerobot.types -> lerobot.lerobot_types; GR00T probe imports follow N1.7.
- Resume refuses LeRobot 0.5.x train configs with a typed
  cross-version-resume-unsupported code.
- pi0/pi0.5/GR00T parity vehicles pin the 0.6.1 runtime, write to a new
  volume subtree and take --tether-revision/--watchdog-seconds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts:
#	src/tether/finetune/preflight/schema.py
- Keep the base torch/numpy requirements as on main (torch>=2.1.0,
  numpy>=1.24.0 off aarch64). The exact torch==2.7.1 / numpy==2.2.6 base pins
  were outside ADR 0003 (which pins Studio's evaluation runtime, not every
  public install) and LeRobot 0.6.1 already declares torch<2.12, numpy<2.3.
- accelerate floor >=1.14 in the explicit SmolVLA dependency sets, matching
  lerobot 0.6.1's accelerate-dep extra (>=1.14,<2) instead of a looser 1.10.
- Resume: an unreadable train_config.json raises ResumeConfigurationError
  instead of a bare JSONDecodeError; test added.
- New test: WRITER_FILES/NORMALIZATION_FILES equal the installed bytes when
  the qualified LeRobot is present (a wrong pin previously passed every
  Tether test; mutation-checked).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tub shape

The pi0/pi0.5/GR00T vehicles had been changed to torch==2.7.1. Every
onnx-diagnostic 0.9.x release (0.9.0-0.9.3, checked) patches
torch._export.non_strict_utils._constrain_user_specified_dimhint_range,
which exists from torch 2.8.0 and not in 2.7.1, so
torch_export_patches(patch_transformers=True) raises AttributeError before
any export: the paid GPU runs would have failed. Reproduced locally on
torch 2.7.1 + onnx-diagnostic 0.9.3. The vehicles now take torch>=2.8,<2.12
(lerobot 0.6.1's cap); uv resolves torch 2.11.0, transformers 5.3.0, no
pyyaml-include, for linux x86_64 py3.12.

test_lora_argv_parser: the local-dataset stub returns the real
verify_local_export shape (receipt key) that lerobot_v3.verify_local_dataset
reads since #354; three cases failed whenever lerobot was installed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
onnx-diagnostic 0.8.11 and 0.9.0-0.9.3 patch
torch._export.non_strict_utils._constrain_user_specified_dimhint_range
on entering torch_export_patches(); the symbol first exists in torch
2.8.0. Reproduced: entering the patches fails on torch 2.7.1 with
AttributeError and succeeds on 2.8.0 and 2.11.0. _require_monolithic_deps
admitted torch 2.7.1, so every pi0/pi0.5/SmolVLA/GR00T export died mid
export instead of being refused. The gate now lists torch>=2.8 as a
missing dependency, and the [monolithic] extra declares the same floor
(the jetson extra is left alone: it does not export locally).

test_dispatch_by_model_id called the real SmolVLA exporter and expected
an ImportError, so it started a full export whenever the extras were
installed and failed on any torch<2.8 interpreter that had them. It now
stubs the family exporters and asserts routing for smolvla/pi0/pi05.
New test for the torch floor; removing the check fails it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
LeRobot 0.6.1 removed PI0Pytorch/PI05Pytorch._prepare_attention_masks_4d
(now lerobot.policies.common.vla_utils.prepare_attention_masks_4d), which
broke the pi0 GPU parity export. Port every patched prefix/denoise path
(pi0, pi0.5 monolithic, decomposed, SnapFlow pi0/pi0.5/state-out, training
adapters, standalone Modal scripts) to the shared helper. Drop the 0.5.1
embed_image sqrt(hidden_size) shim (0.6.1 native no longer scales). SnapFlow
pi0 clones the prefix cache like native; SnapFlow export freezes cache
updates and forwards explicit state for state-out students.

Adds tests/test_lerobot06_patched_forward.py: tiny real LeRobot 0.6.1
models, patched outputs vs native unpatched forward at rtol=atol=1e-6, plus
torch.export graphs and a private-API audit. Audit and review notes in
docs/research/verification/lerobot-06-export-port-20261012.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ty failed

GPU re-run at 5fb92df: pi0 cosine 0.465 / max_abs 0.403 (thresholds 0.999 /
0.1). LeRobot 0.6.1 requires transformers>=5.4; on the pinned 5.3.0 its
native image and language embeddings lose the openpi sqrt(hidden_size)
scale. The exporter now matches that native forward; the receipt harness
still applies the old image shim. Correction appended to the port audit.
Not for merge until the transformers pin decision is made.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… golden

LeRobot 0.6.1 requires transformers>=5.4,<5.6. On 5.3.0 its pi0/pi0.5 image
and language embeddings lose the openpi sqrt(hidden) scale, which failed GPU
parity at cosine 0.47 while the CPU tests passed against the same mis-scaled
native forward.

- Pins: monolithic/native/eval-local/jetson extras -> transformers==5.5.4,
  base <5.6, [tool.uv] 5.3.0 override removed; exporter gate driven by
  QUALIFIED_TRANSFORMERS_VERSION and refuses 5.3.0.
- Golden reference: tiny pi0/pi0.5 fixtures captured on LeRobot 0.5.1 +
  transformers 5.3.0 + Tether cdb94dc; native, patched export forward and the
  real onnx-diagnostic ONNX export are compared to it (negative control on
  0.6.1 + 5.3.0 fails, prefix norm ratio 1/sqrt(hidden)).
- Receipt harnesses use native LeRobot as the reference (shims removed).
- PaliGemmaBackbone.embed_text_openpi: table lookup * sqrt(hidden), so the
  Triton fast path and Pi0VLA/Pi05VLA do not double-scale on 5.4+.
- Parity vehicles: retries=0, subprocess phase timeouts from measured times
  instead of the SIGKILL watchdog (Modal re-ran the crashed input), restart
  guard, provenance-checked export reuse, new volume root, pi0.5 on A100-40GB.

Full suite: S11 4204 passed; LeRobot 0.6.1 + tf 5.5.4 4262 passed; export
venv subset 73 passed; 0 failures.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ruff format on src/tether/finetune/resume.py and
tests/test_finetune_local_dataset.py (lines added earlier on this branch).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@rylinjames

Copy link
Copy Markdown
Collaborator Author

GPU export parity at b722306 (transformers 5.5.4, LeRobot 0.6.1, torch 2.11.0, onnxruntime-gpu 1.23.2, A100-40GB, CUDA EP, CPU fallback disabled), Modal profile fastcrest:

  • pi0: passed. first cosine 0.99999985 / max_abs 3.29e-04; full cosine 0.99999973 / max_abs 6.92e-04. Receipt sha256 9dc91d12...886488.
  • pi0.5: passed. first cosine 0.99999941 / max_abs 1.49e-04; full cosine 0.99999990 / max_abs 5.21e-04. Receipt sha256 628b05ab...05c66.

c93e852 adds only ruff formatting of finetune/resume.py and one test (quality ratchet). The remaining pytest CI failure is pre-existing on main since #354: tests/test_finetune_lerobot_v3.py imports pyarrow, which the CI install ([dev,onnx,serve]) lacks, so collection aborts. Local full suites: 4204 passed (S11), 4262 passed (LeRobot 0.6.1 + transformers 5.5.4), 0 failed.

🤖 Generated with Claude Code

@rylinjames
rylinjames merged commit e196b79 into main Oct 13, 2026
7 of 9 checks passed
@rylinjames
rylinjames deleted the feat/lerobot-0.6.1 branch October 13, 2026 00:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant