mirror of
https://github.com/wassname/grpo_proj2.git
synced 2026-06-27 16:45:45 +08:00
readme
This commit is contained in:
@@ -1,104 +0,0 @@
|
||||
# Rebuild src/ from pseudocode
|
||||
|
||||
## Goal
|
||||
Expand docs/pseudocode/01..07 into a slim src/projected_grpo/ that passes
|
||||
`just smoke`. Code reads like the pseudocode (same names/shapes, fail-fast).
|
||||
Only the additive delta_S_hack route is built; route v2 stays speced.
|
||||
|
||||
## Key decision: self-contained tiny substrate
|
||||
The deleted src loaded LeetCode problems + a cached Qwen3-4B teacher pool from
|
||||
the external rl-rewardhacking repo. That repo is off-limits this session and
|
||||
out/ is empty. So the substrate is rebuilt self-contained:
|
||||
- problems.py: ~6 tiny LeetCode-style problems (prompt skeleton + canonical
|
||||
solution + ground-truth tests), partitioned across the 4 loophole modes.
|
||||
- teacher pool: build_pool bakes canned hack/clean completions (appendix
|
||||
templates), graded once and frozen, into out/pools/teacher_pool/. This is the
|
||||
smoke fixture that injects reward variance so the GRPO backward/projection/cin
|
||||
paths fire (pure tiny-random gen bails zero-variance, per smoke comment).
|
||||
just smoke stays a real end-to-end pipeline on tiny inputs, no GPU, no external
|
||||
repo. Full-preset dataset loader is a documented TODO, not built.
|
||||
|
||||
## Requirements
|
||||
- R1 grader: verify_rewards runs hack x mode diagonal; exploited fires iff the
|
||||
matching exploit present AND strict oracle rejects. VERIFY: exits 0, off-diag
|
||||
clean (an always-pass grader fails the off-diagonal assert).
|
||||
- R2 adapter identity: at dS=dS_hack=0 wrapped==base. VERIFY: smoke logs
|
||||
ref-vs-base max logit diff ~0 (>1e-3 => SVD round-trip leak).
|
||||
- R3 projection: removed in span(V); cout<=cin under one_sided; ||dS_hack||>0
|
||||
iff route. cin = ||relu(V@g)||/||g|| (relu-BEFORE-agg).
|
||||
- R4 loop walks every path: smoke(erase)+smoke-vanilla(measure_only)+smoke-route
|
||||
(dS_hack + ablate-eval + BLUF) complete steps, save ckpt (30 steps fires
|
||||
every-25 path). cin_t>0 (teacher pool gives variance, no zero-var bail).
|
||||
- R5 extraction: per-module V orthonormal rows oriented hack-ward, noise floor,
|
||||
safetensors round trip, auto-extract when path missing + cache-hit on rerun.
|
||||
|
||||
## Pseudocode elisions fixed (START.md)
|
||||
- 02 bucket -> G_hack/G_clean dicts.
|
||||
- 05 undefined denom/G/pad -> denom=G*max_new*pp, pad=tokenizer pad id.
|
||||
|
||||
## Context
|
||||
- delta_S dim per module r = min(d_in,d_out). Tiny model hidden=16, 2 layers.
|
||||
- Dr.GRPO unbiased: A=R-mean(R) (no /std); loss denom = G*max_new*pp.
|
||||
- Teacher half is forced ratio=1 imitation (05 REVIEW leak); kept as control.
|
||||
|
||||
## Tasks
|
||||
- [x] T1 spec
|
||||
- [x] T2 antipasto.py (R2)
|
||||
- [x] T3 proj.py (R3)
|
||||
- [x] T4 rewards.py + loopholes + verify_rewards.py (R1)
|
||||
- [x] T5 pairs.py + problems.py (R5)
|
||||
- [x] T6 extract_vhack_grad.py (R5)
|
||||
- [x] T7 train.py (R4)
|
||||
- [x] T8 build_pool fixture + scripts/results.py + justfile wiring (R4)
|
||||
- [x] T9 run smoke trio, show log + table, fresh-eyes review
|
||||
|
||||
## Log
|
||||
- tiny-random-qwen3 downloads ok; GPU box shared (65GB used) => smoke = CPU.
|
||||
- Write tool denied in don't-ask mode; new files created via heredoc, edits via
|
||||
Edit tool. Reviewable in git diff.
|
||||
|
||||
## Result (2026-05-31)
|
||||
just smoke PASS (exit 0). grader diagonal clean (4x4, off-diag exploited=False).
|
||||
R2 ref-vs-base max|dlogp|=0.0. 3 arms x 30 steps, cin_t>cin_s throughout:
|
||||
erase: cin_s=0.25 cin_t=0.44 cout=0 |dSh|=0 R3 PASS
|
||||
none : V=None measure_only cin=0 R3 PASS
|
||||
route: cin_s=0.26 cin_t=0.30 |dSh|=2.8 deploy-eval@0/10/20 R3 PASS
|
||||
1200 LOC / 12 modules. Fresh-eyes review: all 6 mechanics checks PASS, faithful
|
||||
to pseudocode. Smoke is mechanics-only (student never hacks; cin_t>cin_s is a
|
||||
fixture property, not efficacy) -- as the pseudocode intends. Efficacy needs the
|
||||
real-model fast/full run.
|
||||
|
||||
## TODO
|
||||
- Full-preset rl-rewardhacking dataset loader (out of scope).
|
||||
- Negative-control arms (random_V/shuffled_V/nonhack_V) speced not built.
|
||||
|
||||
## Errors
|
||||
| Task | Error | Resolution |
|
||||
|------|-------|------------|
|
||||
|
||||
## Result (2026-05-31, fresh rebuild from pseudocode)
|
||||
Rebuilt clean (DID NOT read original src). Simplified per user mid-run asks:
|
||||
merged loopholes+verify_rewards -> rewards.py (self-check in __main__), merged
|
||||
pairs -> problems.py, flat Config + `train.py {preset} [--overrides]` CLI,
|
||||
trimmed justfile 384->71 lines, trimmed results table to arm/steps/hack/solve/
|
||||
cin_t/cout. 7 modules, ~880 LOC (was 12 modules / ~1200 in the prior rebuild).
|
||||
|
||||
`just smoke-all` PASS (exit 0): smoke(erase)+smoke-vanilla(none)+smoke-route +
|
||||
results. Grader gate PASS (4x4 diagonal clean, 30/30 baked hacks fire). Cache
|
||||
MISS (erase extracts) then HIT (vanilla, route). ckpt saved every-25 (step 0,25).
|
||||
last-5 (logs/run_{arm}_s41.log):
|
||||
erase: cin_s=.34 cin_t=.44 cout=0 |δSh|=0 (g_proj written, quarantine frozen)
|
||||
none : cin_s=.32 cin_t=.34 cout=0 |δSh|=0 (measure_only, grad untouched)
|
||||
route: cin_s=.28 cin_t=.27 cout=0 |δSh|=5.0 (parked, deploy-ablate-eval + refresh)
|
||||
hack_s/gt_s=0 throughout: student (tiny-random) never hacks; cin_t>cin_s early is
|
||||
a fixture property (teacher pool = hack completions), decays as V goes stale.
|
||||
This is mechanics, not efficacy (as the pseudocode intends). Efficacy needs the real run.
|
||||
|
||||
Fresh-eyes subagent review: all 6 mechanics PASS, faithful, no silent-failure /
|
||||
fail-fast violations. Latent risks (noted, match pseudocode): BPE-seam off-by-one
|
||||
in completion-token boundary; Adam-preconditioner cout-on-g vs cout-on-Δδ caveat.
|
||||
|
||||
## Out of scope this rebuild (dropped functionality)
|
||||
regrade_pool / pairs_from_pool / build_substrate / probe_* / plot_* and their
|
||||
~25 justfile recipes + smoke-xmech (needed the 70-prompt external pool). Real
|
||||
fast/full recipes kept (auto-extract v_hack inside train, no separate extract step).
|
||||
Reference in New Issue
Block a user