Aller au contenu

1 · Le principe

Pourquoi la génération est lente

Un modèle de langage autorégressif calcule, à chaque étape, la probabilité du jeton suivant sachant tout ce qui précède :

\[ p_t(x_k \mid x_{<k}) \]

où \(x_{<k}\) désigne les jetons déjà produits et \(p_t\) la distribution du modèle cible (target), celui dont on veut la sortie.

Le point important n'est pas mathématique, il est matériel. Pour produire un jeton, le GPU doit charger depuis sa mémoire l'ensemble des poids du modèle. Sur un modèle de 700 milliards de paramètres en 8 bits, cela représente environ 700 Go à faire transiter — pour un calcul qui, lui, occupe les unités de calcul une fraction du temps.

Intuition

La génération est limitée par la mémoire (memory-bound), pas par le calcul. Le GPU passe son temps à attendre des données. Il pourrait traiter dix jetons dans le même temps que un — s'il en avait dix sous la main.

C'est exactement cette place vide que le décodage spéculatif vient remplir.

Brouillon puis vérification

Le mécanisme tient en deux temps, répétés en boucle.

  1. Brouillon. Un module rapide — le drafter — propose \(\gamma\) jetons d'avance : \(\hat{x}_1, \dots, \hat{x}_\gamma\). Ce module peut être un petit modèle, quelques couches greffées sur le grand, voire un simple copier-coller du contexte.
  2. Vérification. Le modèle cible traite ces \(\gamma\) jetons en une seule passe, comme il traiterait un prompt. Il obtient donc \(p_t\) à chaque position pour le prix d'une étape de décodage.

On compare ensuite, position par position, ce que le brouillon a proposé et ce que le modèle cible aurait fait. On garde le plus long préfixe acceptable, on jette le reste, et on recommence.

Le nombre moyen de jetons conservés par cycle est la longueur acceptée, notée \(\tau\). C'est la métrique centrale de tout le domaine.

Pourquoi la sortie reste exacte

Le point contre-intuitif : un brouillon médiocre ne dégrade pas la qualité, il dégrade seulement la vitesse. La raison tient à la règle d'acceptation, introduite conjointement par Leviathan et al. (Google) et Chen et al. (DeepMind) en 2022–2023.

Soit \(p_d\) la distribution du brouillon et \(p_t\) celle du modèle cible à une position donnée, et \(\hat{x}\) le jeton proposé. On accepte \(\hat{x}\) avec la probabilité

\[ \min\left(1, \frac{p_t(\hat{x})}{p_d(\hat{x})}\right) \]

et, en cas de rejet, on rééchantillonne dans la distribution résiduelle

\[ p_{\text{res}}(x) \propto \max\bigl(0,\; p_t(x) - p_d(x)\bigr) \]
Symbole Signification
\(p_t\) Distribution du modèle cible — la « vérité » à reproduire
\(p_d\) Distribution du brouillon
\(\hat{x}\) Jeton proposé par le brouillon
\(\gamma\) Longueur du brouillon proposé, en jetons
\(\tau\) Longueur acceptée moyenne, en jetons par cycle

On démontre que le jeton finalement émis suit exactement \(p_t\). La distribution de sortie est inchangée, quel que soit \(p_d\).

Erreur fréquente

« Sans perte » (lossless) signifie même distribution, pas même texte. Avec de l'échantillonnage, deux exécutions donnent des textes différents — comme deux exécutions du modèle seul. En décodage glouton (température 0), la sortie est en revanche identique jeton pour jeton.

Corollaire pratique : un mauvais drafter ne « casse » jamais un modèle. Le risque du décodage spéculatif est un risque de performance, pas de qualité.

Ce qui détermine le gain

Trois quantités s'opposent :

  • \(\tau\), la longueur acceptée — plus le brouillon ressemble au modèle cible, plus elle est grande ;
  • \(c\), le coût relatif d'une étape de brouillon par rapport à une passe du modèle cible ;
  • \(\gamma\), le nombre de jetons proposés par cycle.

Une approximation utile de l'accélération :

\[ S \approx \frac{\tau}{1 + c\,\gamma} \]

Un brouillon parfait mais coûteux ne gagne rien ; un brouillon gratuit mais faux non plus. Toute l'histoire du domaine est une négociation entre ces deux termes.

Il faut ajouter une contrainte que la formule ignore et qui domine en production : le régime de charge. À faible concurrence, le GPU est inoccupé et vérifier dix jetons ne coûte presque rien de plus que d'en vérifier un. À forte concurrence, les requêtes des autres utilisateurs occupent déjà la machine : chaque jeton spéculé devient du calcul en concurrence directe avec du travail utile, et un brouillon trop long réduit le débit global.

À retenir

Le décodage spéculatif échange du calcul (abondant) contre des accès mémoire (rares). Il ne change pas la distribution de sortie. Son gain dépend de la longueur acceptée \(\tau\), du coût du brouillon, et de la charge du serveur — ce dernier point étant précisément ce que DSpark attaque.


Chapitre suivant : Avant DSpark : huit ans de méthodes