Multi-token-prediction heads inherit an expensive shape: a model-width transformer block followed by an output projection over the target model's full vocabulary. On Qwen3.5-9B that means scoring 248,320 vocabulary rows at every draft step. This study asked whether a separately trained, half-width MTP block with its own 32,768-token output head could preserve enough target acceptance to improve the full speculative-decoding path. The distillation succeeded on its own terms—the best StudentSV checkpoint reached 0.507 recursive chain acceptance against the teacher's 0.593 (85.5%) at roughly an eighth of the draft compute, with slots 1–3 individually exceeding the teacher—and the study still concluded against it. A verifier-as-oracle audit sorted every compression into two families: fidelity cuts (precision) cost at most 1.9 acceptance-retention points even under severe distribution shift, while function cuts—pruning, low-rank, and the distilled student itself—keep 97% on calibration-register text and pay 10–19 points where the text actually shifts. Parameters serving rare content accumulate no mass on any finite calibration sample. The recipe that survives is zero-training: trim the vocabulary to the model's own 32k hottest rows, quantize to NVFP4, verify full-vocabulary. Measured end to end in the memra engine it delivers 1.82× on MT-Bench at 9B and composes with a quantized base to 2.88× at 27B, distribution-exact by construction.
1. Research question
Large-vocabulary speculative drafters can spend a surprising amount of time moving and multiplying the output head. FR-Spec and VocabTrim established that a static high-frequency subset can cut that cost while the full target still protects output correctness. In my first Qwen3.5-9B measurements (llama.cpp path), trimming removed roughly 85% of the draft LM-head kernel cost but produced only a 1–3% end-to-end gain: the MTP transformer block remained, and that serving path wasn't draft-bound. Section 4 records how this number reversed once the same recipe ran in an engine whose critical loop is the draft path.
The question is therefore not only which logits should the drafter score? It is:
Can a small block and a small vocabulary be trained as one deployment-specific drafter, preserving enough acceptance to beat the inherited co-trained head on wall time and memory?
The initial project framed this as teacher-to-student distillation, and the first ablations appeared to reject it: equal-budget KD lost to plain cross-entropy twice. That verdict turned out to be a loss bug rather than a finding—section 4 documents the reversal. The current recipe is distillation-first: soft cross-entropy against precomputed teacher logits, then a short CE reinforcement.
Two compression axes in one drafter
2. Experimental design
Subject and interface
The subject is Qwen3.5-9B with its natural co-trained MTP block. Each prediction receives the current token embedding and the predecessor trunk hidden state, projects the pair into the draft block, and scores the next token. The experiment holds the target trunk fixed and replaces only this proposal path.
Current student
StudentSV is a 212M-parameter drafter: a half-width draft block and an independent 32,768-row LM head initialized from frequently used rows of the target head. The shortlist is calibrated separately for code and conversational distributions; the current production run is code-weighted.
Training and controls
- 960,000 training samples drawn from a roughly seven-million-token mixed corpus.
- Cross-entropy training without a teacher forward pass in the current arm.
- A full-vocabulary half-width baseline to separate block compression from vocabulary compression.
- The co-trained MTP head measured both through the engine and through the windowed PyTorch reproduction.
- Held-out code and generation-distribution replay sets; no evaluation text in training.
- Training on the model's own generated outputs beat a generic corpus by 17 points at one third of the steps (0.548 versus 0.376 held-out acceptance)—the training distribution should match the serving distribution.
- Chain training: four recursive draft slots against precomputed teacher top-64 logits, soft cross-entropy over the full 32,768-row draft vocabulary.
Primary metric
Two metrics appear below. Slot-0 teacher-forced replay acceptance—how often the drafter's first proposal matches the target's greedy token on a fixed hidden-state track—is the training diagnostic. Self-drafting chain acceptance over four recursive slots is the deployment-shaped metric: each slot drafts from the previous slot's own output, the regime speculation actually runs in. End-to-end wall time was later measured in the memra engine (section 5); memory accounting and multi-seed replication stayed estimates.
3. Results
| Draft head | Held-out code | Generation distribution | Est. draft FLOPs |
|---|---|---|---|
| Engine teacher · full context | 0.678 | 0.348 | 1.00× |
| PyTorch teacher · 2k window | 0.675 | 0.371 | 1.00× |
| StudentSV · 960k samples | 0.527 | 0.166 | ~0.13× |
| StudentSV · 60k samples | 0.337 | 0.105 | ~0.13× |
| Half-width · full vocabulary · 60k | 0.373 | — | ~0.35× |
Acceptance is still buying scale
The scaled StudentSV run retained 78% of the windowed teacher's code acceptance at roughly one eighth of the draft FLOPs. The improvement from 60k to 960k samples was large and the training loss was still falling—the scaling lever was real. It did not establish a speedup by itself.
The generation-distribution score was much weaker, and the audit later explained why this gap was structural rather than fixable by another run: only about 20% of the corpus was conversational, the chat shortlist covered 94.6% of target tokens versus 98.9% on code—and no finite calibration sample accumulates mass on parameters serving rare content. That mechanism is what closed the student direction.
Chain distillation
| Checkpoint | Slot 0 | Slot 1 | Slot 2 | Slot 3 | Chain |
|---|---|---|---|---|---|
| Teacher · engine chain | 0.740 | 0.598 | 0.520 | 0.470 | 0.593 |
| Staged CE → KD · ~24k steps | 0.679 | 0.563 | 0.468 | 0.405 | 0.449 |
| Naked KD · 12k steps | 0.656 | 0.563 | 0.488 | 0.425 | 0.449 |
| + CE reinforce · 4k | 0.665 | 0.570 | 0.500 | 0.459 | 0.457 |
| Naked KD · 24k steps | 0.706 | 0.598 | 0.527 | 0.448 | 0.490 |
| + CE reinforce · 4k | 0.708 | 0.611 | 0.548 | 0.477 | 0.507 |
Distilling directly from precomputed teacher logits—no CE warmup—matches the staged recipe at half the steps, and doubling the distillation schedule before the CE reinforcement sets the current best: 0.507 chain acceptance, 85.5% of the teacher's 0.593. Slots 1–3 individually exceeded the teacher (+0.013, +0.028, +0.007); the whole remaining gap was slot 0, which chain acceptance compounds. The 24k distillation curve was near-saturated, so the steps lever was spent. The remaining levers—more own-output data, a wider student block—were never pulled: the off-distribution audit closed the direction first.
The student tracks the teacher into depth
4. Negative results and changed decisions
Clean NVFP4-versus-BF16 controls found no degradation, so the original “heal the head” premise was closed.
The first distillation runs log-softmaxed only the teacher's top-64 subset, leaving the rest of the draft vocabulary unconstrained—pure KD collapsed and CE looked better. Fixed soft-CE distillation over the full vocabulary now beats the staged recipe on every slot at two thirds of the steps.
Trim-only in the llama.cpp path saved most LM-head kernel work but only 1–3% end to end, because the transformer block remained and the serving path wasn't draft-bound. The verdict reversed in the memra engine: with the draft path on the critical loop, trim plus NVFP4 on the head reached 1.82× at 9B and 2.88× composed at 27B. The lever was real; the first measurement harness hid it.
5. What this does not establish
- End-to-end wall time is now measured in the memra engine (1.82× MT-Bench at 9B; 2.88× best composed cell at 27B); memory accounting is still an estimate.
- The FLOP ratio remains an architectural estimate; the measured speedups above are the empirical counterpart.
- The result is one model family and one dominant domain; cross-model generality is unknown.
- The student is undertrained and below the desired acceptance-retention threshold.
- The current 2k training/evaluation window does not establish long-context behavior.
6. Artifacts and release plan
The harness is public: github.com/avifenesh/hqmtp — training and evaluation code, fixed corpora, the run ledgers behind every number here, and the negative-result verdicts with their artifact forensics. The engine-side context lives in memra, and the trim-only motivation is public in llama.cpp issue #25187.
- Available now Harness, protocol, run ledgers, verdicts, and changed decisions.
- Next release Checkpoints and extracted training data with provenance manifest.
- Paper v1.0 Wall-time and memory measurements, ablations, multi-seed replication, and PDF/BibTeX.
References
- W. Zhao et al. FR-Spec: Accelerating Large-Vocabulary Language Models via Frequency-Ranked Speculative Sampling. ACL 2025.
- R. Goel et al. VocabTrim: Vocabulary Pruning for Efficient Speculative Decoding in LLMs. 2025.
- H. Cai et al. FastMTP: Accelerating LLM Inference with Enhanced Multi-Token Prediction. 2025.
Substantive result changes increment the version and remain visible here; no preliminary number is silently promoted to a final one.