Skip to content

CI: gate MTP acceptance rate alongside gsm8k accuracy#1557

Merged
valarLip merged 1 commit into
mainfrom
ci/mtp-acceptance-rate-gate
Jul 10, 2026
Merged

CI: gate MTP acceptance rate alongside gsm8k accuracy#1557
valarLip merged 1 commit into
mainfrom
ci/mtp-acceptance-rate-gate

Conversation

@junhaha666

@junhaha666 junhaha666 commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

What

Adds a MTP acceptance-rate gate to the native ATOM accuracy CI (atom-test.yaml), so a spec-decode regression fails the job instead of silently passing.

Why

The pipeline already scrapes MTP/spec-decode acceptance from the server log during the gsm8k run (atom_ci_metadata.mtp_acceptance_rate) and publishes it to the benchmark dashboard, but nothing gates on it. gsm8k accuracy alone cannot guard MTP: speculative decoding is lossless w.r.t. the target model, so a broken draft head leaves accuracy unchanged and only craters acceptance/throughput.

Concrete example this catches: DeepSeek-R1-0528-FP4 MTP was stable at ~61% from 6/16 through 7/8, then dropped to ~36% on 2026-07-08 and has stayed there — invisible to the accuracy gate.

Changes

  • .github/workflows/atom-test.yaml — new Check MTP acceptance rate step after Check accuracy test results. Reuses the same gsm8k pass (no extra inference run), reads the recorded rate, fails if it drops below the per-model threshold or is missing (missing = MTP stats never emitted = treat as regression). Only runs for models that declare mtp_accept_threshold.
  • .github/benchmark/models_accuracy.jsonmtp_accept_threshold added to all 10 ATOM-backend spec-decode entries, set to each model's dashboard-observed minimum minus 1.5 points. FP4 MTP uses its healthy pre-regression minimum, so the current ~36% is caught rather than baked in.
  • .github/benchmark/schema/accuracy_catalog.schema.json — adds mtp_accept_threshold / mtp_per_pos_threshold so validate_catalog.py accepts the new fields.

Thresholds (fraction 0-1, = hist min − 1.5 pts)

model hist min threshold
DeepSeek-V4-Pro MTP 63.70% 0.622
DeepSeek-R1-0528 MTP 63.50% 0.62
DeepSeek-R1-0528 MTP Online-Quant 59.74% 0.582
DeepSeek-R1-0528-FP4 MTP 60.84%* 0.593
Kimi-K2.5-MXFP4 Eagle3 68.52% 0.67
GLM-5.2-MXFP4 MTP 61.02% 0.595
Qwen3.5-397B-A17B-FP8 MTP 84.39% 0.829
Qwen3.5-397B-A17B-MXFP4 MTP 84.27% 0.828
MiniMax-M3-MXFP4 Eagle3 72.99% 0.715
MiMo-V2-Flash MTP 83.49% 0.82

*healthy pre-regression minimum. Run-to-run jitter is <1%, so 1.5pt headroom avoids false failures while catching real draft-head breaks.

Test

  • python .github/scripts/validate_catalog.py → all catalogs OK.
  • Workflow YAML parses; gate comparison logic verified (60.0% passes 0.6, 59.99% fails).

🤖 Generated with Claude Code

@github-actions

Copy link
Copy Markdown
Contributor

🏷️ CI Guide

Runs automatically on every eligible PR before approval:

  • ✅ Pre Checkin: Black, Ruff, catalog schema validation, non-GPU unit tests

Heavy model tests:

  • ✅ Run after the PR is approved and Pre Checkin passes
  • ✅ Run immediately when an approval review is submitted
  • ✅ Can be requested before approval with labels
Label Tests
ci:full Run all heavy PR model tests: native ATOM, vLLM, and SGLang
ci:atom Run native ATOM model accuracy tests
ci:vllm Run ATOM vLLM OOT model accuracy tests
ci:sglang Run ATOM SGLang model accuracy tests

Heavy jobs are skipped when the PR is not approved and no matching ci:* label is present.
Add labels via the sidebar or gh pr edit 1557 --add-label <label>

The native ATOM accuracy pipeline already scrapes the MTP/spec-decode
acceptance rate from the server log during the gsm8k run
(atom_ci_metadata.mtp_acceptance_rate) and publishes it to the dashboard,
but nothing gates on it. gsm8k accuracy alone cannot guard MTP:
speculative decoding is lossless w.r.t. the target model, so a broken
draft head leaves accuracy unchanged and only craters acceptance.

Add a "Check MTP acceptance rate" step to atom-test.yaml that reads the
already-recorded acceptance rate from the accuracy result JSON and fails
the job when it drops below a per-model threshold (or is missing, which
signals MTP stats were never emitted). No extra inference run — it reuses
the same gsm8k pass as the accuracy check.

Thresholds (mtp_accept_threshold, fraction 0-1) are added to all 10
ATOM-backend spec-decode entries in models_accuracy.json, set to each
model's dashboard-observed minimum minus 1.5 points. FP4 MTP uses its
healthy pre-regression minimum, so the current ~36% drop is caught rather
than baked in. The catalog schema gains mtp_accept_threshold /
mtp_per_pos_threshold so validate_catalog.py accepts the new fields.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@junhaha666 junhaha666 force-pushed the ci/mtp-acceptance-rate-gate branch from 8cfb910 to a010ce8 Compare July 10, 2026 11:00
@valarLip valarLip merged commit cb3b3fe into main Jul 10, 2026
27 of 29 checks passed
@valarLip valarLip deleted the ci/mtp-acceptance-rate-gate branch July 10, 2026 16:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants