Skip to content

TB2/27B run support: NCCL stack dump, actor backup refresh, TB2 infra handling, qwen38 profile - #266

Draft
michaellchung wants to merge 12 commits into
s24-pr3-start-stopfrom
s24-pr5-tb2-support
Draft

michaellchung wants to merge 12 commits into
s24-pr3-start-stopfrom
s24-pr5-tb2-support

Conversation

@michaellchung

Copy link
Copy Markdown
Contributor

Stacked on PR-3. Not part of the four openspec changes; run support for the TB2 and Qwen3.8-27B runs.

  • Opt-in Python stack dump on a NCCL collective timeout (YETO_HANG_STACK_DUMP).
  • Refresh the Miles actor weight backup only when one exists (fixes host memory growth on resume).
  • TB2 base-model baseline runner; qwen38 Codex profile (prose before the tool call, bound to qwen38small).
  • Worker and verifier environment failures count as TB2 infrastructure and are kept out of the reward; neutral tbench_group_check dynamic sampling filter; codex_harness.json golden regenerated; hash-migration.md entry.
  • Trainer activation recompute and dynamic batching flags for ports RL; dynamic batching refused for bshd gated-delta-net models.
  • --rl-resume-allow-config-change also covers the backend fingerprint and LR check (recorded in events; the semantic hash still refuses).

🤖 Generated with Claude Code

chowhsu and others added 10 commits October 15, 2026 15:44
YETO_HANG_STACK_DUMP=1 makes the Modal island runner watch for the
PyTorch NCCL flight-recorder file and, when it appears, run py-spy dump
on every Python process in the container twice. A TP peer stuck on the
host side prints nothing when the other rank times out; this captures
where it is.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 341789cd5024b6d4995142372369a81d740ba87e)
The cut restore and the state import called weights_backuper.backup("actor")
unconditionally. Miles skips that pinned host copy when it is not needed
(fixed partition; colocated LoRA, where the memory saver's host copy of the
frozen base serves weight sync), so the call allocated a fresh pinned copy
of every weight per rank. On Qwen3.8-27B this added about 133 GB of host
memory after a resume and Ray OOM-killed the island on a 200 GB node.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 8690cc0ee2b16dffd7f2f83bbf3858bb8a4ce0d9)
- codex_infer: rank 0 serves the base model without LoRA; add
  SglangSessionLoader.start_base for runs that have no stored policy.
- tb2_baseline: run every (task, trial) of a TB2 split through the eval
  island attempt path with bounded concurrency; append one trace per
  attempt and write a pass-rate summary (infra errors excluded, mixed
  pass/fail tasks counted, driver stop reasons tallied).
- modal_tb2_baseline: one-GPU Modal shape with the eval-island image and
  mounts, a read-only models Volume, and periodic evidence sync to a
  results Volume so a timed-out container keeps its traces.
- Add qwen38 (Qwen3.8-27B) to the Codex OpenEnv profile allowlist; without
  it the adapter silently fell back to the qwen35_08b identity.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 88675a432b0e8086c00f0a4153f175def0fc9b22)
…en38small

- codex_harness_agent: a profile that declares allow_prose_with_tool_call
  keeps one line of prose next to its single tool call instead of failing
  the episode; every other profile keeps the strict rule. Only qwen38 opts
  in (Qwen3.8-27B TB2 baseline: 49% of episodes ended on that rule).
- Re-pin CODEX_HARNESS_AGENT_SHA256 for the changed harness source.
- qwen38 profile: tito_model is qwen38small, the Miles fork's Qwen3.8
  family; "qwen38" is not a TITO type there and the launcher rejected
  --tito-model qwen38small for this profile.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 8dd93a0210f9ae14bb70371e52c0ec33c7f68469)
A sandbox that shuts down under the Codex worker or before the trusted
verifier (Modal ConflictError / NotFoundError) now yields infrastructure
metadata instead of an exception that fails the whole rollout step. Tests
show such samples, and signed-boundary tool-output errors, get no reward and
take their whole group out of the advantage via the TB2 group filter.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 698e11514605d5ed0f9e454743910b1ab70a22c1)
Miles does not mask ABORTED samples when it computes advantages, so an
infrastructure TB2 sample only stays out of training if the TB2 group check
runs as the dynamic sampling filter. It had no neutral name, so no spec
could select it. Add tbench_group_check (bound to
tbench_reward.check_group) and the agentic TB2 spec that uses it
(TIS C=2.0, max policy staleness 4, over-sampling 8).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit dc5ee0cbcfe2aa729e1fbdd334f22cd4576846ab)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit af4600cc5c16a62013aaf0c62b562ec91482faff)
--rl-activation-recompute emits Megatron full uniform recompute (one layer
per chunk); --rl-max-tokens-per-gpu enables Miles dynamic batching with a
per-GPU token budget (refused below --seq-len). Both default off, so existing
argv is unchanged. Needed by the 27B TB2 long run, whose step-0 training
OOMed on 32.5K-token samples without recompute.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit f5c8b89d47e65bd6e3805a88fcc428cda71d1e63)
Miles rejects --use-dynamic-batch-size with --qkv-format bshd at parse time
on the island; fail at translation on the CPU instead.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 9af39b92646b908aa304914ab152489e246dd10c)
… LR check

The cut's backend fingerprint hashes the full Miles argv, so resuming a cut
into a longer run (--num-rollout, --lr-decay-iters) was refused even with
--rl-resume-allow-config-change. With the flag, a differing backend
fingerprint and a changed first-round learning rate are recorded in the
rl_resume / rl_resume_check events instead of refusing the resume.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 84c7137a8841ae770201c7d7997111d80d38fbc5)
chowhsu and others added 2 commits October 16, 2026 01:45
requeue_untrained stopped only the Miles worker task; the group tasks it had
submitted kept generating outside the in-flight budget while the next worker
submitted a full budget again. On the 27B TB2 run the agentic in-flight count
grew by about one budget per cut (29 -> 146 over four cuts) until a round took
over two hours. Cancel and await this rollout function's _generate_group tasks
on the rollout loop after the worker stops; their samples are requeued anyway.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The launcher mounts a cached HF token when one exists, which added an
extra add_local_file step on machines that have one and broke the mount
lists these tests pin.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.

2 participants