Speculative decoding : comment obtenir une inférence 3× plus rapide avec n’importe quel LLM

⚠️ Article en prévisualisationCet article est en statut brouillon, il ne peut être consulté que par les personnes qui connaissent son URL exacte.

Cette page est en noindex, les liens sont nofollow et l’article n’est lié depuis aucune page du site.

Le décodage spéculatif est une technique qui accélère la génération de texte par les grands modèles de langage, sans modifier le modèle ni dégrader la qualité des réponses. Présentée comme capable d’accélérer l’inférence de 2 à 3 fois, elle repose sur une stratégie de génération plus intelligente plutôt que sur un changement d’architecture.

Le goulot d’étranglement de la mémoire

Chaque fois qu’un utilisateur envoie un message à un chatbot, le modèle génère sa réponse token par token, c’est-à-dire fragment de texte par fragment de texte. Ce fonctionnement devient un obstacle à mesure que les modèles grossissent, en particulier pour les assistants de programmation, les services client ou les agents en temps réel, qui exigent une réponse quasi immédiate.

Le frein ne vient pas principalement de la puissance de calcul. Des GPU comme les NVIDIA H100 sont très rapides pour les calculs matriciels. Le problème tient au fait que les milliards de paramètres du modèle, stockés en mémoire, doivent être transférés vers le processeur avant la génération de chaque token. Les unités de calcul restent alors largement inactives. Les ingénieurs parlent d’un système limité par la bande passante mémoire : ajouter de la puissance de calcul n’accélère donc pas nettement les choses.

Proposer, puis vérifier

Le principe consiste à générer plusieurs tokens candidats d’un seul coup, puis à les vérifier en parallèle. Le système repose sur deux modèles. Un petit modèle dit de brouillon (draft model) produit rapidement une séquence de candidats, en général quatre à huit tokens. Un modèle cible (target model), plus grand et de meilleure qualité, évalue l’ensemble en une seule passe. Comme les GPU sont conçus pour le calcul parallèle, traiter un lot de tokens ne prend guère plus de temps que traiter un seul token.

Pour chaque candidat, le modèle cible compare sa propre probabilité à celle que lui a attribuée le brouillon. Si le modèle cible est au moins aussi confiant, le token est accepté. Dans le cas contraire, il l’est avec une probabilité qui diminue à mesure que l’écart grandit. Un token rejeté est remplacé par un token tiré dans une distribution ajustée, puis la boucle recommence. Selon la présentation de la méthode, ce procédé statistique garantit que la sortie suit exactement la même distribution de probabilité que si le modèle cible avait généré chaque token seul.

Dans le meilleur cas, tous les candidats sont acceptés et le modèle cible ajoute un token supplémentaire, soit cinq à neuf tokens pour le coût d’une passe du modèle cible. Dans le pire cas, le premier candidat est rejeté, ce qui ajoute une légère surcharge, puisque le temps de génération du brouillon reste dû. Un couple de modèles mal assortis peut donc ralentir légèrement la génération.

Le gain réel dépend surtout du taux d’acceptation, c’est-à-dire de la fréquence à laquelle les candidats du brouillon passent la vérification. Autour de 70 à 80 %, un niveau qualifié de typique pour des paires bien assorties sur des tâches courantes, l’accélération se situe entre 2x et 3x. Les textes prévisibles ou répétitifs produisent des taux plus élevés et des gains plus importants.

Variantes et mise en pratique

Le schéma d’origine exige un modèle de brouillon distinct, ce qui ajoute de la mémoire et de la complexité d’ingénierie. Plusieurs techniques plus récentes s’en passent. Certaines renoncent à la garantie statistique stricte pour une mise en œuvre plus simple ou un débit plus élevé, avec, selon la source, un impact généralement négligeable sur la qualité des sorties.

Medusa ajoute au modèle cible plusieurs têtes de prédiction supplémentaires sur sa dernière couche, chacune prévoyant une position future différente. Eagle, pour « Extrapolation Algorithm for Greater Language-model Efficiency », s’appuie sur les états internes du modèle plutôt que sur ses tokens de sortie, ce qui, selon la source, favorise des taux d’acceptation plus élevés sur des textes complexes ou spécialisés. Prompt Lookup Decoding n’utilise aucun modèle secondaire : il repère dans le prompt et l’historique de conversation les expressions susceptibles de réapparaître dans la réponse, et les emploie comme candidats, ce qui convient notamment à l’édition de code et au résumé de documents.

Le décodage spéculatif est proposé en option dans plusieurs frameworks d’inférence, dont text-generation-inference de Hugging Face, vLLM et llama.cpp. Selon la source, l’activer relève le plus souvent d’un changement de configuration.

La technique profite surtout aux générations longues, lorsque le modèle traite une requête à la fois et que le prompt et la réponse partagent vocabulaire ou structure. Les questions-réponses, le résumé de documents et la complétion de code figurent parmi les cas où les gains sont les plus importants. Dans le service par lots à haut débit, en revanche, elle peut réduire le débit, car les tokens de brouillon consomment de la mémoire et du calcul qui pourraient servir à d’autres requêtes.