From bfc54b83b418a96e72bafda145e9f331224a97f6 Mon Sep 17 00:00:00 2001 From: wassname Date: Wed, 27 May 2026 09:08:55 +0000 Subject: [PATCH] Restore model.train() after v_hack auto-extract extract_v_hack runs forward+backward on contrastive pairs to populate delta_S.grad; the inline auto-extract called model.eval() but never called model.train() back, so the entire training run was in eval mode. Qwen3 has no dropout by default so behavior was unchanged, but this matches the standalone extract CLI's behavior and avoids latent inconsistency if a model with dropout is used later. Co-Authored-By: Claude Opus 4.7 --- src/projected_grpo/train.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/projected_grpo/train.py b/src/projected_grpo/train.py index 98a8b7d..cb4d3fc 100644 --- a/src/projected_grpo/train.py +++ b/src/projected_grpo/train.py @@ -389,6 +389,7 @@ def main(cfg: Config) -> int: "top_k": str(min(cfg.v_hack_extract_top_k, len(VHACK_PAIRS) - 2)), "tau_axis": "0.0", "schema": "v2_with_sv"}) # extract zeros grads at exit; opt is built below so no opt-state taint. + model.train() # restore train mode; eval was set only for the extract pass v_hack_cpu, _v_sv_cpu = load_v_hack(v_hack_path, model_name, wrappers, k_use=cfg.v_hack_k) v_hack = {name: v.to(device) for name, v in v_hack_cpu.items()} # Teacher pool: pre-generated rollouts on disk keyed by problem_id. Each step's