docs(adr): ADR-074 — MTP / speculative-decoding priority (Metal)#726
Conversation
Fourth sequencing ADR in the bundle set (siblings ADR-071 GDN-state, ADR-072 weight-quant, ADR-073 KV-quant). Verdict NEEDS-EXPERIMENT: the live MTP path is off-by-default, greedy-only, K=1, and argmax-equivalent by test (correctness settled, nothing to rank), while the one throughput number (net -64%, issue-comment artifact) is self-flagged unreliable and the in-tree fix for its measured root cause (batch-GEMM verifier, LATTICE_MTP_BATCH=1) has never been run. Measured/source-verified table (M1-M16) held apart from an untrusted external prior-art survey. Decision gates the whole feature behind a defined minimal experiment (E1 flag-flip A/B, E2 weight-basis check), with an honest closed-by-measurement branch that promotes LATTICE_SELF_SPEC if MTP stays net-negative under the fast verifier. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ohdearquant
left a comment
There was a problem hiding this comment.
SPEC-GATE: SIGNED (Leo). NEEDS-EXPERIMENT verdict ratified — same experiment-gated structure as ADR-073. Live correctness settled (off-default, greedy-only, K=1, argmax-equivalent regression-tested); the only throughput number is self-flagged unreliable with the in-tree never-run batch-GEMM fix, so E1 (two env-var flips + bench rerun) is correctly the single decision point. Self-spec held apart as P-separate with its own ADR requirement — right call, do not fold it into MTP in any priority doc. Rider: if E1 confirms net-negative under the fast verifier, close MTP on the GDN-hybrid family explicitly in a follow-up S-row on this ADR (measured closure, not silence), and LATTICE_SELF_SPEC becomes the lever.
ADR-074 — MTP / speculative-decoding priority (Metal)
Fourth sequencing ADR in the bundle set, after ADR-071 (GDN-state), ADR-072 (weight-quant), and ADR-073 (KV-quant). Docs-only.
Verdict: NEEDS-EXPERIMENT
The live MTP path's correctness is settled and needs no ranking — it is off by default, greedy-only when enabled, single-draft-token (K=1), and regression-tested to be exactly argmax-equivalent to plain greedy decode. What is genuinely gated is profitability, and it rests on a single measurement whose own author flagged it unreliable, plus an in-tree fix that has never been run.
The load-bearing facts (all pointers verified against
origin/main @ 853f7b1d2):LATTICE_MTP_BATCH=1) purpose-built to cut the sequential-forward cost, with zero tests, zero benches, and zero references anywhere else in the repo.Structure
A Measured / source-verified reality table (M1–M16), each row tagged runtime-measured / unit-test-gate-pinned / source-read with a durable pointer, held apart from an untrusted external prior-art survey folded as data. The survey independently reached NEEDS-EXPERIMENT but from a repo-blind vantage; its central acceptance figure is an imported stale number the source issue itself caveats, and it misidentifies the bottleneck as inherent GDN verify-cost growth when the actual measured cost is the sequential-forward structure at K=1 (which has an unrun in-tree mitigation).
Decision
Gates the feature behind a defined minimal experiment:
LATTICE_MTP_BATCH=1and re-run the A/B under the GPU flock — decides whether MTP has any future on this architecture at the cost of two env-var flips.Includes an explicit honest closed-by-measurement branch: if the batch-GEMM verifier is net-negative everywhere even under the fast verifier, MTP is closed by measurement on this GDN-hybrid family, and the structurally-different
LATTICE_SELF_SPECmechanism (GDN-only draft, no MTP head, currently zero measured data and no design doc) becomes the leading speculative-decode lever, worth its own ADR and first measurement.Supersedes none of ADR-006 / ADR-050 / ADR-051; sequences their open follow-ups at the priority level.
Testing
Docs-only. No executable behavior changes.