Décodage spéculatif et sortie précoce : accélération du décodage auto-régressif
La méthode de rédaction puis de vérification, ainsi que les sorties par couche basées sur la confiance, réduisent le délai de décodage lorsque les budgets de validation et de précision le permettent.
Pourquoi l’optimisation du décodage se situe sur le chemin critique
L’inférence des LLM comporte une phase de préremplissage qui s’exécute en parallèle pour le prompt, ainsi qu’une phase de décodage qui émet les tokens séquentiellement. Le préremplissage peut saturer les GPU ; le décodage, lui, ne le fait souvent pas, car chaque nouveau token dépend du précédent. C’est cette dépendance séquentielle qui explique pourquoi la latence interactive reste élevée, même lorsque le nombre de FLOPs semble suffisant en théorie.
Prefill phase:
Input: [token_1, token_2, ..., token_512] → all 512 tokens processed in parallel
Matrix shape: [batch, 512, 4096]
GPU utilization: high — large matrix, full Tensor Core throughput
Decode phase (one step):
Input: [token_513] → one token processed
Matrix shape: [batch, 1, 4096]
GPU utilization: low - tiny matrix, most CUDA cores idle
Structure d’attention pendant le décodage
À chaque étape de décodage, le modèle génère des requêtes à l’aide d’un cache clé/valeur qui s’agrandit progressivement. Le travail par étape augmente avec la longueur du contexte, tandis que les possibilités de regroupement des opérations sont limitées par les objectifs de latence requis pour les conversations.
One attention head, decode step:
Query Q: [8, 1, 128] → 8 × 128 = 1,024 elements
Keys K: [8, 2048, 128] → 8 × 2048 × 128 = 2M elements
Values V: [8, 2048, 128] → same
Matrix multiply (QKᵀ) per head:
Shape: [8, 1, 128] × [8, 128, 2048] → [8, 1, 2048]
FLOPs: 8 × 1 × 128 × 2048 ≈ 2.1M FLOPs per head
For 32 heads: ≈ 67M FLOPs per layer
For 32 layers: ≈ 2.1B FLOPs total per decode step
A100 peak at BF16: ~312 TFLOPS = 312 × 10¹² FLOPs/sec
Time to execute 2.1B FLOPs at 100% utilization:
2.1 × 10⁹ / 312 × 10¹² ≈ 0.0067 ms
Actual observed decode latency per step: ~10–30ms
Effective compute utilization: < 0.1%
Décodage spéculatif : ébaucher puis vérifier
Without speculative decoding:
Generate 5 tokens: 5 × 30ms = 150ms
With speculative decoding (K=4):
Draft 4 tokens: 4 × 1.5ms = 6ms
1 target verification pass: ~35ms (slightly longer than decode,
processes K+1=5 positions)
Expected accepted tokens per round:
(1 - 0.80^5) / (1 - 0.80) ≈ 3.36 tokens
Time per round: 6ms + 35ms = 41ms
Time per token: 41ms / 3.36 ≈ 12.2ms
Speedup: 30ms → 12.2ms ≈ 2.5×
import torch
import torch.nn.functional as F
def speculative_decode(target_model, draft_model, input_ids,
max_new_tokens, K=4, temperature=1.0):
"""
Conceptual speculative decoding loop.
Real implementations handle KV cache management across both models.
"""
generated = input_ids.clone()
while generated.shape[1] - input_ids.shape[1] < max_new_tokens:
# --- Draft phase ---
draft_tokens = []
draft_probs = []
draft_input = generated.clone()
for _ in range(K):
with torch.no_grad():
draft_logits = draft_model(draft_input).logits[:, -1, :]
q = F.softmax(draft_logits / temperature, dim=-1)
token = torch.multinomial(q, num_samples=1)
draft_tokens.append(token)
draft_probs.append(q)
draft_input = torch.cat([draft_input, token], dim=1)
# --- Verify phase: one target forward pass over all K+1 positions ---
verify_input = torch.cat([generated] + draft_tokens, dim=1)
with torch.no_grad():
target_logits = target_model(verify_input).logits
# target_logits[:, -K-1:, :] covers all K draft positions + bonus
# --- Accept/reject ---
accepted = 0
for i in range(K):
p = F.softmax(target_logits[:, -(K+1)+i, :] / temperature, dim=-1)
q = draft_probs[i]
token = draft_tokens[i]
# Acceptance probability
accept_prob = torch.min(
torch.ones_like(p.gather(1, token)),
p.gather(1, token) / (q.gather(1, token) + 1e-9)
)
if torch.rand(1) < accept_prob:
generated = torch.cat([generated, token], dim=1)
accepted += 1
else:
# Sample corrected token and stop this round
corrected_dist = F.relu(p - q)
corrected_dist = corrected_dist / corrected_dist.sum(dim=-1, keepdim=True)
corrected_token = torch.multinomial(corrected_dist, num_samples=1)
generated = torch.cat([generated, corrected_token], dim=1)
break
else:
# All K accepted - take bonus token
bonus_logits = target_logits[:, -1, :]
p_bonus = F.softmax(bonus_logits / temperature, dim=-1)
bonus_token = torch.multinomial(p_bonus, num_samples=1)
generated = torch.cat([generated, bonus_token], dim=1)
return generated
Lorsque les brouillons divergent
Sortie anticipée : arrêtez les couches profondes dès que vous en êtes sûr
Certaines architectures permettent de quitter les couches intermédiaires lorsque la confiance est élevée, ce qui permet d’économiser des ressources de calcul sur les tokens « faciles ».
Layer distribution of exits:Exit at layers 1–8 (very easy tokens like punctuation, articles): 15%
Exit at layers 9–16 (medium tokens, common continuations): 35%
Exit at layers 17–24 (harder tokens, named entities, numbers): 30%
Exit at layers 25–32 (full computation required): 20%Weighted average layers executed:
0.15 × 6 + 0.35 × 12 + 0.30 × 20 + 0.20 × 32
= 0.90 + 4.20 + 6.00 + 6.40
= 17.5 layers averageSpeedup vs always running 32 layers:
32 / 17.5 ≈ 1.83×
Il convient d’évaluer soigneusement l’impact sur la précision : le départ précoce compromet la qualité au profit de la vitesse et est sensible à la calibration.
Décodage spéculatif vs départ précoce
Le décodage spéculatif modifie le cycle de proposition des tokens en utilisant un deuxième modèle ; le départ précoce modifie la profondeur de traitement au sein d’un seul modèle. Ils traitent différemment des goulets d’étranglement similaires et peuvent parfois être combinés avec la quantification, le lotage continu et le pagination du cache KV.
Combined stack example:
Target: 7B model, BF16, FlashAttention, PagedAttention
→ Model: ~14 GB, memory-efficient attention, paged KV cache
Draft: 70M model, INT4, FlashAttention
→ Model: ~35 MB, near-zero memory overhead
Speculative decode:
→ with K=4, α=0.80
→ ~2.5× token generation speedup on long outputs
Full stack speedup vs FP32 no-optimization baseline:
- Quantization: 2–2.3× throughput
- FlashAttention: 20–40% attention latency reduction
- Speculative decoding: 2–2.5× decode speedup (on eligible requests)
Combined: 5–8× improvement in end-to-end tokens/second
Quand chacun est utile
Le décodage spéculatif est utile lorsque le degré d’accord préliminaire est élevé et que les étapes cibles dominent la latence. Il échoue lorsque les drafts correspondent rarement ou que les coûts de génération préliminaire dépassent les gains obtenus. Le départ précoce est utile lorsque de nombreux tokens sont faciles et que les budgets de précision le permettent ; il échoue sur des tokens difficiles ou en cas d’une confiance mal calibrée.
Perspective de production
Envoyer des métriques : taux d’acceptation, longueur moyenne acceptée, écarts d’évaluation de la qualité, utilisation du GPU et latence p95. Optimisations via des flags fonctionnels. Conserver un interrupteur de secours pour le décodage classique. N’oubliez pas que le goulot d’étranglement restant peut être la bande passante mémoire, le réseau ou le rendu côté client — et non seulement les FLOPs — donc profilez avant d’appliquer chaque astuce théorique.
Conclusion
Le remplissage préalable et le décodage sollicitent différemment le matériel. Le décodage spéculatif et la sortie anticipée constituent des leviers pratiques à considérer en fonction de vos courbes d’acceptation et de précision. Traitez-les comme des fonctionnalités de production avec des tableaux de bord, et non comme des benchmarks ponctuels ; ils se montreront alors utiles avec un trafic réel.
Scénario de référence pour une meilleure intuition
Imaginez un modèle cible de 7 milliards de paramètres servant aux conversations avec des réponses de 50 à 150 tokens. Le pré-chargement d’un prompt système de 2 000 tokens est lourd mais peu fréquent par tour ; les étapes de décodage sont responsables du retard perçu par l’utilisateur. Réduire le nombre d’étapes de décodage grâce à des acceptations spéculatives, ou diminuer le travail par étape en arrêtant prématurément, améliore la perception des utilisateurs.
Liste de contrôle opérationnelle
- Valeurs de référence pour le p95 et la qualité.
- Ajouter un modèle de brouillon situé au même endroit pour éviter les retards réseau.
- Enregistrer des histogrammes d’acceptation.
- Comparer la qualité en mode A/B sur des ensembles de données factuelles.
- Vérifier l’équilibre CPU/GPU lorsque les brouillons sont exécutés sur des appareils différents.
- Revoir les paramètres après chaque modification du tokenizer ou du fine-tuning.
Péchés courants
Utilisation d’un brouillon aléatoirement non pertinent ; ignorance des effets de la température sur l’acceptation ; proclamation de la victoire à partir des bancs d’essai de débit sans contrôles de qualité ; accumulation de sorties anticipées avec une quantification agressive jusqu’à ce que les hallucinations augmentent fortement. Chacun de ces problèmes est mesurable — d’abord avec des instruments.
Guides approfondis pour les équipes de plateforme
Centralisez l’optimisation des inférences dans la couche de service afin que les équipes d’applications n’aient pas à inventer séparément la sélection des brouillons. Faites apparaître des en-têtes ou des attributs de suivi indiquant si une décodage spéculatif ou une sortie anticipée a été utilisée. Associez des étiquettes d’optimisation aux factures de tokens de remboursement afin que le service financier puisse constater les gains. Entraînez-vous aux retraits de mise à jour. Documentez que le décodage spéculatif ne supprime pas la nécessité d’une bonne récupération des données ou de bons prompts — il rend simplement la génération des tokens suivants moins coûteuse lorsque le modèle sait déjà ce qu’il veut dire.
Plus de détails sur l’accumulation
Associez avec prudence le lotage continu à la spéculation : les longueurs des brouillons interagissent avec les hypothèses du planificateur. Associez-le aux politiques d’éviction de la mémoire cache KV afin que les conversations longues ne provoquent pas de surcharge. Associez-le également au stockage en cache des prompts côté préremplissage, afin de ne pas “corriger la décodage” tout en gaspillant des ressources pour le préremplissage. Une conception globale de l’affichage est supérieure à un élément isolé transplanté dans une étape critique.
FAQ pour les praticiens
La spéculation modifie-t-elle les réponses ? Elle doit correspondre à la distribution cible lorsqu’elle est mise en œuvre correctement ; vérifiez cela avec des tests par paires. L’arrêt prématuré modifie-t-il les réponses ? Oui, par conception, lorsqu’il saute des étapes — prenez en compte l’impact. Pouvons-nous générer du texte sur CPU ? Parfois ; mesurez les performances. Est-ce pertinent pour de petits modèles sur appareil ? Souvent moins que pour des cibles volumineuses. Ordre de priorité : corrigez d’abord le lotage et le stockage en cache, puis la spéculation, ensuite l’arrêt prématuré si la pile technique le permet.
Scénario de référence pour une meilleure compréhension
Imaginez un modèle cible de 7 milliards de paramètres servant aux conversations avec des réponses de 50 à 150 tokens. Le pré-chargement d’un prompt système de 2 000 tokens est lourd mais peu fréquent par tour ; les étapes de décodage sont responsables du retard perçu par l’utilisateur. Réduire le nombre d’étapes de décodage grâce à des acceptations spéculatives, ou diminuer le travail par étape en arrêtant prématurément, améliore la perception des utilisateurs.
Liste de contrôle opérationnelle
- Valeurs de référence pour le p95 et la qualité.
- Ajouter un modèle de brouillon situé au même endroit pour éviter les retards réseau.
- Enregistrer des histogrammes d’acceptation.
- Comparer la qualité en mode A/B sur des ensembles de données factuelles.
- Vérifier l’équilibre entre CPU et GPU lorsque les brouillons sont exécutés sur des appareils différents.
- Revoir les paramètres après chaque modification du tokenizer ou du fine-tuning.
Péchés capitaux courants
Utilisation d’un brouillon aléatoirement non pertinent ; ignorance des effets de la température sur l’acceptation ; proclamation de la victoire à partir des bancs d’essai de débit sans contrôles de qualité ; accumulation de sorties anticipées avec une quantification agressive jusqu’à ce que les hallucinations augmentent fortement. Chacun de ces problèmes est mesurable — d’abord avec des instruments.
Guides approfondis pour les équipes de plateforme
Centralisez l’optimisation des inférences dans la couche de service afin que les équipes d’applications n’aient pas à inventer chacune leur propre méthode de sélection de brouillon. Affichez des en-têtes ou des attributs de suivi indiquant si une décodage spéculatif ou une sortie anticipée a été utilisée. Associez des étiquettes d’optimisation aux factures de tokens de remboursement afin que le service financier puisse constater les gains. Entraînez-vous aux retraits de modifications. Documentez que le décodage spéculatif ne supprime pas la nécessité d’une bonne récupération des données ou de bons prompts — il rend simplement la génération des tokens suivants moins coûteuse lorsque le modèle sait déjà ce qu’il veut dire.
Plus de détails sur l’accumulation
Associez avec prudence le lotage continu à la spéculation : les longueurs des brouillons interagissent avec les hypothèses du planificateur. Associez-le aux politiques d’éviction de la mémoire cache KV afin que les conversations longues ne provoquent pas de surcharge. Associez-le également au stockage en cache des prompts côté préremplissage, afin de ne pas “corriger la décodage” tout en gaspillant des ressources pour le préremplissage. Une conception globale de l’affichage est supérieure à un élément isolé transplanté dans une étape critique.
FAQ pour les praticiens
La spéculation modifie-t-elle les réponses ? Elle doit correspondre à la distribution cible lorsqu’elle est mise en œuvre correctement ; vérifiez cela avec des tests par paires. L’arrêt prématuré modifie-t-il les réponses ? Oui, par conception, lorsqu’il saute des étapes — prenez en compte l’impact. Pouvons-nous générer du texte sur CPU ? Parfois ; mesurez les performances. Est-ce pertinent pour de petits modèles sur appareil ? Souvent moins que pour des cibles volumineuses. Ordre de priorité : corrigez d’abord le lotage et le stockage en cache, puis la spéculation, ensuite l’arrêt prématuré si la pile technique le permet.
Intuition numérique éprouvée
Supposons qu’une étape cible coûte 10 ms et qu’un projet propose 5 tokens avec un taux d’acceptation moyen de 60 % pour 3 tokens. Le coût effectif par token accepté est inférieur à celui des étapes classiques à un seul token, même après les frais liés au projet, tant que le taux d’acceptation reste élevé. Si ce taux tombe à environ 1 token, le système perd en efficacité. C’est cette sensibilité qui fait que les tableaux de bord surpassent les anecdotes.
Protocole de régression de qualité
Au préalable à une mise en œuvre globale, exécutez des prompts fixes dans des tests de Q&A factuel, de codage et de refus. Comparez les taux de réussite identiques en termes de tokens lorsque la configuration spéculative vise une correspondance exacte des distributions. Analysez toute dérive systémique. Pour un arrêt précoce, suivez le taux de réussite sur les tâches notées ainsi que les préférences humaines le cas échéant.
Emplacement du matériel
Colocalisez autant que possible le brouillon et la version finale sur le même nœud. Les brouillons hébergés ailleurs ajoutent des fluctuations réseau qui peuvent annuler les gains obtenus. Faites attention à la mémoire : deux modèles ainsi que le cache KV peuvent épuiser les ressources d’un système qui pouvait aisément en gérer un seul.
Planification des interactions
Les serveurs de traitement par lots continu doivent tenir compte des expansions spéculatives variables. Des planificateurs inefficaces fragmentent les lots et nuisent à l’utilisation des ressources. Coordonnez-vous avec les responsables du service ; ne modifiez pas simplement des paramètres dans le code de l’application.
Honnêteté concernant les goulets d’étranglement restants
Même après amélioration de la décodage, les utilisateurs peuvent encore attendre pour des appels vers des outils, des récupérations de données ou le traitement du Markdown côté client. Suivez le flux de travail de bout en bout. Les optimisations mal ciblées gaspillent du temps d’ingénierie.
Résumé
La décodage séquentiel représente la contrainte structurelle inhérente à l’autorégression. Le décodage spéculatif et la sortie anticipée réduisent cette contrainte dans des conditions mesurables. Il faut les intégrer avec la même rigueur que n’importe quelle fonctionnalité de production : métriques, indicateurs, capacités de réversion, ainsi que des responsables clairement désignés au sein de l’équipe de la plateforme de déploiement.
Intuition numérique éprouvée
Supposons qu’une étape cible coûte 10 ms et qu’un projet préliminaire propose 5 tokens, avec un taux d’acceptation moyen de 60 % pour 3 tokens. Le coût effectif par token accepté est inférieur à celui des étapes classiques utilisant un seul token, même après prise en compte des coûts supplémentaires liés au projet préliminaire, tant que le taux d’acceptation reste élevé. Si ce taux tombe à environ 1 token, le système perd en efficacité. C’est cette sensibilité qui explique pourquoi les tableaux de bord sont supérieurs aux anecdotes.
Protocole de régression de qualité
Au préalable de l’activation globale, exécutez les prompts corrigés sur des ensembles de questions factuelles, de codage et de refus. Comparez les taux de token identiques lorsque le mode spéculatif est configuré pour une correspondance exacte des distributions. Étudiez toute dérive systémique. Pour un arrêt précoce, suivez le taux de réussite sur les tâches notées ainsi que la préférence humaine lorsque cela est possible.
Emplacement du matériel
Colocalisez autant que possible le modèle de brouillon et celui cible sur le même nœud. Utiliser des brouillons sur différents hôtes ajoute du jitter réseau qui peut annuler les gains obtenus. Faites attention à la mémoire : deux modèles plus le cache KV peuvent épuiser les ressources d’un système qui pouvait aisément en accueillir un seul.
Planification des interactions
Les serveurs de batch continu doivent tenir compte des expansions spéculatives variables. Des planificateurs inefficaces fragmentent les batches et nuisent à l’utilisation des ressources. Coordonnez-vous avec les responsables du service ; ne modifiez pas les paramètres uniquement dans le code de l’application.
Honnêteté concernant les goulets d’étranglement restants
Même après une amélioration du décodage, les utilisateurs peuvent encore subir des retards liés aux appels vers l’outil, au récupération des données ou au traitement du Markdown côté client. Il est nécessaire de tracer le processus de bout en bout. Une optimisation inappropriée gaspille du temps d’ingénierie.
Résumé
Le décodage séquentiel représente la contrainte structurelle inhérente à l’auto-régression. Le décodage spéculatif et la sortie anticipée permettent de réduire cette contrainte dans des conditions mesurables. Il convient de les intégrer avec la même rigueur que n’importe quelle fonctionnalité en production : métriques, indicateurs, capacités de rollback et responsables clairement définis au sein de l’équipe de la plateforme de service.
Intuition numérique éprouvée
Supposons qu’une étape cible coûte 10 ms et qu’un projet préliminaire propose 5 tokens avec un taux d’acceptation moyen de 60 % pour 3 tokens. Le coût réel par token accepté diminue par rapport aux étapes classiques à un seul token, même après les frais liés au projet préliminaire, tant que le taux d’acceptation reste élevé. Si ce taux tombe à environ 1 token, le système devient moins efficace. C’est cette sensibilité qui explique pourquoi les tableaux de bord sont supérieurs aux anecdotes.
Protocole de régression de qualité
Au préalable de l’activation globale, exécutez les prompts corrigés sur des ensembles de tests factuels, de codage et de refus. Comparez les taux de tokens identiques lorsque le mode spéculatif est configuré pour une correspondance exacte des distributions. Étudiez toute dérive systémique. Pour un arrêt précoce, suivez le taux de réussite sur les tâches notées ainsi que la préférence humaine lorsque cela est possible.
Emplacement du matériel
Colocalisez autant que possible le modèle de brouillon et celui cible sur le même nœud. Les brouillons hébergés sur des serveurs différents ajoutent du jitter réseau qui peut annuler les gains obtenus. Faites attention à la mémoire : deux modèles plus le cache KV peuvent épuiser les ressources d’un serveur qui pouvait aisément en accueillir un seul.
Planification des interactions
Les serveurs de batch continu doivent tenir compte des expansions spéculatives variables. Des planificateurs inefficaces fragmentent les lots et nuisent à l’utilisation des ressources. Coordonnez-vous avec les responsables du service ; ne modifiez pas les paramètres uniquement dans le code de l’application.
Honnêteté concernant les goulets d’étranglement restants
Même après une amélioration du décodage, les utilisateurs peuvent encore subir des retards liés aux appels vers l’outil, au chargement des données ou au traitement du Markdown côté client. Il est nécessaire de tracer le processus de bout en bout. Une optimisation inappropriée gaspille du temps d’ingénierie.
Résumé
Le décodage séquentiel représente la contrainte structurelle inhérente à l’auto-régression. Le décodage spéculatif et la sortie anticipée permettent de réduire cette contrainte dans des conditions mesurables. Il convient de les intégrer avec la même rigueur que n’importe quelle fonctionnalité en production : métriques, indicateurs, capacités de rollback et responsables clairement définis au sein de l’équipe de la plateforme de service.
Intuition numérique éprouvée
Supposons qu’une étape cible coûte 10 ms et qu’un projet préliminaire propose 5 tokens avec un taux d’acceptation moyen de 60 % pour 3 tokens. Le coût réel par token accepté diminue par rapport aux étapes classiques à un seul token, même après les frais liés au projet préliminaire, tant que le taux d’acceptation reste élevé. Si ce taux tombe à environ 1 token, le système devient moins efficace. C’est cette sensibilité qui explique pourquoi les tableaux de bord sont supérieurs aux anecdotes.
Protocole de régression de qualité
Au préalable de l’activation globale, exécutez les prompts corrigés sur des ensembles de tests factuels, de codage et de refus. Comparez les taux de tokens identiques lorsque le mode spéculatif est configuré pour une correspondance exacte des distributions. Étudiez toute dérive systémique. Pour un arrêt précoce, suivez le taux de réussite sur les tâches notées ainsi que la préférence humaine lorsque cela est possible.
Emplacement du matériel
Colocalisez autant que possible le modèle de brouillon et celui cible sur le même nœud. Utiliser des brouillons sur des hôtes différents ajoute du jitter réseau qui peut annuler les gains obtenus. Faites attention à la mémoire : deux modèles plus le cache KV peuvent épuiser les ressources d’un système qui pouvait aisément en accueillir un seul.
Planification des interactions
Les serveurs de lotage continu doivent tenir compte des expansions spéculatives variables. Des planificateurs inefficaces fragmentent les lots et nuisent à l’utilisation des ressources. Coordonnez-vous avec les responsables du service ; ne modifiez pas les paramètres uniquement dans le code de l’application.
Honnêteté concernant les goulets d’étranglement restants
Même après une amélioration du décodage, les utilisateurs peuvent encore subir des retards liés aux appels vers l’outil, au chargement des données ou au traitement du Markdown côté client. Il est nécessaire de tracer le processus de bout en bout. Une optimisation inappropriée gaspille du temps d’ingénierie.
Résumé
Le décodage séquentiel représente la contrainte structurelle inhérente à l’auto-régression. Le décodage spéculatif et la sortie anticipée permettent de réduire cette contrainte dans des conditions mesurables. Il convient de les intégrer avec la même rigueur que n’importe quelle fonctionnalité en production : métriques, indicateurs, capacités de rollback, ainsi que des responsables clairement identifiés au sein de l’équipe de la plateforme de déploiement.