Devotd Github
NewInference & serving

mattral/flashspec 0.3.2 — per-call acceptance rate fix

FlashSpec 0.3.2 changes GenerationResult.acceptance_rate to a per-call value, fixing the cumulative-average bug, and updates the version and the container image tag.

Repositorymattral/flashspec ↗

FlashSpec 0.3.2 changes GenerationResult.acceptance_rate to a per-call value, fixing the cumulative-average bug, and updates the version and the container image tag.

GitHub description: Adaptive speculative-decoding inference engine with Triton-optimised verification and online bandit draft selection.

stars
★ 16
Forks
0
Language
Python
License
Apache-2.0
Latest release
v0.1.5
Read original source ↗View on GitHub ↗

mattral/flashspec has released 0.3.2. FlashSpec is a speculative decoding engine for HuggingFace causal language models: tokens proposed by a small drafter model are verified in one batch by the large model, and only the accepted tokens are kept as-is. The license is Apache-2.0. The 0.3.2 release, from commit 2fc7f84 merged on 2026-10-29 (Pull Request #59, 55 files changed, 40 insertions, 15 deletions), is a bug-fix release that keeps the decoding path and speed exactly as they were, and only one thing changed. GenerationResult.acceptance_rate now holds only the result of the single call that returned that value.

Up to the previous version, every call after the first in a given engine returned a cumulative average that summed all preceding calls. Warm-up calls were mixed into that average, which got in the way of seeing which configuration actually works well. The acceptance rate is the share of proposed tokens that the large model accepted — a metric for gauging whether the drafter is worth using — so it should be read per call. The per-step accepted and proposed counts and the arm_steps totals were accurate from the start; only the surfaced values changed this time. The acceptance-rate column in the README and Figure 9 in docs/lessons.md were recomputed from the stored per-step counts, and the numbers in the README tables are still the results of running the 0.3.0 release (bundle 3c43e08). The version string was bumped to 0.3.2 in pyproject.toml and flashspec/__init__.py, CITATION.cff (release date 2026-10-29), deploy/Dockerfile and docker-compose.yml, the k8s manifests, docs/install.md, and the README, and the container image tag also changed to ghcr.io/mattral/flashspec:0.3.2. There is no code for users to fix.

That said, this release stays in Alpha status and comes with no new measurements. The measurement scope stated in the README covers only a single model pair (Qwen/Qwen2.5-1.5B-Instruct verified by Qwen/Qwen2.5-0.5B-Instruct), one Tesla T4, fp16, batch size 1, and 10 MT-Bench and 10 HumanEval prompts; other GPUs and model pairs, and batch sizes, were not measured. The H100 figures in the docs are design goals. UCB1/Thompson drafter selection did not beat the best fixed arm when the seven arms were compared once, and the Triton and assembly kernels remain experimental and outside the generation critical path. The compilation on the first call, the tie in the case of an exact match under fp16 greedy, and the CUDA graph size warning are the same as in 0.3.1. It is a precise fix for a wrong metric, but it does not add evidence, so if you have no plans to read the metric again, this is only a version bump.