Passer au contenu principal

The problem: autoregressive decoding is slow

Les LLM génèrent du texte 1 token à la fois. Chaque token nécessite un forward pass complet à travers le modèle — chaque poids, chaque couche — avant que le token suivant puisse commencer. Comme l’explique How inference works, cette phase de decode est memory-bandwidth-bound : le GPU lit des gigaoctets de poids depuis la mémoire pour produire un seul token, puis recommence pour le suivant. Les unités de calcul restent inactives la plupart du temps, en attente de données. Votre GPU ne fait pas de travail utile — il attend la mémoire. Le décodage spéculatif exploite cette capacité inutilisée. Au lieu de générer 1 token par forward pass, il devine plusieurs tokens à l’avance et les vérifie tous d’un coup.

The core idea

Le décodage spéculatif utilise 2 modèles qui travaillent ensemble :
  1. Draft model — un petit modèle rapide propose N tokens à l’avance (typiquement 4-8 tokens).
  2. Target model — le grand modèle que vous voulez réellement utiliser vérifie tous les N tokens proposés en un seul forward pass.
Si le modèle cible accepte K des tokens proposés, vous obtenez K+1 tokens pour le coût de 1 forward pass du grand modèle (plus 1 forward pass bon marché du petit modèle). Les prédictions erronées sont écartées et la génération continue à partir du dernier token accepté. Le calcul est simple : avec un taux d’acceptation de 75% et 5 draft tokens, vous obtenez en moyenne environ 2-3 tokens par forward pass du grand modèle au lieu de 1. Cela se traduit directement par une génération 2-3x plus rapide.
Le décodage spéculatif ne change pas la qualité de la sortie. Le modèle cible prend toujours chaque décision d’acceptation, donc la distribution de sortie est mathématiquement identique au décodage autoregressif normal.

N-gram speculative decoding

