Codeseys's picture
feat(b4-gpu+b6): GPU train-proof on A10G + docker-gated substrate E2E test
c009712
|
Raw
History Blame Contribute Delete
2.31 kB
# B4 — end-to-end proof that the 3-channel loop trains
Two proofs that the Composer 3-channel loss (grpo + α·sdpo_kl + β·trace_replay_dpo)
runs end-to-end, closing the gap left by `examples/composer_grpo_sdpo_smoke`
(which proved *init* but never fired the SDPO channel — its toy rollouts carry
no error sites).
## 1. CPU proof — SDPO channel FIRES nonzero through the real collator
`run.py` — builds a REAL `ComposerDataCollator` batch from a trace with an error
turn, so the shipped collator emits `ctx_teacher_input_ids` +
`student/teacher_response_idx` (the ADR-011 alignment indices). Perturbs the
student tokens at the aligned positions (mimicking the hint changing the recovery
tokens) so the gathered student/teacher logits differ and the JSD is provably
nonzero, then verifies a gradient flows.
```
$ python run.py
proof path: TinyLM-stub-with-differing-tokens
SDPO JSD (sdpo_kl): 0.056547
requires_grad: True
grad norm into model: 0.001593
RESULT: PASS ✅ (SDPO channel FIRED nonzero via real collator indices)
```
Honest scope: the model is a deterministic CPU stub (no download); the *collator
alignment path* is the real shipped code. Real-model path: `ALTERED_MINDS_REAL_MODEL=1`.
## 2. GPU proof — real Qwen2.5-0.5B trains, bf16, loss converges
`modal_b4_gpu_smoke.py` — runs the real 3-channel composition on
`Qwen/Qwen2.5-0.5B-Instruct` on a Modal A10G in bf16: GRPO-proxy LM loss +
α·SDPO (hint-conditioned teacher = same model, no-grad) + β·replay-margin, 30
AdamW steps.
```
$ modal run modal_b4_gpu_smoke.py --n-steps 30
status : PASS
dtype : torch.bfloat16
sdpo_fired_nonzero : True (max sdpo_kl 0.1855)
loss_trend_down : True
all_finite : True
loss first → last : 4.7262 → 0.0050 (monotone decrease)
```
bf16 numerics finite throughout, SDPO channel nonzero, loss converges. Cost:
~$1-3 on A10G. Run date 2026-05-29; full curve in `gpu_smoke_result.json`.
The proxies (GRPO→LM-loss, replay→margin) stand in for the full PG / DPO
accounting so the smoke runs without a rollout buffer or teacher set; the
SDPO channel is the *real* `generalized_jsd_loss` path. A full GRPO run with a
real reward and rollouts is the LMA-budget-gated next step (ADR-013).