frost(sdpa): port #585 LPT schedulers to the SM107 fp8 sibling; defaults must obey declared knob domains - #656
Conversation
…ing; defaults must obey declared knob domains (fixes NVIDIA#653) Two changes that are one rule: a scheduler the served kernel cannot decode must be impossible to reach — whether requested or defaulted. 1. NVIDIA#585 port (fixes NVIDIA#653): the LPT/LPT_L2 tile schedulers landed in prefill_d128_fp8_sm100.py but the hunk-symmetric port to the SM107 sibling was never done, so the adapter's auto causal sched policy picked SCHED_LPT_L2 and every causal/masked per-tensor FP8 graph on cc10.7 failed plan build (29 of 33 suite cases). Ported: qh_per_kh/seqlen_kv threaded through the five warp groups and appended at all ten scheduler decode call sites, mirroring the SM100 file position for position. 2. Domain honesty end to end: - Both fp8 kernel files declare SUPPORTED_SCHED_POLICIES (decode truth at the source). - The adapter gains _sm100_sched_domain(); check_support now admits explicit NATURAL/LPT/LPT_L2 requests (was NATURAL-only — under- declared), and the causal defaulting heuristic CLAMPS its pick into the served route's domain, falling back to NATURAL. A default may never be a value the route could not honor as an explicit request. - The three SM100-family engine rows declare the true request domain {NATURAL, LPT, LPT_L2} (previously {NATURAL} while the lowering auto-picked LPT — dishonest in both directions). SM120 rows untouched. - frost/README knob-channel section documents the rule. 3. Sibling-lockstep fences (test_sdpa_fp8_sibling_parity.py): source-scan tests (no GPU/DSL needed) assert every decode call site carries the LPT args and the sched-domain constants match; module tests assert compile() signatures in lockstep (NVIDIA#574's fence), kernel domains == adapter table, and CFG divergence is exactly the intentional Rubin set {TILE_K_HW_BMM1, TILE_K_HW_BMM2, STAGES_KV}. Negative-tested: removing one call site's args turns the fence red. SM100 box: 40 passed (5 parity + 2 routing + 33 fp8 e2e). Rubin board validation of the causal suite to follow on the PR. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Enterprise Run ID: 📒 Files selected for processing (6)
Included review availability: Your plan provides up to 12 included reviews per hour; 11 remain after this review. 📝 WalkthroughWalkthroughSM100 and SM107 FP8 SDPA routes now support matching natural, LPT, and LPT_L2 scheduler domains. The SM107 kernel receives required decode parameters across its execution paths. GPU-independent tests enforce sibling parity and routing consistency. ChangesFP8 scheduler parity
Estimated code review effort: 4 (Complex) | ~45 minutes Merge Risk: ⚪ Minimal · up to The PR ports the scheduler behavior, aligns declared domains and defaults, and adds parity coverage; no actionable merge-blocking risk remains beyond normal checks and review. Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
Fixes #653.
Two changes that are one rule: a scheduler the served kernel cannot decode must be unreachable — whether requested or defaulted.
1. The #585 port (the bug fix)
#585 landed the LPT/LPT_L2 tile schedulers in
prefill_d128_fp8_sm100.py, but the hunk-symmetric port to the SM107 sibling was never done. The adapter's auto causal sched policy picksSCHED_LPT_L2, the sibling's decode guard refuses, and every causal/masked per-tensor FP8 graph on cc10.7 failed plan build (29 of 33 suite cases). Ported position-for-position with the SM100 file:qh_per_kh/seqlen_kvthreaded through the five warp groups and appended at all ten scheduler decode call sites.2. Domain honesty end to end
SUPPORTED_SCHED_POLICIES— decode truth at the source._sm100_sched_domain();check_supportnow admits explicit NATURAL/LPT/LPT_L2 requests (was NATURAL-only — under-declared while the lowering auto-picked LPT), and the causal defaulting heuristic clamps its pick into the served route's domain, falling back to NATURAL. A default may never be a value the route could not honor as an explicit request — the invariant that turns this bug class into a clean fallback.{NATURAL, LPT, LPT_L2}(previously{NATURAL}— dishonest in both directions). SM120 rows untouched.frost/READMEknob-channel section documents the rule.3. Sibling-lockstep fences (
test_sdpa_fp8_sibling_parity.py)Third silent-drift incident for this kernel pair (#574 signature skew, #602 amax ABI, #585/#653). The fences: source-scan tests (no GPU/DSL — run in any CI) assert every decode call site carries the LPT args and the sched-domain constants match; module tests assert
compile()signatures in lockstep, kernel domains == adapter table, and CFG divergence is exactly the intentional Rubin set{TILE_K_HW_BMM1, TILE_K_HW_BMM2, STAGES_KV}. Negative-tested: removing one call site's args turns the fence red.Testing
🤖 Generated with Claude Code
Summary by CodeRabbit
New Features
Bug Fixes
Tests