Au lieu d’utiliser un modèle de brouillon séparé, le décodage spéculatif n-gram examine les N derniers tokens dans la séquence en cours, recherche des motifs correspondants plus tôt dans le contexte, et propose les tokens qui suivaient ce motif. C’est de la recherche de motifs pure dans le texte existant.Par exemple, si les 4 derniers tokens sont def calculate_total( et que le contexte contient plus tôt def calculate_total(items): return sum(, le moteur propose items, :, return, sum comme 4 tokens suivants. Le modèle cible les vérifie ensuite.
Best for: code generation, structured output, repetitive text, templates, log parsing.Worst for: creative writing, diverse open-ended responses, short contexts with no repeating patterns.La spéculation n-gram brille lorsque votre sortie contient des structures répétitives — signatures de fonctions, schémas JSON, code standard. Elle échoue silencieusement (faible taux d’acceptation, retour au décodage normal) lorsque le texte est trop diversifié pour la recherche de motifs.
Pas de téléchargement de modèle supplémentaire, pas de VRAM supplémentaire. Le seul coût est le temps CPU passé à chercher des correspondances dans le contexte — négligeable comparé aux forward passes GPU.

Draft model speculative decoding

Un modèle plus petit de la même famille génère les tokens candidats. Par exemple, Llama-3.1-8B fait le brouillon pour Llama-3.1-70B. Le petit modèle lance sa propre génération autoregressive pour proposer 4-8 tokens, puis le grand modèle les vérifie tous en 1 forward pass.Le taux d’acceptation — la fraction de draft tokens que le modèle cible accepte — se situe typiquement entre 70% et 85% pour des paires de modèles bien assorties. Un taux d’acceptation plus élevé signifie plus d’accélération.
Best for: general-purpose generation when you have VRAM headroom for the smaller model.Memory cost: les deux modèles doivent être chargés simultanément. Un modèle de brouillon 8B ajoute environ 4-5 GB (en quantification Q4) en plus du modèle cible. Planifiez votre model fit en conséquence.Speedup: 1.5-2.5x depending on acceptance rate and draft token count. Diminishing returns past 6-8 draft tokens because acceptance drops for later tokens in the sequence.
Utilisez la même famille de modèles pour le brouillon et la cible. Les paires inter-familles (par exemple, Mistral faisant le brouillon pour Llama) ont des taux d’acceptation bien plus bas car leurs distributions de tokens divergent.

DFlash: a drafter that ships with the model

La plupart des configurations de modèles de brouillon vous laissent trouver un petit modèle compatible et ajuster l’association vous-même. DFlash, le modèle de brouillon de Meta pour Muse Glimmer 30B, passe cette étape : il est livré dans la même release que sa cible et propose des blocs de 16 tokens, que Muse Glimmer vérifie en 1 forward pass. Meta rapporte 3.1x sur une RTX 5090, 1.8x sur une Apple M5 Max, et 1.5x sur une Apple M4 Max. Ce sont des chiffres fournisseurs sans reproduction indépendante encore, donc benchmardez votre propre matériel avant de vous y fier.

Model-native speculative heads: MTP and DSpark

Certaines architectures de modèles sont entraînées à prédire plusieurs tokens futurs simultanément depuis un seul forward pass. Le modèle lui-même produit plusieurs tokens candidats d’un coup — pas de modèle de brouillon séparé, pas de recherche de motifs. Les représentations internes du modèle génèrent les tokens spéculatifs.C’est fondamentalement différent de la spéculation externe : les têtes multi-token sont entraînées conjointement avec le modèle de base, donc elles partagent la même compréhension du contexte.
Best for: models that natively support it. There is no configuration choice — if the model was trained with MTP heads, you enable them; if not, you cannot add them.Current DeepSeek example: DeepSeek-V4-Flash-0731 bundles its DSpark module in the official checkpoint. Select Qwen models use MTP heads instead.Advantage: no separate draft-model checkpoint or model-pair tuning.Disadvantage: requires specific model training. You cannot apply MTP to an arbitrary checkpoint.
L’exemple officiel 0731 utilise la tête DSpark stockée dans le même checkpoint. N’ajoutez pas --speculative-draft-model-path pour ce modèle.
La fiche modèle officielle 0731 documente DSpark pour vLLM et SGLang. Le support matériel varie encore, donc utilisez la recette runtime correspondante et benchmardez votre checkpoint exact. Voir DeepSeek V4 Flash 0731 local hardware.

EAGLE (extrapolation algorithm for greater language-model efficiency)

EAGLE entraîne un petit réseau de “tête” au-dessus des états cachés du modèle cible. Au lieu de charger un modèle de brouillon complet, il attache un réseau neuronal léger aux représentations intermédiaires du modèle cible et les utilise pour prédire les tokens futurs.Comme le réseau de tête lit l’état interne propre du modèle cible, il atteint des taux d’acceptation plus élevés (80-90%) que les modèles de brouillon naïfs. Le réseau de tête est minuscule comparé à un modèle complet — typiquement 5-10% de la taille du modèle cible.
Best for: when available, EAGLE offers the best speedup-to-memory ratio of any technique.Current status: research stage with limited runtime support. vLLM and SGLang have experimental EAGLE integration, but it requires pre-trained EAGLE head checkpoints that are not yet widely published for most model families.When EAGLE support matures, expect: 2-3x speedup with only 5-10% memory overhead — significantly better than full draft models.
Les checkpoints de tête EAGLE sont spécifiques au modèle et à l’architecture. Vérifiez qu’un checkpoint EAGLE publié existe pour votre modèle cible exact avant d’essayer cette technique.

Comparison

N-gram

Extra memory: none Speedup: 1.2-1.5x Requires training: no Runtime support: vLLM, llama.cpp Best for: repetitive content, code, structured output

Draft model

Extra memory: 20-30% extra Speedup: 1.5-2.5x Requires training: no (use a smaller model from the same family) Runtime support: vLLM, llama.cpp Best for: general-purpose generation with VRAM headroom

Multi-token prediction

Extra memory: none Speedup: 1.5-2x Requires training: yes (model-specific) Runtime support: vLLM (select models only) Best for: model-native heads such as DeepSeek V4 Flash 0731 DSpark and supported Qwen MTP variants

EAGLE

Extra memory: 5-10% Speedup: 2-3x Requires training: yes (head network) Runtime support: experimental Best for: best speedup-to-memory ratio when available

When to use speculative decoding

Use it when:
  • Votre charge de travail est decode-bound — de longues générations où la plupart du temps est passé à produire des tokens, pas à traiter le prompt
  • Vous avez de la VRAM headroom pour un modèle de brouillon (au moins 5-10 GB libres au-delà du modèle cible)
  • Vous générez de la sortie structurée ou répétitive — code, templates, JSON, logs
  • Vous servez un seul utilisateur ou une charge de travail à faible concurrence
Do not use it when:
  • Votre charge de travail est prefill-bound — des sorties courtes avec de longues entrées (summarization, classification). Le décodage spéculatif n’accélère que la phase de decode.
  • Vous êtes déjà à votre limite de VRAM. Le modèle de brouillon ou les entrées supplémentaires de cache KV peuvent vous pousser en OOM. Voir DGX Spark memory tuning pour la planification de capacité.
  • Vous utilisez le continuous batching avec une forte concurrence. Le décodage spéculatif entre en conflit avec la planification de lots efficace dans la plupart des runtimes — le pass de vérification suppose une longueur de brouillon fixe par requête, ce qui complique la composition des lots.

Practical setup guide

N-gram speculation in vLLM

Le point de départ le plus simple — pas de téléchargement supplémentaire, pas de mémoire supplémentaire :
Le flag --ngram-prompt-lookup-max définit la taille de fenêtre pour la recherche de motifs. Des valeurs plus grandes trouvent plus de correspondances dans les contextes longs mais ralentissent légèrement l’étape de brouillon. Commencez à 5 et augmentez si l’acceptation est basse.

Draft model in vLLM

Pour une accélération plus forte quand vous avez la VRAM :
Réduisez --max-model-len si vous rencontrez des OOM. Les deux modèles partagent le même pool de VRAM, et le cache KV du modèle de brouillon s’ajoute au total.
Trouver et ajuster une paire de modèles de brouillon comme ceci est le chemin normal. Muse Glimmer 30B de Meta passe cette étape : tirez un tag Ollama se terminant par -dflash (par exemple muse-glimmer:30b-q4_K_M-dflash) et le modèle de brouillon DFlash se charge sans flag --speculative-model à définir.

N-gram speculation in llama.cpp

Le flag --lookup-cache-static met en cache les recherches n-gram à travers les tokens, améliorant la vitesse de brouillon pour les motifs répétitifs.

How to measure the speedup

Lancez le même prompt deux fois — une fois avec le décodage spéculatif et une fois sans — et comparez les tokens par seconde :
Arrêtez le serveur de référence, démarrez le serveur spéculatif, envoyez la même requête, et comparez. Cherchez l’en-tête x-tokens-per-second ou calculez à partir de usage.completion_tokens divisé par le temps réel. Pour du benchmark systématique, utilisez l’outil de benchmark intégré de vLLM :
Une configuration spéculative bien ajustée montre une amélioration de 1.5-2.5x de la latence moyenne de decode sans changement de qualité de sortie ni de nombre de tokens.

Go deeper

Decode and prefill power

Ajustez les phases de prefill et de decode pour un débit maximal sur votre matériel.

How inference works

Comprenez le prefill, le decode, et pourquoi la bande passante mémoire est le goulot d’étranglement.

vLLM on DGX Spark

Configurez vLLM avec des paramètres optimaux incluant le support du décodage spéculatif.

Model fit

Calculez si votre modèle cible plus un modèle de brouillon tiennent dans la VRAM.

Test your deployment

Méthodologie de benchmark systématique pour les déploiements LLM locaux.