File size: 68,375 Bytes
d4c2896 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 | ---
title: "Speculative Decoding on a 16 GB Consumer GPU: Acceptance, Modern Drafters, and Quantization in Gemma 4 12B and Qwen3-8B"
author:
- Martin Ulises Millan Guerrero
date: 2026-08-08
biblio-style: IEEEtranN
natbiboptions: numbers
keywords: [speculative decoding, consumer GPU, EAGLE-3, DFlash, DSpark, quantization, break-even]
abstract: |
Speculative decoding (SD) is a mature family of lossless inference
acceleration techniques, yet the evidence for its modern drafters, EAGLE-3,
DFlash, and DSpark, comes almost entirely from datacenter GPUs serving
batched workloads. The community that runs quantized GGUF models on a single
16 GB consumer GPU has no empirical guidance on which drafter to use, at
which draft length, or with which quantization. We present, to our knowledge, the first
systematic evaluation of modern drafters on a 16 GB consumer NVIDIA GPU
(RTX 4060 Ti) with official checkpoints in llama.cpp: 26 target $\times$
drafter configurations over 1,474 greedy-decoded prompts across nine
benchmarks in three cognitive domains, per-position acceptance curves for 20
configurations, and a draft-length sweep ($k \in \{5,7,10\}$, 21 runs).
DSpark is the fastest Qwen3-8B drafter ($1.64\times$ at Q4, $1.93\times$ at
Q8_0); EAGLE-3 is robust ($1.39\times$β$1.63\times$, acceptance nearly constant under
quantization); a vanilla 1.7B drafter is surprisingly competitive
($1.41\times$); DFlash fails on Qwen ($0.63\times$, $\alpha \approx 0.009$)
yet reaches $2.09\times$β$2.30\times$ on Gemma, where the MTP head reaches
$2.39\times$β$2.71\times$. Confidence-scheduled gating raises acceptance
($0.616 \to 0.714$) but lowers throughput ($87.6 \to 80.7$ tok/s) in the
single-user regime. Target quantization barely affects acceptance, and Q4 draft
quantization is favorable in this tested setup (about 1 GiB of VRAM saved).
Break-even acceptance
$\alpha_{be}$ is 6.5β39.9% in the matched-context analysis.
The upper end slightly overlaps the low end of the $k=2$ reference reported
on Apple Silicon (38.0β52.8%), while all tested values are below its $k=4$
range; the comparison is directional, and the different draft-length ranges
and serving stacks prevent attributing the gap to hardware alone.
---
# Introduction
Large language models (LLMs) are increasingly deployed outside datacenters:
researchers, students, and hobbyists run 8β12B parameter models on a single
consumer GPU, where autoregressive generation is memory-bound and often the
bottleneck. Speculative decoding (SD)
[@leviathan2023fastinferencetransformersspeculative; @chen2023acceleratinglargelanguagemodel]
attacks this bottleneck losslessly: a cheaper draft model proposes several
future tokens, and the target verifies them in a single batched forward pass,
accepting the longest prefix that matches its own distribution. The technique
has matured rapidly: dependent drafters such as the EAGLE family
[@li2025eaglespeculativesamplingrequires; @li2024eagle2fasterinferencelanguage; @li2025eagle3scalinginferenceacceleration]
and the block-parallel diffusion drafters DFlash
[@chen2026dflashblockdiffusionflash] and DSpark
[@cheng2026dsparkconfidencescheduledspeculativedecoding] report $3\times$β$5\times$
speedups on datacenter accelerators, and official checkpoints are now served
natively by llama.cpp. Yet this evidence is generated in a world very
different from the one the local community lives in.
Most published numbers come from H100/A100-class GPUs serving batched
multi-user workloads with full-precision weights. Local practice is
different: GGUF-quantized models on a 16 GB GPU, one request at a time (batch
size 1), through llama.cpp. For this setup there is essentially no systematic
evidence; guidance circulates through blog posts and forum reports that rarely
use modern drafters and sometimes contradict each other (e.g. $1.85\times$ on
a 14B target vs. $0.95\times$ on a 7B target). SpecExec
[@svirschevski2024specexecmassivelyparallelspeculative] studied SD on consumer
devices under aggressive memory offloading, and Fonal
[@fonal2026crossfamilyspeculativedecodingpolish] measured break-even
acceptance on Apple Silicon, but no study covers the combination that defines
current local practice: a consumer NVIDIA GPU, GGUF quantization of target and
draft, modern feature-level and block-parallel drafters with official
checkpoints, and per-domain analysis of where drafting pays off.
This paper fills that gap. On an RTX 4060 Ti 16 GB we benchmark 26
target $\times$ drafter configurations over 1,474 greedy-decoded prompts from
nine benchmarks in three cognitive domains (math, code, chat), measure
per-position acceptance curves for 20 configurations, and sweep draft length
$k \in \{5, 7, 10\}$ for seven configurations to build hardware break-even
maps. Everything runs in llama.cpp at a pinned commit, deterministically
(temperature 0, fixed seed and prompt order), one request at a time, the
exact regime of a local user. We ask:
**Research questions:**
- **RQ1** β How does token acceptance $\alpha$ evolve across domains
(math/code/chat) and draft positions?
- **RQ2** β Do modern drafters (EAGLE-3/DFlash/DSpark) transfer their
datacenter speedups to a consumer GPU?
- **RQ2b** β Is DSpark's confidence-scheduled verification calibrated per
domain?
- **RQ3** β How does target/draft quantization (Q4/Q5/Q8) interact with
acceptance and speedup?
- **RQ4** β Where is the hardware break-even point $\alpha_{be}(k)$ on a
RTX 4060 Ti, and how does it compare with Apple Silicon results?
**Contributions.** This paper contributes:
- The first systematic empirical evaluation of modern drafters (EAGLE-3,
DFlash, DSpark with official checkpoints, plus a vanilla 1.7B drafter and an
MTP head) on a 16 GB consumer NVIDIA GPU: 26 configurations, 1,474 prompts,
three domains, nine benchmarks, fully deterministic decoding.
- **Acceptance dynamics (RQ1).** Suffix decay is universal and
drafter-specific; chat is generally the lowest-acceptance domain, especially
on Gemma, while the relative ordering of math and code varies by drafter.
The near-zero Qwen DFlash and confidence-gated DSpark configurations are
exceptions. Relative to the small-target study of Mahmoud
[@mahmoud2026acceptancedynamicscognitivedomains], the successful drafters
show a different domain pattern; Section Discussion analyzes this difference.
- **Drafter ranking on consumer NVIDIA (RQ2).** DSpark is the fastest
Qwen3-8B drafter ($1.64\times$ at Q4, $1.93\times$ at Q8_0); EAGLE-3 is
robust ($1.39\times$β$1.63\times$ with acceptance nearly constant across
quantization);
a vanilla 1.7B drafter is competitive ($1.41\times$, the
highest acceptance among Qwen configurations, $\alpha = 0.725$); on
Gemma-4-12B the MTP head ($2.39\times$β$2.71\times$) and DFlash
($2.09\times$β$2.30\times$) dominate.
- **A clear negative result (RQ2).** DFlash on Qwen3-8B fails, with acceptance
$\approx 0.009$ and a speedup of only $0.63\times$, showing that a drafter
whose drafts are never accepted is worse than no drafter at all.
- **Confidence gating is not free in single-user mode (RQ2b).** Raising
DSpark's $p_\mathrm{min}$ from 0.0 to 0.6 improves acceptance
($0.616 \to 0.714$) but *reduces* throughput ($87.6 \to 80.7$ tok/s,
$1.64\times \to 1.51\times$); the knob is a batched-serving feature, not a
local speedup.
- **Quantization is SD-friendly (RQ3).** Acceptance is robust to target
quantization (EAGLE-3: $\alpha \approx 0.43$β0.44 across Q4/Q5/Q8), while
throughput comparisons remain conditional on the serving context. Q4 draft
quantization is favorable in the tested Gemma setup ($\Delta\alpha = 0.010$,
about 1 GiB of VRAM saved).
- **Hardware break-even maps (RQ4).** $\alpha_{be}$ ranges 6.5β39.9% across
$k \in \{5,7,10\}$ in the present analysis, below the Apple-Silicon $k=4$
range and overlapping only its low $k=2$ range
[@fonal2026crossfamilyspeculativedecodingpolish] in a directional
comparison. The OLS fits are near-deterministic ($R^2 \ge 0.99$
for most configurations), but the resulting maps remain hardware-, engine-,
context- and drafter-specific diagnostics rather than universal constants.
**Reproducibility statement.** All recorded runs are deterministic and the
artifact bundle is sufficient to reproduce the reported analysis: we pin llama.cpp
master at commit
\texttt{07132750\allowbreak{}825a4f2d\allowbreak{}27a547cd\allowbreak{}9cdde1c6\allowbreak{}f6001885}
(version 22), record SHA-256
hashes of every model in `model-hashes.json`, fix the seed and prompt order
(seed 42), and store `config.json`, `metrics.json` and raw `results.jsonl` per
run. Section Reproducibility gives three-step instructions to regenerate every
number and figure.
# Background and Related Work
## Speculative decoding
SD losslessly accelerates autoregressive decoding by drafting multiple tokens
with a cheaper model and verifying them against the target in parallel
[@leviathan2023fastinferencetransformersspeculative; @chen2023acceleratinglargelanguagemodel].
The expected speedup is $(1 + \mathbb{E}[\tau]) / (1 + c_d/c_v)$, where
$\tau$ is the number of accepted tokens and $c_d/c_v$ the draft/verify cost
ratio.
## Drafter taxonomy
We classify drafters by how the draft is produced, following the survey
taxonomy of Xia et al. [@xia2024unlockingefficiencylargelanguage] and the
2025β2026 state of the art.
**Model-free and training-free methods** derive drafts from the target's own
past without a separate model: Jacobi and n-gram lookahead
[@lookahead2024], suffix-tree decoding for repetitive agentic workloads
[@oliaro2025suffixdecodingextremespeculativedecoding], and
multi-token-prediction (MTP) heads trained into the target itself (the
Gemma-4-12B MTP head evaluated here). They add no extra weights and are the
cheapest to deploy.
**Independent draft models** share the target's tokenizer but are trained
separately: the vanilla small-LM drafter of the original SD papers
[@leviathan2023fastinferencetransformersspeculative; @chen2023acceleratinglargelanguagemodel],
distilled recurrent drafters (ReDrafter
[@cheng2024recurrentdrafterfastspeculative], Clover-2
[@xiao2024clover2accurateinferenceregressive]), and cross-attention drafters
such as Beagle [@zhong2026crossattentionspeculativedecoding]. Because the
draft is generic, acceptance is usually lower, but the drafter can be reused
across targets.
**Target-dependent (feature-level) drafters** condition on the target's
hidden states and are the current industrial standard. Medusa attaches
multiple decoding heads [@cai2024medusasimplellminference]; the EAGLE family
drafts at feature level [@li2025eaglespeculativesamplingrequires], adds
dynamic draft trees in EAGLE-2 [@li2024eagle2fasterinferencelanguage], and in
EAGLE-3 predicts tokens directly with multi-layer fusion and training-time
test (TTT), reaching up to $4.79\times$ on a 70B target
[@li2025eagle3scalinginferenceacceleration]; ParallelSpec trains parallel
drafters [@xiao2024parallelspecparalleldrafterefficient]. Open-source training
frameworks such as SpecForge
[@li2026specforgeflexibleefficientopensource] have made this family the
default in practice.
**Block-parallel and diffusion drafters** (2025β2026) emit an entire draft
block in a single forward pass. DFlash [@chen2026dflashblockdiffusionflash]
uses a block-diffusion adapter and reports more than $2.5\times$ the speedup
of EAGLE-3 on Qwen3-8B; DSpark
[@cheng2026dsparkconfidencescheduledspeculativedecoding] adds a
semi-autoregressive serial head that suppresses suffix decay and a
confidence-scheduled verification policy for batched serving, reporting +30%
accepted tokens over EAGLE-3 and 60β85% faster per-user generation on
DeepSeek-V4 [@deepseekai2026deepseekv4highlyefficientmilliontoken]. Follow-ups
explore diffusion draft trees
[@ringel2026acceleratingspeculativedecodingblock], dual diffusion drafters
[@zhang2026d2sdacceleratingspeculativedecoding], and diffusion language models
as drafters [@li2025diffuspecunlockingdiffusionlanguage].
**Self-speculative drafters** reuse the target itself through early exit
(Draft&Verify [@draftverify2024], LayerSkip
[@elhoushi2024layerskipenablingearlyexit]), trading a separate drafter for
skipped layers. **Serving stacks** add a further axis: tree-based verification
(SpecInfer [@miao2024specinferacceleratinggenerativelarge]) and
speculative-speculative decoding, which overlaps drafting with verification
(SSD/Saguaro [@kumar2026speculativespeculativedecoding]), target batched
serving and are out of scope for the single-user regime studied here.
**Cross-vocabulary and cross-family drafting** removes the shared-tokenizer
constraint: UAG (SLEM string-round-trip and TLI vocabulary-intersection)
provides lossless drafting for arbitrary draft/target pairs
[@timor2025acceleratingllminferencelossless], on-device adaptive drafters such
as OmniDraft [@ramakrishnan2025omnidraftcrossvocabularyonlineadaptive] target
mobile hardware, and Fonal [@fonal2026crossfamilyspeculativedecodingpolish]
recently evaluated UAG cross-family drafting on Apple Silicon, introducing the
hardware break-even methodology we build on.
Finally, **quantization interacts with all families**: QSpec
[@zhao2025qspecspeculativedecodingcomplementary] combines a quantized target
with an FP16 draft, ML-SpecQD
[@georganas2025mlspecqdmultilevelspeculativedecoding] quantizes the draft
itself, and systematic compatibility evaluations show that 4-bit targets
barely degrade acceptance while the draft/target cost ratio, not acceptance,
ultimately bounds the speedup [@zhang2025speculativedecodingmeetsquantization].
## Prior empirical studies
Four empirical strands are directly related to ours. **Acceptance dynamics.**
Mahmoud [@mahmoud2026acceptancedynamicscognitivedomains] is the study closest
to RQ1: a TinyLlama-1.1B draft verifies against Llama-2-7B-Chat-GPTQ with
tree sampling over code, math, logical reasoning, and chat (99,768 nodes). He
finds that task type dominates tree depth, that the entropyβacceptance
correlation is negative but weak ($\rho \in [-0.20, -0.15]$), and, perhaps
counterintuitively, that chat shows the *highest* acceptance (0.565 vs. 0.518
for math), which he attributes to the lexical predictability of the
RLHF-aligned conversational register. Our RQ1 generally shows the opposite
pattern on successful drafters (higher math/code and lower chat acceptance)
with 8β12B GGUF targets and same-family block drafters, although the failed
Qwen DFlash and gated DSpark cases are exceptions; we analyze this difference
in the Discussion.
**Drafter choice.** Decoding
Speculative Decoding [@decoding-sd2025-naacl] runs 350+ experiments on
datacenter hardware and decomposes the speedup into a throughputβaccuracy
trade-off, giving principled guidance on when a given draft model pays off,
but its targets and hardware are far from the 16 GB GGUF regime; recent work
also steers pretrained drafters at inference time to raise acceptance without
additional training [@steering-drafters2026-aaai]. **Small
models and software engineering.** An EACL study shows that drafting overhead
dominates on 1β2B targets, where unit speedup requires 77β94% acceptance
[@empirical-sd-small-lm2026-eacl]; Li et al.
[@li2026empiricalstudyspeculativedecoding] evaluate SD on software-engineering
tasks (SWE-bench, Aider, Polyglot) with Llama-3.1/Qwen3-32B targets and find
that $k=5$ helps most on code ($1.37\times$ to $1.58\times$) and that
chat-trained drafters suffer distribution shift on SE workloads.
**Hardware break-even.** Fonal
[@fonal2026crossfamilyspeculativedecodingpolish] evaluated UAG cross-family
drafting with Bielik-11B on an Apple Silicon M2 Pro and introduced the
break-even acceptance methodology we adopt: an OLS fit $TPS = a + \beta\cdot
\alpha$ and the break-even point $\alpha_{be} = (TPS_{base} - a)/\beta$. His
values (38.0β52.8% at $k=2$; 77.7β90.1% at $k=4$) are the reference we compare
against in RQ4; he explicitly notes that extrapolating to other hardware
requires re-estimating $\beta$ empirically on that platform, exactly what we
do here. **Quantization.** Zhang et al.
[@zhang2025speculativedecodingmeetsquantization] evaluate SD$\times$
quantization compatibility on Llama-3-8B/70B with EAGLE-2 and find that
W4A16/W8A8 barely degrade $\tau$, with the speedup limited by the growing
draft/target cost ratio rather than by acceptance; Zhao et al.
[@zhao2025qspecspeculativedecodingcomplementary] show that a quantized target
with an FP16 draft retains high acceptance; ML-SpecQD
[@georganas2025mlspecqdmultilevelspeculativedecoding] quantizes the draft
itself. These studies use full-precision or GPTQ/W4A16 targets on datacenter
hardware; none combines GGUF quantization with the modern drafters we test.
Finally, on **consumer hardware** SpecExec
[@svirschevski2024specexecmassivelyparallelspeculative] demonstrated SD on
consumer devices with massive offloading (up to 20 tokens per cycle),
establishing that the technique survives outside the datacenter; our work
complements it by measuring the mainstream single-GPU, fully offloaded
llama.cpp setup with official modern checkpoints.
**Positioning.** To our knowledge, no study combines the elements that define
current local practice: a consumer NVIDIA GPU (16 GB), GGUF quantization of
target and draft, modern dependent and block-parallel drafters with official
checkpoints (EAGLE-3, DFlash, DSpark), multi-domain evaluation with
per-position acceptance, and hardware break-even maps. Existing work covers
domains [@mahmoud2026acceptancedynamicscognitivedomains], drafter choice
[@decoding-sd2025-naacl], small models
[@empirical-sd-small-lm2026-eacl], software-engineering tasks
[@li2026empiricalstudyspeculativedecoding], a single Apple platform
[@fonal2026crossfamilyspeculativedecodingpolish], and quantization in
isolation [@zhang2025speculativedecodingmeetsquantization; @zhao2025qspecspeculativedecodingcomplementary],
but the combination, and the resulting practical guidance for a 16 GB GPU,
remains unmeasured.
# Experimental Setup
We benchmark speculative decoding on a consumer NVIDIA GPU with two GGUF
targets, seven drafter families and 26 target $\times$ drafter configurations.
Every run is deterministic (greedy decoding, fixed seed, fixed prompt order),
so all reported differences are attributable to the drafter and quantization
choices rather than sampling noise.
## Hardware and software
All experiments ran on a desktop with an NVIDIA RTX 4060 Ti 16 GB GPU, an
Intel Core i5-12400 CPU and 31 GB of system RAM under Linux. We used llama.cpp
at master commit `07132750825a4f2d27a547cd9cdde1c6f6001885` (version 22) built
with CUDA 12.8, and served every model through a persistent `llama-server`
process with full GPU offload (`-ngl 99`, CPU threads 8). Requests were issued
one at a time (single-user, batch size 1). Each run directory stores a
`config.json` that records the commit, the exact GGUF files, their SHA-256
hashes, and the sampling parameters, plus a `metrics.json` and raw
`results.jsonl`, in `experiments/runs/<id>/`. Time-to-first-token, peak VRAM
and peak power draw were sampled with a 1 Hz `nvidia-smi` sampler; the largest
peak VRAM footprint observed (Gemma 4 12B Q8_0 + DFlash-F16) is 15.5 GiB, i.e.
within the 16 GB budget.
## Models and drafters
Targets are Gemma 4 12B (instruct) and Qwen3-8B, each quantized to GGUF
Q4_K_M, Q5_K_M and Q8_0. Drafters, all converted to GGUF, are: the EAGLE-3
speculator for Qwen3-8B (F16) [@li2025eagle3scalinginferenceacceleration]; the
DFlash block-7 drafter [@chen2026dflashblockdiffusionflash] for Qwen3-8B (F16)
and for Gemma 4 12B (F16, Q4_K_M, Q8_0); the DSpark block-7 drafter
[@cheng2026dsparkconfidencescheduledspeculativedecoding] for Qwen3-8B (F16)
with confidence threshold (p-min) $\in \{0.0, 0.2, 0.4, 0.6\}$; a vanilla
Qwen3-1.7B (Q4_K_M) as the classic small-drafter baseline; and the Gemma 4 12B
multi-token-prediction (MTP) head (Q8_0).
Two cells do not exist because the drafter is unavailable for one target in
the pinned llama.cpp build, and we report them as absent rather than omitting
them by choice: DSpark for Gemma 4 12B, whose public Gemma DSpark GGUFs use the
draft format of pull request \#25549, which master does not expose (no
`LLM_ARCH_DSPARK`); and EAGLE-3 for Gemma 4 12B, for which no GGUF conversion exists.
Conversely, DFlash and MTP are only available for Gemma. Table
[@tbl:configs] lists the 26 final configurations (15 Qwen3-8B, 11 Gemma 4
12B), including the six target-only baselines used to compute speedups.
| Family | Target quant | Drafter | Draft format | p-min | k | ctx | n |
| :--- | :--- | :--- | :--- | :---: | :---: | :---: | :---: |
| Qwen3-8B | Q4_K_M | target only | β | β | 3 | 8192 | 1474 |
| Qwen3-8B | Q4_K_M | Vanilla-1.7B | Q4_K_M | β | 3 | 8192 | 1474 |
| Qwen3-8B | Q4_K_M | EAGLE-3 | F16 | β | 3 | 8192 | 1474 |
| Qwen3-8B | Q4_K_M | DFlash | F16 (block 7) | β | 3 | 8192 | 1474 |
| Qwen3-8B | Q4_K_M | DSpark | F16 (block 7) | 0.0 | 3 | 8192 | 1474 |
| Qwen3-8B | Q4_K_M | DSpark | F16 (block 7) | 0.2 | 3 | 8192 | 1474 |
| Qwen3-8B | Q4_K_M | DSpark | F16 (block 7) | 0.4 | 3 | 8192 | 1474 |
| Qwen3-8B | Q4_K_M | DSpark | F16 (block 7) | 0.6 | 3 | 8192 | 1474 |
| Qwen3-8B | Q5_K_M | target only | β | β | 3 | 8192 | 1474 |
| Qwen3-8B | Q5_K_M | EAGLE-3 | F16 | β | 3 | 8192 | 1474 |
| Qwen3-8B | Q5_K_M | DFlash | F16 (block 7) | β | 3 | 8192 | 1474 |
| Qwen3-8B | Q5_K_M | DSpark | F16 (block 7) | 0.0 | 3 | 8192 | 1474 |
| Qwen3-8B | Q8_0 | target only | β | β | 3 | 8192 | 1474 |
| Qwen3-8B | Q8_0 | EAGLE-3 | F16 | β | 3 | 8192 | 1474 |
| Qwen3-8B | Q8_0 | DSpark | F16 (block 7) | 0.0 | 3 | 8192 | 1474 |
| Gemma 4 12B | Q4_K_M | target only | β | β | 3 | 16384 | 1455 |
| Gemma 4 12B | Q4_K_M | DFlash | F16 | β | 3 | 16384 | 1455 |
| Gemma 4 12B | Q4_K_M | DFlash | Q4_K_M | β | 3 | 16384 | 1455 |
| Gemma 4 12B | Q4_K_M | DFlash | Q8_0 | β | 3 | 16384 | 1455 |
| Gemma 4 12B | Q4_K_M | MTP | Q8_0 | β | 3 | 16384 | 1455 |
| Gemma 4 12B | Q5_K_M | target only | β | β | 3 | 16384 | 1449 |
| Gemma 4 12B | Q5_K_M | DFlash | F16 | β | 3 | 16384 | 1449 |
| Gemma 4 12B | Q5_K_M | MTP | Q8_0 | β | 3 | 16384 | 1449 |
| Gemma 4 12B | Q8_0 | target only | β | β | 3 | 8192 | 1452 |
| Gemma 4 12B | Q8_0 | DFlash | F16 | β | 3 | 8192 | 1452 |
| Gemma 4 12B | Q8_0 | MTP | Q8_0 | β | 3 | 8192 | 1452 |
: The 26 final configurations (15 Qwen3-8B, 11 Gemma 4 12B, including six target-only baselines). Draft length $k = 3$ in every run; p-min is DSpark's confidence threshold; ctx is the context window (8,192 for all Qwen3-8B and Gemma-Q8_0, 16,384 for Gemma-Q4/Q5); $n$ is the number of records kept after the exclusions described below. {#tbl:configs}
## Benchmarks and prompts
Nine benchmarks grouped into three cognitive domains: math (GSM8K, MATH-500,
AIME25), code (HumanEval, MBPP, LiveCodeBench) and chat (MT-Bench, Alpaca,
Arena-Hard-v2). We subsampled each benchmark with fixed seed 42 into a main
evaluation set of 1,474 fully templated prompts (math 430: GSM8K 200, MATH-500
200, AIME25 30; code 564: HumanEval 164, MBPP 200, LiveCodeBench 200; chat
480: MT-Bench 80, Alpaca 200, Arena-Hard-v2 200), and a stratified acceptance
sample of 180 prompts (60 per domain) used for the acceptance curves and the
draft-length sweep. No thinking mode is used (`--reasoning off`); the models
generate in their default instruct style.
## Decoding protocol
All generations are greedy: sampling temperature 0.0, top-$k$ 40, top-$p$
0.95, seed 42, maximum 256 output tokens, with up to two retries per prompt
and incremental JSONL resume. The main comparison uses draft length $k = 3$
with context 8,192 for all Qwen3-8B runs and for Gemma-Q8_0, and 16,384 for
Gemma-Q4/Q5 (the Gemma 4 12B instruct template is longer). The acceptance
curves and the draft-length sweep (ksweep) run the 180-prompt sample at
context 2,048 with $k = 3$ and $k \in \{5, 7, 10\}$ respectively. Because
decoding is deterministic, the curves measured on the 180-prompt subset are
identical, for those prompts, to the final runs. For the final runs, speedups
are computed against a target-only baseline of the *same quantization* over the
*same prompt set*.
## Metrics
Per-prompt throughput (tok/s) is llama-server's `predicted_per_second`. The
headline speedup is the ratio of the mean tok/s of a draft configuration to
the mean tok/s of the matching baseline (ratio of means); we also compute the
mean and median of the per-prompt speedup ratios for robustness; they agree
with the ratio of means within a few percent (largest divergence, 7%, occurs
for Gemma DFlash, whose per-prompt distribution is mildly skewed). Acceptance
$\alpha$ is the fraction of drafted tokens accepted by the target, averaged
over prompts; $\tau$ is the mean number of accepted draft tokens per prompt.
Per-position acceptance is read from the server's `acc per pos` logs of the
curves runs. We additionally record time-to-first-token (TTFT, `prompt_ms`),
peak VRAM and peak power (1 Hz `nvidia-smi` sampler). Representative TTFT
figures: Qwen3-8B mean 65β84 ms and Gemma 4 12B mean 149β212 ms across
configurations; peak power draw ranges 138β167 W.
## Data exclusions and integrity
llama-server reports spurious timing records (`tok_per_s = 1,000,000`,
`predicted_ms = 0`) on 271 records of Gemma runs; we excluded every record
with `tok_per_s >= 1e5` or `predicted_ms <= 0`; in the observed records, these
timing sentinels also had `alpha/tau/draft_n = None`. No such sentinels occur in
Qwen runs. Deterministic failures further reduce the Gemma sample: the
Gemma-Q4 runs (5 configurations) lost `humaneval-00050` to a reproducible
HTTP 500 error, leaving $n = 1473$ raw and $n = 1455$ clean records per run;
the Gemma-Q8 runs (3 configurations) lost `arena-hard-v2-00233` (over
context) and `arena-hard-v2-00239` (HTTP 500), leaving $n = 1472$ raw and
$n = 1452$ clean; the Gemma-Q5 runs kept all 1,474 raw records and lost 25
sentinels per run ($n = 1449$). In the curves/ksweep runs, two Arena-Hard-v2
prompts exceed the 2,048-token context (`-00089`, `-00164`) and were dropped,
leaving 178 of 180 prompts for Qwen3-8B (chat $n = 58$); Gemma curves/ksweep
lose three additional sentinel records per run, leaving 175 (math 60, code 60,
chat 55). Finally, two power cuts occurred during measurement; both were
repaired by resuming from the incremental JSONL (union of `results` and
`errors` records) with no data loss.
# Results
## Acceptance dynamics by domain (RQ1)
[@fig:acceptance] (Qwen3-8B-Q4, panels aβg) and [@fig:acceptance-gemma] (Gemma 4 12B-Q4, panels aβd) show per-position acceptance at draft length $k = 3$ for all 11 drafter configurations, split by domain. Three regularities are visible. First, acceptance
decays monotonically with draft position (the well-documented suffix decay
[@oliaro2025suffixdecodingextremespeculativedecoding]): e.g., EAGLE-3 on
Qwen math drops from 0.659 at position 1 to 0.438 at position 2 and 0.238 at
position 3. The decay rate is drafter-specific: Gemma MTP stays near 0.74 at
the third position on math ($0.905 \rightarrow 0.813 \rightarrow 0.737$), while
EAGLE-3 loses most of its value by position 3. Second, chat is generally the
hardest domain: after the first position, its curve lies below math and code in
every configuration; the near-zero Qwen DFlash panels are the exception at
position 1. Third, the domain gap is much larger on Gemma than on
Qwen, both absolutely and per position: for Gemma DFlash-F16 the first
position accepts 0.888 of math drafts but only 0.652 of chat drafts, and by
position 3 chat acceptance falls to 0.322 (vs. 0.635 for math); on Qwen the
same drafter family shows a smaller spread (e.g., DSpark p=0.0: 0.835 vs.
0.692 at position 1).
Table [@tbl:alpha-tau] aggregates acceptance over the full 256-token
generations of the final runs. Chat is generally the lowest-acceptance domain,
especially on Gemma; near-zero Qwen DFlash and gated DSpark are exceptions,
while the relative ordering of math and code is configuration-dependent.
Gemma shows
the sharpest penalty: chat $\alpha$ ranges 0.463β0.608 while math $\alpha$
ranges 0.770β0.837, a gap of roughly 0.2β0.3. On Qwen the gap is smaller
(EAGLE-3: 0.428 vs. 0.445; DSpark p=0.0: 0.549 vs. 0.706) and vanilla-1.7B
keeps the highest chat acceptance of the non-gated Qwen configurations (0.684;
only DSpark at $p_\mathrm{min}=0.6$ reaches 0.723). This generally reversed
"chat paradox" (for viable drafters, the workload that dominates real-world
use of local models benefits the least from drafting) differs from the domain
ordering reported by Mahmoud
[@mahmoud2026acceptancedynamicscognitivedomains], who found chat to be the
*highest*-acceptance domain with a small independent draft on a 7B target
(0.565 vs. 0.518 for math); the Discussion analyzes this difference. For the
viable drafters, measured speedups on chat are generally the smallest of the
three domains (see RQ2); the near-zero DFlash case is an unhelpful exception.
Thus, gains reported on math-heavy or code-heavy suites can overestimate what a
typical chat user will see.
| Family | Config | Math $\alpha$ ($\tau$) | Code $\alpha$ ($\tau$) | Chat $\alpha$ ($\tau$) | All $\alpha$ ($\tau$) |
| :--- | :------------- | :---: | :---: | :---: | :---: |
| Qwen3-8B | q4-vanilla17b | 0.784 (178) | 0.716 (173) | 0.684 (169) | 0.725 (173) |
| Qwen3-8B | q4-eagle3 | 0.445 (144) | 0.447 (144) | 0.428 (133) | 0.440 (141) |
| Qwen3-8B | q4-dflash | 0.009 (6) | 0.009 (7) | 0.010 (7) | 0.009 (7) |
| Qwen3-8B | q4-dspark-p0 | 0.706 (171) | 0.606 (163) | 0.549 (154) | 0.616 (162) |
| Qwen3-8B | q4-dspark-p2 | 0.707 (171) | 0.606 (163) | 0.561 (154) | 0.621 (162) |
| Qwen3-8B | q4-dspark-p4 | 0.712 (171) | 0.622 (163) | 0.616 (150) | 0.646 (161) |
| Qwen3-8B | q4-dspark-p6 | 0.743 (169) | 0.684 (157) | 0.723 (138) | 0.714 (154) |
| Qwen3-8B | q5-eagle3 | 0.446 (144) | 0.450 (144) | 0.421 (132) | 0.439 (140) |
| Qwen3-8B | q5-dflash | 0.009 (7) | 0.009 (6) | 0.009 (7) | 0.009 (7) |
| Qwen3-8B | q5-dspark-p0 | 0.699 (171) | 0.609 (163) | 0.542 (153) | 0.613 (162) |
| Qwen3-8B | q8-eagle3 | 0.441 (144) | 0.442 (144) | 0.414 (132) | 0.432 (140) |
| Qwen3-8B | q8-dspark-p0 | 0.703 (171) | 0.603 (163) | 0.538 (153) | 0.611 (162) |
| Gemma 4 12B | q4-dflash-f16 | 0.776 (175) | 0.718 (167) | 0.475 (126) | 0.657 (156) |
| Gemma 4 12B | q4-dflash-q4 | 0.770 (174) | 0.708 (166) | 0.463 (124) | 0.647 (155) |
| Gemma 4 12B | q4-dflash-q8 | 0.775 (175) | 0.718 (167) | 0.474 (126) | 0.656 (156) |
| Gemma 4 12B | q4-mtp | 0.830 (179) | 0.783 (172) | 0.603 (140) | 0.739 (164) |
| Gemma 4 12B | q5-dflash-f16 | 0.782 (176) | 0.724 (167) | 0.469 (126) | 0.659 (157) |
| Gemma 4 12B | q5-mtp | 0.837 (180) | 0.788 (172) | 0.608 (142) | 0.745 (165) |
| Gemma 4 12B | q8-dflash-f16 | 0.780 (175) | 0.727 (167) | 0.464 (124) | 0.658 (156) |
| Gemma 4 12B | q8-mtp | 0.837 (179) | 0.790 (172) | 0.607 (140) | 0.745 (164) |
: Acceptance $\alpha$ (fraction of drafted tokens accepted) and $\tau$ (mean accepted draft tokens per prompt), shown as $\alpha$ ($\tau$), by configuration and domain (final runs, $k = 3$). {#tbl:alpha-tau}
{#fig:acceptance}
{#fig:acceptance-gemma}
**Takeaway.** Acceptance falls off quickly the further the draft looks ahead, and
aggregate acceptance is lowest on chat, the domain users actually run on local
GPUs. Any speedup reported on math/code suites overstates what chat workloads
will deliver.
## Modern drafters on consumer hardware (RQ2)
[@tbl:speedup] reports per-domain and overall speedups (ratio of means vs.
same-quantization target-only, same prompt set) for the 20 drafter
configurations, and [@fig:speedup] plots overall speedup against overall
$\alpha$ per configuration and domain. The transfer of datacenter gains to
this 16 GB GPU is real but drafter-dependent.
**DSpark is the fastest Qwen drafter.** With $p_\mathrm{min} = 0.0$ on
Qwen3-8B-Q4 it reaches 87.6 tok/s, $1.64\times$ overall (math $1.79\times$,
code $1.63\times$, chat $1.53\times$), and $1.93\times$ overall at Q8_0 (up to
$2.11\times$ on math) at 62.3 tok/s, the largest speedups of any Qwen
configuration. Its acceptance is moderate ($\alpha \approx 0.61$β0.62) and
stable across quantizations.
**EAGLE-3 is solid and quantization-robust.** It delivers $1.39\times$,
$1.46\times$ and $1.63\times$ at Q4/Q5/Q8 (74.4, 68.3 and 52.8 tok/s) while
$\alpha$ stays essentially constant (0.440/0.439/0.432). The speedup grows as
the target gets slower because the drafter cost is paid in draft tokens, not
in acceptance quality.
**The vanilla 1.7B drafter is surprisingly competitive on Q4.** It reaches
$1.41\times$ (75.5 tok/s) with the highest acceptance among Qwen
configurations ($\alpha = 0.725$; only Gemma's MTP head is higher, at
0.739β0.745), only 14% below DSpark at a fraction of the complexity.
Its per-position decay is the gentlest observed (math: $0.873 \rightarrow 0.686$
across positions 1β3), confirming that for an 8B target a small same-family
drafter can already carry most of the value.
**DFlash on Qwen fails, an important negative result.** Despite a block-7
drafter of comparable size to EAGLE-3's, the DFlash drafts are accepted at
$\alpha \approx 0.009$, i.e. essentially never (per-position acceptance stays
0.02β0.00). The system then degenerates into running both models per step and
slows down to $0.63\times$ (33.4 tok/s vs. 53.4 baseline), at every
quantization (0.63β$0.66\times$). This is drafter- and target-specific, not a
general DFlash failure: on Gemma 4 12B the same architecture is the strongest
drafter, reaching 2.09β$2.30\times$ (DFlash) and 2.39β$2.71\times$ (MTP). We
speculate the Qwen DFlash GGUF draft is distributionally incompatible with the
target's sampling (e.g. vocabulary or positional mismatch), which future work
should audit; for practitioners, the takeaway is that a same-size diffusion
drafter on a fast target can cost more than it saves.
**Gemma's block drafters are the best absolute performers.** MTP and DFlash
reach 2.39β$2.71\times$ and 2.09β$2.30\times$ respectively (82.7 and 78.4
tok/s at Q4) because the Gemma Q4/Q5/Q8 targets are far slower (34.7/29.9/19.9
tok/s solo) and the drafts are cheap: the draft runs at a fraction of the
target cost while acceptance stays high ($\alpha$ 0.65β0.75).
[@fig:speedup] organizes these results into four clusters: Gemma block drafters
in the upper region ($\alpha$ 0.65β0.75, speedup 2.1β$2.7\times$); DSpark and
EAGLE-3 in the middle band ($\alpha$ 0.43β0.62, speedup 1.39β$1.93\times$);
vanilla-1.7B at high $\alpha$ (0.73) with moderate speedup ($1.41\times$); and
DFlash-on-Qwen isolated at $\alpha \approx 0.009$ inside the shaded loss
region. Within a drafter, quantization moves points along a line of roughly
constant $\alpha$ (EAGLE-3) or slightly decreasing $\alpha$ (DSpark), while
the domain markers spread each configuration vertically: chat is generally
the slowest, with near-zero DFlash approximately tied across domains.
| Family | Config | $\alpha$ | $\tau$ | Math x | Code x | Chat x | All x | All tok/s |
| :------------- | :------------- | :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| Qwen3-8B | q4-solo | β | β | β | β | β | β | 53.4 |
| Qwen3-8B | q4-vanilla17b | 0.725 | 173 | 1.50x | 1.40x | 1.36x | 1.41x | 75.5 |
| Qwen3-8B | q4-eagle3 | 0.440 | 141 | 1.40x | 1.41x | 1.37x | 1.39x | 74.4 |
| Qwen3-8B | q4-dflash | 0.009 | 7 | 0.63x | 0.63x | 0.63x | 0.63x | 33.4 |
| Qwen3-8B | q4-dspark-p0 | 0.616 | 162 | 1.79x | 1.63x | 1.53x | 1.64x | 87.6 |
| Qwen3-8B | q4-dspark-p2 | 0.621 | 162 | 1.78x | 1.61x | 1.51x | 1.62x | 86.7 |
| Qwen3-8B | q4-dspark-p4 | 0.646 | 161 | 1.77x | 1.59x | 1.46x | 1.60x | 85.4 |
| Qwen3-8B | q4-dspark-p6 | 0.714 | 154 | 1.73x | 1.50x | 1.33x | 1.51x | 80.7 |
| Qwen3-8B | q5-solo | β | β | β | β | β | β | 46.8 |
| Qwen3-8B | q5-eagle3 | 0.439 | 140 | 1.47x | 1.48x | 1.43x | 1.46x | 68.3 |
| Qwen3-8B | q5-dflash | 0.009 | 7 | 0.66x | 0.66x | 0.66x | 0.66x | 30.8 |
| Qwen3-8B | q5-dspark-p0 | 0.613 | 162 | 1.87x | 1.72x | 1.60x | 1.72x | 80.6 |
| Qwen3-8B | q8-solo | β | β | β | β | β | β | 32.3 |
| Qwen3-8B | q8-eagle3 | 0.432 | 140 | 1.65x | 1.65x | 1.59x | 1.63x | 52.8 |
| Qwen3-8B | q8-dspark-p0 | 0.611 | 162 | 2.11x | 1.91x | 1.78x | 1.93x | 62.3 |
| Gemma 4 12B | q4-solo | β | β | β | β | β | β | 34.7 |
| Gemma 4 12B | q4-dflash-f16 | 0.657 | 156 | 2.33x | 2.22x | 1.71x | 2.09x | 72.2 |
| Gemma 4 12B | q4-dflash-q4 | 0.647 | 155 | 2.54x | 2.41x | 1.85x | 2.26x | 78.4 |
| Gemma 4 12B | q4-dflash-q8 | 0.656 | 156 | 2.47x | 2.35x | 1.81x | 2.21x | 76.6 |
| Gemma 4 12B | q4-mtp | 0.739 | 164 | 2.59x | 2.49x | 2.09x | 2.39x | 82.7 |
| Gemma 4 12B | q5-solo | β | β | β | β | β | β | 29.9 |
| Gemma 4 12B | q5-dflash-f16 | 0.659 | 157 | 2.42x | 2.30x | 1.75x | 2.16x | 64.5 |
| Gemma 4 12B | q5-mtp | 0.745 | 165 | 2.75x | 2.64x | 2.21x | 2.53x | 75.6 |
| Gemma 4 12B | q8-solo | β | β | β | β | β | β | 19.9 |
| Gemma 4 12B | q8-dflash-f16 | 0.658 | 156 | 2.58x | 2.46x | 1.85x | 2.30x | 45.7 |
| Gemma 4 12B | q8-mtp | 0.745 | 164 | 2.94x | 2.82x | 2.36x | 2.71x | 54.0 |
: Speedup by configuration and domain (ratio of means vs. same-quantization target-only over the same prompt set) with overall acceptance $\alpha$, $\tau$ and throughput (tok/s). Baselines (solo) shown for reference. {#tbl:speedup}
{#fig:speedup}
**Takeaway.** Modern drafters do transfer to a 16 GB GPU, but the winner is
the one whose draft cost is genuinely small relative to the target: DSpark on
Qwen ($1.64\times$), DFlash/MTP on Gemma (up to $2.71\times$), and even a plain
1.7B drafter ($1.41\times$). A drafter whose drafts are never accepted
(DFlash-on-Qwen, $0.63\times$) is worse than no drafter at all.
## DSpark confidence gating (RQ2b)
DSpark's confidence-scheduled verification accepts a draft block only when the
drafter's confidence exceeds a threshold $p_\mathrm{min}$; otherwise the
target generates alone. On Qwen3-8B-Q4, raising $p_\mathrm{min}$ from 0.0 to
0.6 behaves exactly as the paper describes: acceptance improves
monotonically, from $\alpha = 0.616$ (p=0.0) to 0.621 (p=0.2), 0.646 (p=0.4)
and 0.714 (p=0.6), with the largest gain in chat ($0.549 \rightarrow 0.723$).
However, throughput *decreases*: 87.6 $\rightarrow$ 86.7 $\rightarrow$ 85.4
$\rightarrow$ 80.7 tok/s, i.e. speedup falls from $1.64\times$ to $1.51\times$
(chat drops hardest: $1.53\times \rightarrow 1.33\times$).
The likely mechanism is a batch-size effect. Tighter gating turns more decode steps
into target-only steps; in batched multi-user serving those target passes are
amortized across many requests, which is the regime DSpark is designed for
[@cheng2026dsparkconfidencescheduledspeculativedecoding]. In our single-user
batch-1 setting the extra target work is paid per request, and the higher
acceptance no longer compensates: each rejected block costs a full target
forward pass that produces nothing. The net effect is a monotone tok/s loss as
$p_\mathrm{min}$ grows, even where $\alpha$ gains are largest.
**Takeaway.** On single-user consumer hardware, confidence-scheduled
verification buys acceptance but not speed, because the extra target work is not
amortized. DSpark's gating knob is a serving-time feature, not a free
single-user speedup; this contrasts directly with the multi-user results in
the DSpark paper.
## Quantization (RQ3)
[@tbl:quantization] crosses target quantization (Q4/Q5/Q8) with drafter for
both families. Two effects stand out.
**Acceptance is robust to target quantization.** EAGLE-3 keeps
$\alpha \approx 0.43$β0.44 across Q4/Q5/Q8 (0.440/0.439/0.432), DSpark stays
at 0.61β0.62 (0.616/0.613/0.611), and Gemma MTP at 0.739β0.745. Quantizing
the target degrades its own generation slightly but does not change how well
it agrees with the drafter, which agrees with the compatibility studies of
Zhang et al. [@zhang2025speculativedecodingmeetsquantization] and Zhao et al.
[@zhao2025qspecspeculativedecodingcomplementary].
**Throughput differences are context-dependent.** For Qwen, where all final
target quantizations use `ctx=8192`, the slower Q8_0 target gives the same
acceptance more time to amortize drafting: EAGLE-3 goes
$1.39\times \rightarrow 1.46\times \rightarrow 1.63\times$ and DSpark
$1.64\times \rightarrow 1.72\times \rightarrow 1.93\times$ across
Q4/Q5/Q8. Gemma Q4/Q5 use `ctx=16384`, whereas Gemma Q8 uses `ctx=8192`, so
its raw throughput and speedup differences cannot be attributed to target
quantization alone. We therefore treat those cross-quantization values as
conditional observations rather than an isolated quantization effect.
**Quantizing the draft is favorable in the tested Gemma setup.** On Gemma-Q4 with DFlash drafts
[@tbl:draft-quant], the Q4_K_M draft is the fastest (78.4 tok/s, $2.26\times$,
$\alpha$ 0.647) and the F16 draft the slowest (72.2 tok/s, $2.09\times$,
$\alpha$ 0.657), yet $\alpha$ differs by only 0.010 across draft
quantizations, so the draft's predictive distribution is preserved. The Q4
draft also saves ~1.0 GiB of VRAM (9,730 vs. 10,766 MiB peak vs. F16) and
reduces the on-disk draft from 1.47 GB (F16) to 0.44 GB (Q4_K_M) or 0.79 GB
(Q8_0). This is a favorable, configuration-specific trade-off whose
applicability beyond this setup is untested.
| Family | Target quant | Drafter | n | tok/s | x vs solo | $\alpha$ | $\tau$ |
| :--- | :---: | :--- | :---: | :---: | :---: | :---: | :---: |
| Qwen3-8B | q4 | Vanilla-1.7B | 1474 | 75.5 | 1.41x | 0.725 | 173 |
| Qwen3-8B | q4 | EAGLE-3 | 1474 | 74.4 | 1.39x | 0.440 | 141 |
| Qwen3-8B | q4 | DFlash-F16 | 1474 | 33.4 | 0.63x | 0.009 | 7 |
| Qwen3-8B | q4 | DSpark p=0.0 | 1474 | 87.6 | 1.64x | 0.616 | 162 |
| Qwen3-8B | q4 | DSpark p=0.2 | 1474 | 86.7 | 1.62x | 0.621 | 162 |
| Qwen3-8B | q4 | DSpark p=0.4 | 1474 | 85.4 | 1.60x | 0.646 | 161 |
| Qwen3-8B | q4 | DSpark p=0.6 | 1474 | 80.7 | 1.51x | 0.714 | 154 |
| Qwen3-8B | q5 | EAGLE-3 | 1474 | 68.3 | 1.46x | 0.439 | 140 |
| Qwen3-8B | q5 | DFlash-F16 | 1474 | 30.8 | 0.66x | 0.009 | 7 |
| Qwen3-8B | q5 | DSpark p=0.0 | 1474 | 80.6 | 1.72x | 0.613 | 162 |
| Qwen3-8B | q8 | EAGLE-3 | 1474 | 52.8 | 1.63x | 0.432 | 140 |
| Qwen3-8B | q8 | DSpark p=0.0 | 1474 | 62.3 | 1.93x | 0.611 | 162 |
| Gemma 4 12B | q4 | DFlash-F16 | 1455 | 72.2 | 2.09x | 0.657 | 156 |
| Gemma 4 12B | q4 | DFlash-Q4 | 1455 | 78.4 | 2.26x | 0.647 | 155 |
| Gemma 4 12B | q4 | DFlash-Q8 | 1455 | 76.6 | 2.21x | 0.656 | 156 |
| Gemma 4 12B | q4 | MTP | 1455 | 82.7 | 2.39x | 0.739 | 164 |
| Gemma 4 12B | q5 | DFlash-F16 | 1449 | 64.5 | 2.16x | 0.659 | 157 |
| Gemma 4 12B | q5 | MTP | 1449 | 75.6 | 2.53x | 0.745 | 165 |
| Gemma 4 12B | q8 | DFlash-F16 | 1452 | 45.7 | 2.30x | 0.658 | 156 |
| Gemma 4 12B | q8 | MTP | 1452 | 54.0 | 2.71x | 0.745 | 164 |
: Target quantization (Q4_K_M/Q5_K_M/Q8_0) crossed with drafter, per family: throughput (tok/s), speedup vs. same-quant solo, acceptance $\alpha$ and $\tau$ (final runs, $k = 3$). {#tbl:quantization}
| Drafter (draft quant) | n | tok/s | x vs solo | $\alpha$ | $\tau$ | max VRAM (MiB) |
| :--- | :---: | :---: | :---: | :---: | :---: | :---: |
| DFlash-F16 | 1455 | 72.2 | 2.09x | 0.657 | 156 | 10766 |
| DFlash-Q4 | 1455 | 78.4 | 2.26x | 0.647 | 155 | 9730 |
| DFlash-Q8 | 1455 | 76.6 | 2.21x | 0.656 | 156 | 10043 |
: Effect of draft quantization on Gemma 4 12B-Q4 (DFlash drafts, final runs). F16 = 1.47 GB draft, Q4_K_M = 0.44 GB, Q8_0 = 0.79 GB (model hashes). {#tbl:draft-quant}
**Takeaway.** In the tested configurations, target quantization changes
acceptance only modestly, and a Q4 draft is both faster and ~1 GiB cheaper than
an F16 draft on Gemma-Q4. Throughput comparisons across target quantizations
must retain their context-window conditions. On this 16 GB card, Q4 target plus
Q4 draft is a practical operating point, not a universal rule.
## Break-even maps (RQ4)
Following the OLS methodology used for Apple Silicon by Fonal
[@fonal2026crossfamilyspeculativedecodingpolish] (adapted from Bielik et
al.), we fit, per configuration and draft length $k$, a least-squares line
$TPS = a + \beta \cdot \alpha$ over the per-prompt $(\alpha, \mathrm{tok/s})$
pairs of the ksweep runs, and define the break-even acceptance
$\alpha_{be} = (TPS_{base} - a)/\beta$, where $TPS_{base}$ is the mean tok/s
of a target-only baseline matched by target, context, prompt-set content, and
sampling protocol; the estimate uses only prompt IDs shared by both runs.
95% CIs come from the delta method on the OLS covariance. [@tbl:breakeven] and
[@fig:breakeven] report the pooled (all-domain) results for $k \in \{5, 7,
10\}$.
**On the RTX 4060 Ti, several tested configurations break even at low
acceptance.** The pooled $\alpha_{be}$ ranges are 10.7β39.6% at $k=5$,
11.0β39.9% at $k=7$ and 6.5β32.8% at $k=10$. For the best drafters the map
is striking: Gemma DFlash-F16 needs only $\alpha_{be} = 0.065$ at $k=10$
(0.118 at $k=5$), and Qwen EAGLE-3 ranges from 0.185 to 0.232 across the
three draft lengths. The upper end of the full RTX range overlaps only the
low end of the Apple-Silicon reference of 38.0β52.8% at $k=2$; the best
block drafters remain below that band, and all tested RTX values are below
its 77.7β90.1% range at $k=4$ [@fonal2026crossfamilyspeculativedecodingpolish].
The comparison is directional: the platforms, engines, target/drafter
combinations, and draft-length ranges differ. Within this matched ctx=2,048
protocol, the target-only baselines are slow enough that low acceptance
clears the measured drafting cost for the best configurations.
**The slope $\beta$ generally grows with $k$.** Longer drafts usually win more
tok/s per unit of acceptance (e.g. Gemma DFlash-F16: $\beta = 96.8 \rightarrow
110.3 \rightarrow 185.7$ for $k = 5/7/10$), which often lowers $\alpha_{be}$
with $k$. Qwen Q4 DFlash-F16 is the exception: its slope peaks at $k=7$ and
its pooled map stays nearly flat at 0.157β0.160; Qwen Q4 DSpark varies only
from 0.182 to 0.187.
[@fig:ksweep] shows the per-position acceptance curves behind these maps for
two Qwen3-8B-Q4 configurations: extending the draft from $k=5$ to $k=10$
adds positions with progressively lower acceptance (suffix decay), yet the
break-even gains at larger $k$ come from the slope $\beta$, not from higher
late-position acceptance.
{#fig:ksweep}
The fits are near-deterministic: $R^2$ ranges 0.86β1.00 across all pooled
configurations (mostly above 0.99), so $\alpha_{be}$ is stable within this
measurement protocol rather than an artifact of noisy data. It remains a
diagnostic of the tested hardware, engine, context, and drafter combination,
not a universal hardware constant.
**Slow targets and slow drafters bracket the map.** Under the matched
ctx=2,048 baselines, Qwen Q8_0 runs at 31.8 tok/s versus 51.5 tok/s for Q4,
and EAGLE-3 has $\alpha_{be}=0.110$β$0.116$ across the sweep; a slower
target is cheaper to pay with acceptance. Conversely the vanilla 1.7B drafter
has the highest break-even of all (0.328β0.399): its flatter slope
($\beta = 89$β117) means each accepted token buys less, so it needs
substantially more acceptance to justify itself. Domain-level maps track the
pooled values within a few points (e.g. Qwen Q4 EAGLE-3 $k=7$: 0.220β0.247 across
math/code/chat), i.e. the break-even picture is domain-insensitive.
| Config | k | baseline (tok/s; n/match) | beta (slope) | alpha_be | CI95 | R2 |
| :--- | :---: | :---: | :---: | :---: | :---: | :---: |
| Gemma Q4 / DFlash-F16 | 10 | 33.5; 175/175 | 185.65 | 0.065 | 0.008 | 0.997 |
| Gemma Q4 / DFlash-F16 | 5 | 33.5; 175/175 | 96.78 | 0.118 | 0.012 | 0.993 |
| Gemma Q4 / DFlash-F16 | 7 | 33.5; 175/175 | 110.32 | 0.144 | 0.009 | 0.996 |
| Gemma Q4 / MTP | 10 | 33.5; 175/175 | 162.16 | 0.084 | 0.010 | 0.996 |
| Gemma Q4 / MTP | 5 | 33.5; 175/175 | 97.16 | 0.107 | 0.014 | 0.990 |
| Gemma Q4 / MTP | 7 | 33.5; 175/175 | 106.38 | 0.147 | 0.012 | 0.993 |
| Qwen Q4 / DFlash-F16 | 10 | 51.5; 178/178 | 155.12 | 0.160 | 0.060 | 0.858 |
| Qwen Q4 / DFlash-F16 | 5 | 51.5; 178/178 | 142.47 | 0.159 | 0.029 | 0.963 |
| Qwen Q4 / DFlash-F16 | 7 | 51.5; 178/178 | 157.21 | 0.157 | 0.024 | 0.974 |
| Qwen Q4 / DSpark p=0 | 10 | 51.5; 178/178 | 152.84 | 0.183 | 0.004 | 0.999 |
| Qwen Q4 / DSpark p=0 | 5 | 51.5; 178/178 | 126.65 | 0.187 | 0.012 | 0.992 |
| Qwen Q4 / DSpark p=0 | 7 | 51.5; 178/178 | 150.92 | 0.182 | 0.009 | 0.996 |
| Qwen Q4 / EAGLE-3 | 10 | 51.5; 178/178 | 179.97 | 0.185 | 0.004 | 0.999 |
| Qwen Q4 / EAGLE-3 | 5 | 51.5; 178/178 | 124.01 | 0.212 | 0.003 | 0.999 |
| Qwen Q4 / EAGLE-3 | 7 | 51.5; 178/178 | 136.39 | 0.232 | 0.002 | 1.000 |
| Qwen Q4 / Vanilla-1.7B | 10 | 51.5; 178/178 | 116.94 | 0.328 | 0.008 | 0.996 |
| Qwen Q4 / Vanilla-1.7B | 5 | 51.5; 178/178 | 89.13 | 0.396 | 0.017 | 0.978 |
| Qwen Q4 / Vanilla-1.7B | 7 | 51.5; 178/178 | 93.02 | 0.399 | 0.007 | 0.997 |
| Qwen Q8 / EAGLE-3 | 10 | 31.8; 178/178 | 149.50 | 0.111 | 0.004 | 0.999 |
| Qwen Q8 / EAGLE-3 | 5 | 31.8; 178/178 | 99.71 | 0.116 | 0.004 | 0.999 |
| Qwen Q8 / EAGLE-3 | 7 | 31.8; 178/178 | 124.64 | 0.110 | 0.004 | 0.999 |
: Break-even acceptance $\alpha_{be}$ per configuration and draft length $k$ (ksweep runs, ctx 2,048, pooled over domains). All baselines use ctx=2,048; the baseline is matched by target, prompt-set content, and sampling protocol. `n/match` reports the baseline records retained and shared with the ksweep. OLS fit $TPS = a + \beta \alpha$; CI95 by delta method. $\alpha_{be} > 1.00$ means no achievable break-even. Reference on Apple Silicon: $k=2$: 38.0β52.8%, $k=4$: 77.7β90.1% [@fonal2026crossfamilyspeculativedecodingpolish]. {#tbl:breakeven}
![Break-even acceptance $\alpha_{be}$ vs. draft length $k$ on RTX 4060 Ti 16 GB (ksweep, pooled over domains; error bars: 95% CI). All RTX baselines use ctx=2,048 and a matched prompt set/protocol. Gold band: M2 Pro compact reference range 40β77% (k=2β4) of Fonal [@fonal2026crossfamilyspeculativedecodingpolish]; dashed line: $\alpha_{be} = 1.0$ (no break-even). The RTX curves sit just below the lower edge of this compact reference band; the upper end slightly overlaps the exact $k=2$ reference range, and the cross-platform comparison is directional.](figures/F3_breakeven.png){#fig:breakeven}
**Takeaway.** On a 16 GB consumer GPU, the tested configurations break even at
acceptance rates as low as 6.5%, with a pooled range of 6.5β39.9% across the
sweep. The upper end of this range slightly overlaps the low end of the
38β90% reported on Apple Silicon, while all tested values are below its
$k=4$ range; that cross-platform comparison is directional rather than
controlled. The slower
the target and the longer the draft, the cheaper it is to pay with acceptance;
only a slow drafter like vanilla-1.7B demands substantial acceptance
(33β40%) to justify itself.
# Discussion
## Why datacenter numbers do not transfer
The gap between published datacenter speedups and what we measure has a
structural cause, visible in the speedup formula
$(1 + \mathbb{E}[\tau]) / (1 + c_d/c_v)$: every result is a race between the
tokens a drafter gets accepted ($\mathbb{E}[\tau]$) and the relative cost of
drafting ($c_d/c_v$). Datacenter serving changes the second term, not the
first. DSpark is the clearest case. Its confidence-scheduled verification is
designed for batched multi-user serving, where the target-only steps
introduced by rejection are amortized across many concurrent requests; that is
the regime in which it reports 60β85% faster per-user generation on
DeepSeek-V4 [@cheng2026dsparkconfidencescheduledspeculativedecoding]. In our
batch-1 setting every rejected block costs a full target forward pass paid by
a single request, so raising $p_\mathrm{min}$ raises acceptance ($0.616 \to
0.714$) while *lowering* throughput ($87.6 \to 80.7$ tok/s). The knob is
correctly calibrated, doing exactly what the paper says, but its benefit
only materializes when target work can be shared across users.
DFlash on Qwen is the second case, and it isolates the cost term. The
block-diffusion drafter emits a whole block per forward pass; that cost is
recovered only if the block is accepted. On Gemma-4-12B, where acceptance is
0.65β0.75, DFlash is among the best drafters we measured
($2.09\times$β$2.30\times$); on Qwen3-8B, where acceptance collapses to
$\alpha \approx 0.009$, the same architecture degenerates into running both
models every step and loses to the baseline ($0.63\times$). The DFlash paper
reports more than
$2.5\times$ the speedup of EAGLE-3 on Qwen3-8B; our measurement shows that
gain is not intrinsic to the architecture: it depends on the draft being
distributionally compatible with the target as served (with our GGUF
conversion and greedy sampler it is not), and on the target being slow enough
to absorb the draft cost. This is a concrete instance of the limitation the
DSpark authors themselves flag: the draft-side cost of a full block is
unrecoverable on intrinsically low-acceptance queries.
A third, subtler consequence of the regime difference concerns the domain
ordering itself. Mahmoud [@mahmoud2026acceptancedynamicscognitivedomains]
found chat to be the highest-acceptance domain with a TinyLlama-1.1B draft on
a 7B target, attributing the effect to the lexical predictability of the
RLHF-aligned register. We instead generally find lower chat acceptance on
these 8β12B GGUF targets, especially for Gemma and viable drafters; near-zero
Qwen DFlash and gated DSpark are exceptions, while the relative ordering of
math and code changes slightly across configurations. Two non-exclusive
explanations are
plausible, but this experiment does not identify their separate causal
contributions. First, our drafters are target-dependent: conditioning on the
target's hidden states may favor structured, low-entropy continuations of math
and code, while open-ended chat remains hard to predict. Second, our targets
are larger, quantized, and decoded greedily, which may change the relative
advantage of a same-family draft. These are hypotheses rather than causal
tests. The two studies are therefore best treated as complementary: observed
acceptance is a property of the domain together with the drafter, target, and
serving regime, which is why per-family measurements matter.
## Lessons for the local community
Within the limits of a single GPU and engine, our results translate into
concrete recommendations for a 16 GB NVIDIA card:
- **Qwen3-8B at Q4**: use DSpark with $p_\mathrm{min} = 0.0$ ($1.64\times$,
87.6 tok/s) or, if a simpler setup is preferred, the vanilla 1.7B drafter
($1.41\times$, 75.5 tok/s, highest Qwen acceptance). EAGLE-3 ($1.39\times$)
is a solid alternative with a smaller drafter. Avoid DFlash on Qwen:
$0.63\times$ is a measured loss in this setup.
- **Gemma-4-12B**: use the MTP head ($2.39\times$β$2.71\times$) or DFlash with
a Q4_K_M draft ($2.26\times$, 78.4 tok/s) (the quantized draft is both faster
and about 1 GiB cheaper in VRAM than F16).
- **Draft length**: longer drafts pay on slow targets. $\beta$ generally grows
with $k$, so $\alpha_{be}$ often falls from $k=5$ to $k=10$. Qwen Q4
DFlash-F16 is the exception, while Qwen Q4 DSpark changes only slightly.
On Gemma, $k=10$ requires the least acceptance (0.065β0.084); on Qwen the
difference is modest.
- **Quantization**: target Q4_K_M plus a Q4 draft is a practical operating point
in this setup on 16 GB; acceptance barely moves with target quantization, so
the throughput and memory trade-off is the reason to prefer Q8_0 only when its extra target
precision is needed; this study does not measure task accuracy.
- **Domains**: chat is generally the least profitable domain, especially on
Gemma; the near-zero Qwen DFlash case is approximately tied across domains.
Users whose workloads are math- or code-heavy will generally see the
headline speedups, while chat-heavy users will see the smallest ones on
viable drafters.
The general lesson is to measure acceptance before trusting a drafter. The
break-even maps provide the yardstick: if a drafter's $\alpha$ on your
workload is above the $\alpha_{be}$ for your target and $k$, drafting pays.
## What the break-even maps mean
The most consequential result is how generous this hardware is for several
tested configurations. Pooled $\alpha_{be}$ ranges 6.5β39.9% across
$k \in \{5,7,10\}$, and the best drafters break even at single-digit
acceptance (Gemma DFlash-F16: 0.065 at $k=10$; MTP: 0.084). The Apple-Silicon
reference (38.0β52.8% at $k=2$ and 77.7β90.1% at $k=4$
[@fonal2026crossfamilyspeculativedecodingpolish]) is higher at $k=4$ and
overlaps the upper end of our range only at $k=2$. The comparison is
directional: its sweep starts at $k=2$β4, ours
at $k=5$, and the platforms, engines, and model families differ. The mechanism
is visible in the OLS parameters. In the matched ctx=2,048 analysis, the
target baselines are slow and memory-bound on this card, 33.5 tok/s
(Gemma-Q4), 51.5 tok/s (Qwen-Q4), and 31.8 tok/s (Qwen-Q8), while the slope
$\beta$ (tok/s gained per unit of acceptance) is high, 89β186 across
configurations, because a draft forward pass costs a small fraction of the
target's. With $TPS_{base}$ small and $\beta$ large, even modest acceptance
clears the intercept. On the M2 Pro with MLX-LM the
drafters are comparatively more expensive relative to a faster target, so
$\alpha_{be}$ rises. Two consequences follow. First, $\alpha_{be}$ is nearly
domain-insensitive: within this setup, the maps provide a
hardware/engine/context diagnostic, while the achieved acceptance, rather
than the fitted threshold, varies by domain. Second, the variance across
drafters is driven by draft cost: the vanilla 1.7B drafter, with a flatter
slope ($\beta \approx 89$β117), needs 0.328β0.399 acceptance to justify
itself, several times above the best block drafters, because each accepted
token buys less. Draft cost, not raw acceptance, is the lever a practitioner
should optimize.
## Limits of interpretation
Three caveats bound these conclusions. First, the headline speedup is the
ratio of means; the mean and median of the per-prompt ratios agree with it
within a few percent, with the largest divergence (7%) on Gemma DFlash, whose
per-prompt distribution is mildly skewed; point estimates are therefore stable, but
single-prompt speedups can vary widely. Second, the acceptance numbers rest on
records we had to clean: 271 Gemma records with spurious timing sentinels were
excluded, and a handful of deterministic failures reduced the Gemma sample
(see Section Limitations); acceptance at draft position comes from the
2,048-context curves runs, which are deterministic and therefore identical for
those prompts to the final runs, but the absolute tok/s values of the
curves/ksweep runs are not directly comparable with the 8,192/16,384-context
final runs. Third, the whole study is one GPU, one engine, one seed: the
break-even methodology transfers, the specific numbers require re-estimation
on other hardware, exactly as Fonal
[@fonal2026crossfamilyspeculativedecodingpolish] predicted for his own.
# Limitations
- **Single GPU model.** All measurements come from one RTX 4060 Ti 16 GB. The
break-even maps are hardware-, engine- and context-specific diagnostics for
this card and serving setup; as Fonal
[@fonal2026crossfamilyspeculativedecodingpolish] notes, extrapolating to
other GPUs requires re-estimating $\beta$ empirically on that platform.
- **Subsampled datasets.** We evaluate subsets of nine benchmarks (1,474
main / 180 acceptance-curve prompts) with a fixed seed 42, not the full
sets; domain-level aggregates are therefore indicative rather than
benchmark-complete.
- **One engine, one decoding regime.** Everything runs through llama.cpp's
`llama-server` with non-thinking mode (`--reasoning off`) and greedy
decoding; results may differ under sampling, thinking mode, or other
serving stacks (e.g. vLLM).
- **GGUF-specific quantization.** We quantize with Q4_K_M/Q5_K_M/Q8_0 in
GGUF; other schemes (GPTQ, AWQ, W4A16) and full precision may interact with
the drafters differently.
- **Unavailable drafters.** Two planned cells do not exist and are
reported as absent, not omitted: DSpark for Gemma-4-12B, whose public Gemma
DSpark GGUFs use the draft format of pull request \#25549, which llama.cpp
master does not expose (no `LLM_ARCH_DSPARK`); and EAGLE-3 for Gemma-4-12B,
for which no GGUF conversion exists.
- **DFlash-on-Qwen cause not isolated.** The negative result ($\alpha \approx
0.009$ with the official block-7 checkpoint converted to GGUF) is measured
but not explained: we did not determine whether the failure is a conversion
artifact, a vocabulary or positional mismatch, or a genuine model defect.
Auditing it against the original PyTorch checkpoint is future work.
- **Context-window differences.** Final runs use 8,192 tokens (all Qwen3-8B
and Gemma-Q8_0) or 16,384 (Gemma-Q4/Q5); the curves and ksweep runs use
2,048. Because decoding is deterministic, acceptance is identical for the
overlapping prompts, but absolute throughput values are not comparable
across contexts, and the per-position curves do not probe long-context
behavior.
- **Data exclusions.** For the record: the only over-context discards in the
curves/ksweep runs are two Arena-Hard-v2 prompts
(`arena-hard-v2-00089`, `-00164`, both exceeding the 2,048-token context),
leaving 178 of 180 prompts for Qwen and 175 for Gemma. In the final runs,
deterministic failures reduced the Gemma sample: `humaneval-00050` (a
reproducible HTTP 500) left $n=1{,}473$ raw and $n=1{,}455$ clean records
for Gemma-Q4; `arena-hard-v2-00233` (over context) and `-00239` (HTTP 500)
left $n=1{,}472$ raw and $n=1{,}452$ clean for Gemma-Q8; and 271 Gemma
records with spurious timing sentinels (`tok_per_s \ge 1e5` or
`predicted_ms \le 0`) were excluded from all computations (Gemma-Q5: 1,474
raw $\to$ 1,449 clean). The matched Gemma-Q4 ctx=2,048 target-only baseline
used for the break-even fits retained 175 of 178 records after excluding
three additional timing sentinels; the two over-context prompts were stored
in its error log and were not retried. No Qwen records required exclusion.
# Conclusion
This paper reports, to our knowledge, the first systematic evaluation of modern speculative-decoding
drafters on a 16 GB consumer NVIDIA GPU. Over 26 configurations and 1,474
prompts across three domains, DSpark is the strongest Qwen3-8B drafter
($1.64\times$ at Q4, $1.93\times$ at Q8_0), EAGLE-3 transfers robustly
($1.39\times$β$1.63\times$ with acceptance nearly constant across
quantization), and even
a plain 1.7B drafter is competitive ($1.41\times$); on Gemma-4-12B the MTP
head ($2.39\times$β$2.71\times$) and DFlash ($2.09\times$β$2.30\times$)
dominate. We document two negative results with direct practical value: DFlash
on Qwen fails outright ($0.63\times$, $\alpha \approx 0.009$), and DSpark's
confidence gating, although it raises acceptance, reduces single-user
throughput, so it is a serving feature rather than a free local speedup.
Quantizing the target barely moves acceptance, and Q4 draft quantization is
favorable in the tested setup. The matched-context break-even acceptance is
6.5β39.9% in the tested configurations. The upper end slightly overlaps the
low end of the reported Apple-Silicon $k=2$ reference, while all tested values
are below its $k=4$ range; that cross-platform comparison is directional rather
than a controlled estimate of a hardware effect.
Future work proceeds along several lines: cross-family drafting with UAG on
NVIDIA (deferred to a separate experiment); DSpark
difficulty-aware early exit, the direction its authors suggest for making
block drafts profitable on low-acceptance queries; domain fine-tuning of
drafters, explicitly out of scope for this study;
thinking-mode targets, which may change acceptance dynamics substantially;
additional GPUs and platforms to re-estimate the break-even maps; a systematic
study of quantized drafts across drafter families; and larger target models as
VRAM budgets grow.
# Reproducibility
The companion artifact bundle contains everything needed to regenerate
every table, figure, and number in this paper. Public release of that bundle
is planned together with the publication of the manuscript.
- **Software.** llama.cpp at master commit
`07132750825a4f2d27a547cd9cdde1c6f6001885` (version 22), built with CUDA
12.8; Python tooling managed with `uv` (`pyproject.toml`/`uv.lock`).
- **Models.** `experiments/runs/model-hashes.json` records the SHA-256 hash of
every GGUF used (targets, drafts, and quantizations). Models are the
official DeepSpec checkpoints converted to GGUF and are re-downloadable;
`scripts/download_f3.sh` lists the exact files.
- **Prompts.** `experiments/prompts/f1-sample.jsonl` (1,474 fully templated
prompts, seed 42) for the final runs and a 180-prompt stratified
acceptance sample (60 per domain) for the curves and ksweep runs.
- **Scripts.** `scripts/bench_accept.py` is the llama-server runner (greedy
T=0, fixed seed, per-prompt JSONL, incremental resume, retries, and
$\alpha$/$\tau$ extraction); `scripts/analyze_final.py` regenerates all
tables and figures;
`scripts/run_final_chain.sh`, `scripts/run_curves_chain.sh`, and
`scripts/run_ksweep_chain.sh` orchestrate the three measurement campaigns.
- **Raw data.** Each run lives in `experiments/runs/<id>/` and stores
`config.json` (llama.cpp commit, GGUFs, SHA-256 hashes, sampling
parameters), `metrics.json`, the raw `results.jsonl` (per-prompt tok/s,
acceptance, timings), `vram.json`, and the `server*.log` files (including
the per-position `acc per pos` lines used for the curves).
Reproduction, in three steps:
1. **Build and verify.** Set up the toolchain (`uv sync`), build llama.cpp at
the pinned commit, download the GGUFs listed in `model-hashes.json`, and
verify each file's SHA-256.
2. **Measure.** Run `scripts/run_final_chain.sh` (26 configurations),
`scripts/run_curves_chain.sh` (20 configurations, per-position acceptance),
and `scripts/run_ksweep_chain.sh` (21 runs, $k \in \{5,7,10\}$). Each
script is idempotent and resumable.
3. **Analyze.** Run `uv run python scripts/analyze_final.py` to regenerate
the analysis tables and the figures in `manuscript/figures/`.
# References
|