Reinforcement Learning
Transformers
English
post-training
distillation
agentic-coding
composer-2.5
cursor
kimi-k2
grpo
dapo
diloco
openenv
trl
verl
research
methodology
Instructions to use Codeseys/composer-replication-framework with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use Codeseys/composer-replication-framework with Transformers:
# pip install -U transformers accelerate # Load model directly from transformers import AutoModel model = AutoModel.from_pretrained("Codeseys/composer-replication-framework", device_map="auto") - Notebooks
- Google Colab
- Kaggle
Commit History
-
docs(wave3): add OVERVIEW.md, index ADR-014, fold in adversarial-review fixes
New-docs + freshness wave, plus corrections from an adversarial review pass on the wave1 commit. Docs-only; no source files touched. New: - docs/OVERVIEW.md — a 5-minute, honestly-scoped newcomer tour: what the framework is, the three channels WITH provenance (1 Dr.GRPO + 2 SDPO = genuine Composer replication; 3 trace-replay-DPO = the framework's own additive channel, NOT Cursor's recipe), what's proven (CPU SDPO-fires, the A1 8B Modal run, GSM8K GRPO, $0.98/trace), and what's gapped (Docker e2e, A2-A4 ladder). Linked from README + both _archive READMEs. ADR index: - Add the missing ADR-014 row + a provenance note recording the channel-3 correction it carries. Adversarial-review corrections (to the wave1 edits): - Drop the parent-commit SHA mislabelled as "HEAD" in the VISION_VALIDATION status banner and the ALTERED_MINDS runnability note; keep the date + ADR ref. - Re-attribute the A2-A4 gap claim: cite ADR-014 only for what it states ("the A1 run used dr_grpo"; obj…e130879
-
feat(trainer): policy-optimization objective MENU (ADR-014)
Adds make_po_config(objective=..., **overrides) — RL's base objective is no longer hardcoded to Dr.GRPO. Six selectable named presets over trl 1.5.0's verified GRPOConfig knob-space (introspected the installed package, not a GitHub snapshot): grpo | vanilla GRPO (std-norm advantage) dr_grpo | DEFAULT; no length-std bias (Composer 2.5's base objective) bnpo | batch-normalized dapo | decoupled clip-higher (epsilon_high=0.28) + overlong mask + KL off gspo | sequence-level importance ratio (Qwen3; long-CoT / MoE stable) cispo | detached-IS REINFORCE (every token keeps a gradient; MiniMax-M1) Every preset is PURE CONFIG (trl already implements each loss_type branch + importance_sampling_level/epsilon_high) — no custom _compute_loss. Drift guards assert loss_type / IS-level / epsilon_high actually applied so a preset can't silently degrade (e.g. GSPO with IS overridden back to token raises). 10 unit tests green against real trl 1.5.0. Research-grounded: Composer …aae66fa
-
docs(adr-013): close acceptance-gate boxes 1-5; only user-gated spend remains
The LMA-side runner scaffold (the one outstanding non-budget-gated box) now exists in the sister repo: llm-mental-alterations/composer_replication_runs/ with 15 green mock-driven tests (collect+pass with no torch/trl/modal/framework installed), documented in LMA ADR-0017. Marks boxes 1-5 done; the only open item is the explicit user go/no-go on real LMA-checkpoint / Modal budget spend.7b34ebf -
feat(b4-gpu+b6): GPU train-proof on A10G + docker-gated substrate E2E test
B4-GPU: modal_b4_gpu_smoke.py ran real Qwen2.5-0.5B-Instruct on a Modal A10G in bf16, 30 steps of the real 3-channel composition. PASS: all-finite, SDPO channel fired nonzero (max JSD 0.1855), loss converged 4.7262 -> 0.0050 monotone. This is the genuine "it trains on GPU" proof the CPU smoke could not give. Result + curve in gpu_smoke_result.json; README documents both CPU and GPU proofs. B6: test_docker_substrate_e2e.py — the docker-gated 4-gate substrate-inversion E2E now EXISTS (was only referenced). Runs the gates against a real python:3.11-slim container + real subprocess pytest on a minimal synthetic feature-deletion task, plus a cache-scrub-in-container test. Skips cleanly with no Docker (2 skipped here), runs the moment a Docker host executes the suite. ADR-010 [~] gate updated: mechanics gate is now ready-to-close, not just wired. Cost: ~1-3 USD A10G. No LMA budget touched.c009712 -
feat(wave-a): close ADR-011 (SDPO alignment indices) + ADR-012 (review findings)
B1/ADR-011: collator emits student/teacher_response_idx + valid masks via _mask_to_padded_indices; loss sentinel-masks padding. Strict SDPO no longer raises against the real collator (the regression my review-fix introduced). B2/ADR-012: - k1-KL: found TRL 1.5.0 uses k3 not k1; corrected docstring honestly + documenting test. - hint routing: style/communication/effort sites now reach the judge (error-kind aware). - HackMonitor: added patch-provenance layer defeating string-concat obfuscation; ADR-010 language corrected AST->signature+patch-provenance. - curriculum: optional turns/think_tokens effort signals, backward-compatible. 210 passed / 16 skipped (was 192). Two Opus-4.8 workers in parallel.d02d724 -
architect: ADR-011/012/013 + research (alignment-index fix, review-findings closure, LMA channel-ladder)
b4a584a -
review+fix: cross-family adversarial ADR review (owed item) + remediation
Ran the owed 5-family adversarial review of ADR-008/009/010 (unblocked once OpenRouter credits were restored). 4/5 clean reviews (GPT-5.5, Gemini 3.1 Pro, DeepSeek V4 Pro, Grok 4.3; Kimi starved its token budget). Verdicts: ADR-008 3-REJECT/1-fix, ADR-009 unanimous-fix, ADR-010 3-REJECT/1-fix — all REJECTs were "accepted-status outran the evidence," not "design wrong." The review caught a real policy-corrupting P0 the solo pre-mortem missed: the SDPO alignment guard was a shape-check, so hint-shifted teacher tokens could silently misalign and distill garbage into the policy. Verified every convergent finding against code, then fixed (192 pass/16 skip, was 187): - SDPO alignment (composer_trainer.py): require collator-emitted student_response_idx/teacher_response_idx; gather aligned post-hint logits before JSD; strict-mode raises on missing/mismatched indices. Tests rewritten to the corrected contract (different-length sequences now exercised). - Sandbox scrub (sandbox.py): boo…185cce2 -
feat(datagen): ADR-010 FeatureDeletionEnv synthetic-data subsystem; accepted
Track A of the deep-work-loop — Composer 2.5's named synthetic-data generator (Feature Deletion) as a reusable subsystem. New composer_replication.datagen: - schema.py: FeatureDeletionTask (broken_repo + FAIL_TO_PASS reward target + PASS_TO_PASS functional guard; golden_diff HELD OUT of repr/observation). - sandbox.py: Sandbox Protocol + FakeSandbox (unit tests) + LocalSubprocessSandbox (real); SANDBOX_DENYLIST blocks find/strings/unzip/decompilers/git (the tools Composer's reported reward-hacks used to recover deleted signatures). - monitor.py: HackMonitor — flags cache/bytecode-provenance hacks so the grader masks reward (defense-in-depth behind the sandbox lockdown). - curriculum.py: DifficultyCurriculum — online pass-rate gate; up-weights the ~0.5 frontier (w ∝ p(1-p)), retires aced tasks, quarantines all-fail tasks (raw rate, not smoothed). Implements the blog's "select for harder tasks dynamically". - validator.py: 4-gate solvability validator (baseline-green / del…9336af3 -
feat(hints): ADR-009 layered HintGenerator; accepted
Track B of the deep-work-loop. Extends hint_generator.py from a flat dispatch registry into a layered, cost-ordered HintGenerator behind a typed Protocol — the SDPO textual-feedback hint source (Composer 2.5's hint mechanism is unstated in every Cursor artifact; this is our reconstruction). Layers (tried cheapest-first, first non-None wins): 1. TemplateHintGenerator — the existing 5 templates (free, deterministic; byte-identical to dispatch(), preserved). 2. RawErrorHintGenerator — raw env/tool error text as the hint (free; covers any message-bearing site templates miss). SDPO "environment feedback as conditioning signal". 3. LLMJudgeHintGenerator — <=2-sentence corrective hint via an injected complete() callable (optional, OFF unless provided; in-memory + disk cache keyed on error-context hash; covers style/communication/effort). CompositeHintGenerator.as_collator_hook() returns a callable matching the existing CollatorConfig.hint_generator signature (…84740d4 -
feat(trainer): ADR-008 gate-3 live GRPO+SDPO smoke PASS; ADR-008 accepted
The composer_grpo_sdpo_smoke instantiates a real trl.GRPOTrainer via ComposerReplicationTrainer on Qwen2.5-0.5B with the Dr. GRPO config (loss_type=dr_grpo, scale_rewards=none, num_iterations=1) and alpha_sdpo=1.0, runs 1 step, and confirms loss/sdpo_kl is logged — the SDPO channel is wired into the live Dr. GRPO loop. PASS. Surfaced + fixed a real API drift: TRL 1.5.0 dropped GRPOConfig.max_prompt_length. All 4 ADR-008 acceptance gates green -> status proposed->accepted; gate checkboxes ticked with evidence; index updated.2a34df4 -
docs(adr): add ADR-008/009/010 (Dr.GRPO+SDPO, layered hints, FeatureDeletionEnv)
Phase-4 of the deep-work-loop. Three proposed ADRs translating the Composer 2.5 data-gen + targeted-textual-feedback research into durable decisions, each with mechanized acceptance gates (status stays `proposed` until gates green): - ADR-008: target Dr. GRPO (length-std off, no std-norm, k1 KL, Adam, single-epoch — per arXiv:2603.24477) and host the live SDPO channel in the TRL ComposerReplicationTrainer. amends ADR-006 (SDPO needs full logits -> TRL-only; PRIME-RL hosts channels 1+3). preserves ADR-007. - ADR-009: layered HintGenerator (template -> raw-error -> LLM-judge -> SDPO sibling-bootstrap) behind a typed Protocol; preserves the existing templates + CollatorConfig.hint_generator hook. - ADR-010: FeatureDeletionEnv synthetic-data subsystem inverting OSS SWE substrates (SWE-bench-Lite/SWE-Gym/R2E-Gym/SWE-rebench) + online difficulty gate + reward-hacking safeguards. ADR-006 patched: Amended-by header + stale matrix row qualified. Index added. Prior-ADR audit (ad…36ab61e
-
Wave 15: 4-angle multi-model self-critique caught 2 math BLOCKERs in primary loss kernels; fixed against upstream byte-for-byte + GSM8K example + ergonomics
PHASE 15a: 4 parallel adversarial reviewers, each with different framing to maximize independent-angle coverage: - MATH (Opus 4.7): cloned upstream OPSD/TAID/PRIME-RL/SimPO, did line-by-line diff. Found 2 BLOCKERs all 8+ prior reviewers missed. - TESTS (Opus 4.7): scrutinized 3 high-stakes test files for weak assertions. Found PRIME-RL parity test silently never runs; bit-exact test uses allclose; entropy-OPD test is pure smoke. - DOCS (Opus 4.7): audited 6 major docs + ADRs. Found test-count drift (77/107/124 vs 145), compose_loss kwarg drift, stale "Deferred to Wave 14" claim, PRIME-RL test count 10 vs 16. - USER-JOURNEY (Opus 4.7): walked "RL-finetune Qwen-7B on GSM8K" end-to-end. Scored framework 2.4/5 with Real-Task-Path = 1/5. #1 friction: NO GSM8K example anywhere. All 4 reports saved to /tmp/wave15_*.md. Headline: math reviewer's upstream-clone-and-diff approach caught what paper-level review missed. PHASE 15b: synthesized findings into 5-task fix scatter. PHA…e5add15 -
Wave 14: close every Wave 13 review finding + 4 documentation files; Wave 14b: real PRIME-RL parity + multi-process DiLoCo convergence
PHASE A: 4 parallel impl subagents closed every Wave 13 cross-model review item. T1 \u2014 compose_loss integration (closes W13 BLOCKER 2): - Added `dpo_variant: 'dpo'|'simpo'`, `sdpo_wrapper: 'none'|'taid'|'entropy_opd'`, `taid_schedule_step`, `taid_total_steps` plus 5 tuning kwargs - 11 new integration tests in composer_replication/tests/test_compose_loss_integration.py - Bit-exact reproduction of legacy compose_loss output when defaults preserved - All 38 spike-005 tests still pass T2 \u2014 replaysim DJ adapter reshape (closes W13 Suggestion 3): - _dpo_pair_to_dj_record now emits BOTH flat strings AND chat-messages for dual-shape compatibility with data-juicer's text ops - _dj_record_to_normalized round-trips both shapes - default.yaml fixed: text_keys plural \u2192 text_key singular (caught a related bug in the same op set) - Real data-juicer e2e test runs DefaultExecutor on a 3-record fixture - 15 tests (was 9) T3 \u2014 MockManager DiLoCo integration (closes W13 Suggest…d9dd3a5 -
Wave 13: serverless DiLoCo + replaysim normalization + 3 distillation losses + PRIME-RL + Monarch
Expanded the brief mid-deep-work-loop to address the user's request for serverless training-system support, replaysim dataset normalization, deeper self-distillation paper coverage, and Meta's PyTorch agentic stack tie-ins. NEW MODULES (35 tests passing): - composer_replication.distillation: SimPO (arXiv:2405.14734), TAID (arXiv:2501.16937), Entropy-Aware OPD (ICLR 2026 spotlight). 17 unit tests covering scalar/differentiable/scheduler-monotonicity and boundary-condition correctness against paper formulas. - composer_replication.diloco.serverless: ServerlessExecutor Protocol + ObjectStoreAllReduce (fsspec-backed; works with file:// + s3:// + hf:// + gs:// + az://) + LocalProcessExecutor (working) + ModalExecutor / HFJobsExecutor (skeletons, raise NotImplementedError). 9 tests including 3 multi-process tests pinning the allreduce barrier with mean-of-{0,1,2}=1 + mean-of-{0,100,200}=100 across two consecutive rounds. - composer_replication.replaysim: data-juicer adapte…b266c31 -
Wave 11: cross-model adversarial review + honest down-revision
Phase 11 of the deep work loop ran a cross-model adversarial review on the Wave 7-10 work. The review (anthropic/claude-opus-4.7, separate session) found 10 substantive flaws including 2 BLOCKERs: 1. **Scorecard inflation** — initial self-claim was 5/10 → 9/10, honest re-scoring is 5/10 → 7/10 ✅ + 1/10 ⚠️ + 2/10 ❌-spirit. 2. **Spike 008 acceptance criterion silently redefined** — BACKLOG required "2 replicas converge"; what shipped is "1 replica + passthrough no-op allreduce." The recon doc's "ready-to-paste 2-replica pattern" hits a single-process post-hook sequencing bug. Both BLOCKERs addressed in this commit: - docs/research/WAVE_7_10_FINAL_REVIEW.md — full 423-line review committed. - docs/VISION_VALIDATION.md — replace 9/10 self-claim with honest 7/10 re-scoring + per-test caveats acknowledging the spirit-failures of tests 6/8/10. Explicitly notes "the framework as of this commit has zero GPU evidence of any kind." - spikes/008-streaming-diloco/verdict.md — s…f16fa23 -
Wave 7: Phase 2-4 of deep work loop — backlog, parallel research, three ADRs
Imports the gap-closer wave from VISION_VALIDATION.md as a structured backlog, records the deep work loop log, and locks three architecture decisions backed by primary-source research from three subagent recons. Backlog items (CPU-only, no GPU budget): - Spike 006 — real HF model smoke (Wave 7 next) - Spike 007 — real trace ingestion (Wave 8) - Spike 008 — Streaming DiLoCo smoke (Wave 9) - Wave 10 — packaging (pyproject.toml + examples/) - Spike 002a-mini — Modal-gated GPU smoke (Phase 10) Research (docs/research/, 1168 lines total): - MODAL_RECONNAISSANCE.md — Modal pricing + setup, primary-sourced from modal.com/pricing and modal.com/docs. Verdict: Modal L4 is $0.08-0.13 per smoke run but loses to local 5090 by 10x on iteration cycle (3-5min vs 25-40s). Modal becomes correct for parallel sweeps, 7B+ models, multi-node training, or CI repro — none of which apply to gap-closer wave. - DILOCO_RECONNAISSANCE.md — audited 5 candidates. meta-pytorch/torchft wins: BSD-3, 312 com…ac4bfb4