Find the speculative-decoding break-even point
Only turn on speculative decoding for a workload where you've actually measured acceptance rate, not one that merely resembles it. That's the whole decision rule. Everything else here is what it costs to earn the right to believe that number.
My reference setup is a large target model paired with a small, related draft model, on ordinary hardware, nothing tuned to make a demo shine. I'm not claiming the configuration holds for every machine, just that the method does. Before touching a setting, write down the actual job: interactive chat, code completion, document extraction, an overnight batch run. Decide what "good" means for that job first, because the whole pitch of speculative decoding is trading extra draft-model work for fewer expensive steps on the target model, and it's easy to improve the visible number while the actual bottleneck sits untouched.
Acceptance rate is a workload property, not a model property
The only way to know whether that trade paid off is to measure acceptance, end-to-end latency, and VRAM across short answers and long generations, using the same inputs every run, with the launch command saved next to the result. One warm sample tells you almost nothing. Include a cold start if your users will ever hit one, and run long enough that thermal throttling or queueing shows up. Quality belongs in the same record as speed: a speedup that changes the answer is a different system, not a faster version of the old one.
What belongs in the log is narrower than what you're tempted to record: time to first token, prompt-processing speed, generation speed, peak memory, wall power where it matters, and whether the task succeeded. Medians describe the ordinary run; the p95 catches the pause that sends someone back to the older, slower setup, because an average quietly erases the moments that annoy people. None of this needs a dashboard. A short note about noise and setup friction next to the numbers tells you more about whether the thing survives than another decimal of throughput will. If you're shopping for hardware for local inference, this is also where the two-model memory overhead shows up, not on a spec sheet.
Five percent evaporates the next driver update
The trap I see most often is borrowing a best-case speedup measured on prose generation and assuming it carries over to code or structured output, where acceptance tends to run lower. Local inference is full of configurations that technically run. Loading isn't a performance result, and the answer looking right isn't an evaluation of it; check the runtime logs and the operating-system metrics instead of trusting the flag you passed at launch. Change one variable at a time and have a reason for why it should move the number, or the whole exercise degrades into a folder of anecdotes with timestamps.
There's a maintenance bill too. A fragile five-percent win doesn't survive the next model release, driver update, or runtime bump, and chasing it repeatedly wastes more than it saves. Keep a small script, a handful of prompts that represent your workload, and a plain-text file of past results; that's enough to retest after an upgrade without building a platform for one workstation. It's the same discipline that makes sense anywhere you're trying to squeeze more out of a local tier instead of reaching for a bigger card.
The rule, again: deploy speculation only where measured acceptance stays high, test the smallest plausible change first, keep headroom rather than spend it all now, and stop tuning once the workflow clears its latency and quality target. Spare capacity is what absorbs the longer prompt next week, the background job you forgot was running, and whichever model you try next month.
I'll admit the honest version of this takes longer than most people are willing to give it, and there's a decent chance you'll just run the draft model for an afternoon, notice it feels faster, and ship it without building the harness I just described. I've done exactly that more than once, and regretted about half of it.