[CI] Rebaseline gsm8k fully-async E2E regression thresholds - #1965
[CI] Rebaseline gsm8k fully-async E2E regression thresholds#1965SumanthRH wants to merge 1 commit into
Conversation
`loss/avg_final_rewards >= 0.32` has failed on every nightly fully-async run since 30th June (22/22 of the last 22 runs), and `eval/all/avg_score >= 0.56` fails intermittently (3/22). Both were calibrated on 23rd Feb 2026 in #1199 and were never updated across three intentional changes to the fully-async recipe: #1798 (18 Jun) stopped clearing the KV cache on weight sync, so rollouts reused KV computed under stale weights (prefix_cache_hit_rate 0.15 -> 0.92). #1850 (30 Jun) switched the recipe to policy_loss_type=rollout_is. Before it, the default `regular` loss recomputed old logprobs, so the IS ratio was identically 1 at update_epochs_per_batch=1 -- clip_ratio was exactly 0.0 and there was no importance-sampling correction at all despite max_staleness_steps=4. Correcting that halved grad_norm (0.28 -> 0.16) and is the dominant cause of the lower reward. #1836 (14 Jul) added the per-global_step KV cache salt, reversing #1798. #1929 (20 Jul) logged eval after running it, so the summary now holds the final-step eval rather than the step-8 one. Rebaselines with #1199's own strategy -- 5% allowance from min/max of recent runs, here the last 5: eval 0.56 -> 0.50 (min 0.5292), train reward 0.32 -> 0.20 (min 0.2141). avg_num_tokens and the logprobs diff stayed well inside their gates throughout and are left unchanged. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Replay results confirming the attributionReplayed three variants as Anyscale jobs on
Three things this settles:
Measured decomposition of the 0.32 → 0.24 drop:
So #1850 is the dominant cause and it is a deliberate correctness fix, which is what justifies One follow-up still running: 🤖 Generated with Claude Code |
What does this PR do?
Rebaselines the regression thresholds for the nightly
gsm8kfully-async E2E CI run. Theloss/avg_final_rewardsgate has been failing on every nightly run since 30th June(22/22 of the last 22 runs), and
eval/all/avg_scorehas been failing intermittently(3/22). Both thresholds were calibrated on 23rd Feb 2026 (#1199) and were never updated
across three intentional changes to the fully-async recipe.
Why the metrics moved
Pulled every run in the
gsm8k_fully_async_ciwandb project (348 runs, back to 23rd April)and diffed the full summary metric set across the step changes. Four discrete events, each
landing on the first nightly after a specific merge:
loss/avg_final_rewardseval/all/avg_scorereward/avg_pass_at_5vllm/prefix_cache_hit_rateclip_ratiograd_normtrainer.fully_async.clear_kv_cache_on_weight_sync=falseto therecipe, so rollouts began reusing KV computed under stale weights.
vllm/prefix_cache_hit_rate0.15 → 0.92 andttft1.28s → 0.14s.policy_loss_type="rollout_is". This is the dominant cause and ithas never recovered. Before it, the default
regularloss recomputes old logprobs, so atupdate_epochs_per_batch=1the IS ratio is identically 1 —clip_ratiowas exactly0.0000 on every run for two months, i.e. there was no importance-sampling correction at
all despite
max_staleness_steps=4. [chore] Raise assertion error when policy_loss_type uses recomputed logprobs for fully async RL #1850 fixed exactly that (issue [fully async] Inform/warn/break about log_probs=old_log_probs #1315) and added anassertion forbidding the old behaviour. Correcting it halved
grad_normand loweredmeasured step-9 reward.
global_stepKV cache salt, reversing [async] add flag to toggle whether to clear kv cache after weight sync for fully async training, update default max_staleness_steps to 0 #1798's stale-KVreuse (
prefix_cache_hit_rateback to 0.152).evalrecovered 0.41 → 0.50.FullyAsyncRayPPOTrainer#1929 (20 Jul) moved metric logging to after eval. Pre-fix, metrics were loggedbefore eval ran, so the final-step eval was never logged at all and the summary held
the step-8 eval; post-fix it holds step 9.
eval0.50 → 0.575. This is a loggingdiscontinuity, not a quality change.
So
eval/all/avg_scoreis back at its pre-June level (0.575 vs 0.588) — but only just abovethe old 0.56 gate, which is why it now trips intermittently.
loss/avg_final_rewardsislegitimately lower because the recipe now applies the off-policy correction it was always
supposed to.
New thresholds
Same methodology as #1199 (5% allowance from min/max of the last 20 runs), applied to the
current post-#1929 regime:
EVAL_ACC_MIN_VALUETRAIN_ACC_MIN_VALUEAVG_NUM_TOKENS_MAX_VALUELOGPROBS_DIFF_MAX_VALUEThe two passing thresholds are left alone — tightening a gate that never fired isn't part of
fixing the regression and would only add flake risk.