
Le décodage spéculatif (MTP) : jusqu'à deux fois plus vite sur la même carte
Un modèle écrit un jeton à la fois, et chaque jeton coûte une passe complète dans le modèle. Le décodage spéculatif devine plusieurs jetons à l'avance avec quelque chose de bon marché, puis les vérifie tous en une seule passe : chaque bonne devinette est un jeton gratuit. Certains modèles récents embarquent leur propre tête de devinette (multi-token prediction, MTP) dans le fichier du modèle.
Comment ces chiffres ont été obtenus. Mesurés sur nos propres machines (voir le protocole), en général en un seul passage, vitesses relevées par le serveur lui-même ; nous ne publions pas les journaux bruts. Ce sont des ordres de grandeur sur ce matériel, pas des garanties sur le vôtre. Les chiffres extérieurs sont accompagnés de leur source.
Un peu d'histoire
Le décodage spéculatif a été publié en 2022 et 2023 par des équipes de Google et de DeepMind : un petit modèle rapide devine plusieurs jetons d'avance, et le gros modèle les vérifie tous en un seul passage, en gardant ceux avec lesquels il est d'accord. Le résultat est exactement ce que le gros modèle aurait écrit, seulement plus vite. La prédiction multi-jetons (MTP) va plus loin : le modèle lui-même est entraîné à proposer les quelques jetons suivants.
1. La bonne façon de l'activer
Avec un build de llama.cpp qui le prend en charge, et un fichier de modèle qui contient des tenseurs MTP :
--spec-type draft-mtp --spec-draft-n-max 5
Passer la tête MTP comme un modèle de brouillon ordinaire (--model-draft seul) faisait planter notre serveur, et nous avons d'abord conclu que le MTP ne marchait pas. Et un build plus ancien de llama.cpp charge un tel fichier et ignore en silence la partie MTP : sur un vieux build, l'absence de gain ne prouve rien.
2. Mesurer votre propre n_max
--spec-draft-n-max, c'est le nombre de jetons devinés à l'avance. Trop peu gâche l'idée ; trop gaspille des passes sur de mauvaises devinettes. Sur notre installation, le gain montait jusqu'à 5 et baissait après 8. Les tableaux publiés, mesurés sur des GPU de centre de données, s'arrêtent bien plus tôt : une installation plus lente profite de la spéculation plus longtemps. Lancez le même prompt trois fois par valeur et gardez la vôtre.
3. Attendez-vous à moins en vrai que sur un banc
Sur un banc de code, réflexion coupée, nous avons mesuré presque trois fois la vitesse et 84 % des devinettes acceptées. En production, réflexion active, ça s'est stabilisé entre 84 et 98 jetons par seconde : environ deux fois la vitesse, avec la moitié des devinettes acceptées. La réflexion est moins prévisible que du code. Annoncez le vrai chiffre, pas celui du banc.
Pièges que nous avons payés
Ça coûte de la VRAM : environ 1,7 Go sur notre carte. Vérifiez que le modèle garde de la place pour ses tampons de calcul (voir la grille GPU).
Sur certaines requêtes, le chemin spéculatif faisait planter notre serveur. Ce qui ressemblait à plusieurs pannes sans lien (des agents qui mouraient après une réponse, un tableau de bord qui montrait le moteur tombé, des bascules qui « échouaient » après avoir réussi) était ce seul plantage. Si vos conteneurs ne redémarrent pas seuls, exprès, il faut que quelque chose s'en aperçoive et les recharge (voir router et réparer avec des garde-fous).
Sources
- Leviathan, Kalman, Matias (2022), Fast Inference from Transformers via Speculative Decoding
- Chen et al. (2023), Accelerating Large Language Model Decoding with Speculative Sampling
- Gloeckle et al. (2024), Better & Faster Large Language Models via Multi-token Prediction
Utile ? Dites-nous ce qu'il faut mesurer ensuite.