{ "required": true, "paths": [ { "id": "score_centering_loss", "fixed_input": { "sha256": "4e0d466b0fcac6ad708c927548447e33ef4c272077510584ee83597fd668d591", "description": "preflight_fixture.json: 4 GSM8K train problems (train-0..3) x 8 rollouts from the fresh LoRA r32 Qwen3.5-2B sampler after one Adam lr1e-4 probe step, 32 nonzero-advantage datums, 9390 loss tokens; same weights for stock and custom passes (no optim_step between). Reference parity fixture ref_parity_fixture.npz sha256 c1311032134b0b3925f3267a87e11ac2a6ffd8dc5080a60121049107617b6f5a (B=4,T=32,V=4096,K=128, seed 0, sampler/trainer logit mismatch 0.3 std)." }, "baseline_revision": "tinker-0.37.0 built-in loss_fn=importance_sampling (stock GRPO IS surrogate) on shared Spindle", "reference_revision": "github.com/martin-marek/score-centering@fdca22b19793babdf08e33e5ba51537e82cbed2f README score_centering_loss (JAX) + losses.py loss_fn_rl", "implementation_revision": "rl_score_centering.py sha256 388f91b33c1a648ebed6cd1ec0223dde89829aa5c106dc505114ee53c3c942c6", "precision": "server forward bf16-model logprobs returned as float32; custom loss computed in float32 torch; reference JAX float32 on CPU", "normalization": "token-sum over completion mask (no mean), matching stock importance_sampling loss:sum; reference parity uses sum/mask.sum on both sides", "errors": { "baseline_loss": { "max_abs_error": 1.1920928955078125e-05, "reference_max_abs": 264.63753843307495, "relative_l2_error": 4.504625090477422e-08, "cosine_similarity": 1.0 }, "baseline_gradient": { "max_abs_error": 5.960464477539062e-07, "reference_max_abs": 1.0349624156951904, "relative_l2_error": 1.0780211866559799e-07, "cosine_similarity": 0.9999999999999941 }, "reference_loss": { "max_abs_error": 2.682209014892578e-07, "reference_max_abs": 0.31140369176864624, "relative_l2_error": 8.613285859453761e-07, "cosine_similarity": 1.0 }, "reference_gradient": { "max_abs_error": 7.450580596923828e-09, "reference_max_abs": 0.018823595717549324, "relative_l2_error": 2.543320963813718e-07, "cosine_similarity": 0.9999999999999708 } }, "extra_errors": { "baseline_logprobs": { "max_abs_error": 9.5367431640625e-07, "reference_max_abs": 16.260665893554688, "relative_l2_error": 1.0626508195941363e-07, "cosine_similarity": 0.9999999999999942 }, "reference_gradient_vs_loss_fn_rl": { "max_abs_error": 7.450580596923828e-09, "reference_max_abs": 0.018823595717549324, "relative_l2_error": 2.552380770976158e-07, "cosine_similarity": 0.9999999999999706 }, "ones_weight_reference_loss": { "max_abs_error": 7.450580596923828e-07, "reference_max_abs": 0.20463140308856964, "relative_l2_error": 3.6409761573589118e-06, "cosine_similarity": 1.0 }, "ones_weight_reference_gradient": { "max_abs_error": 9.313225746154785e-10, "reference_max_abs": 0.008928446099162102, "relative_l2_error": 5.615329675185342e-08, "cosine_similarity": 0.9999999999999984 } }, "baseline_gradient_scope": "gradient w.r.t. per-token server logprobs (the only path from the loss to LoRA params); custom-path gradient on the K top-k head columns is exactly 0 for CENTER=0", "lr_scaling": [] } ] }