1. Cache KV standard
Le problème : Votre service vise 131 072 tokens de contexte. Avant toute optimisation, il faut le chiffre brut : à 32 couches, 8 têtes KV, d_head=128 et BF16, chaque token coûte 128 Kio de cache — 16 Gio par requête à pleine longueur. Et cette facture revient à chaque requête.
L’idée : Le cache conserve clés et valeurs de chaque token passé, par couche : bytes ≈ tokens × couches × 2 × têtes × d_head × octets. La lecture est fidèle — attention exacte sur tout le passé — et le calcul se refait facteur par facteur, sans calculatrice.
bytes≈tokens×layers×2×heads×d_head×bytes/value
Pourquoi / à quel prix : La fidélité est totale : rappel exact de n’importe quel token. Le prix est structurel : croissance strictement linéaire — ×32 tokens = ×32 mémoire — et une bande passante de relecture qui suit. Aucun réglage ne change la pente, seulement le coefficient.
Vérification de compréhension
Nommez l’entrée, l’état transformé, la sortie et une hypothèse nécessaire. Comparez ensuite votre chaîne à l’explication ci-dessus.
2. État récurrent fixe
Le problème : 16 Gio par requête interdit la plupart des déploiements. Les sessions 13 à 16 ont construit l’alternative radicale : et si le passé tenait dans une matrice de taille fixe, quel que soit le nombre de tokens ?
L’idée : L’état S — 32 couches × 128 × 128 × BF16 = 1 Mio — résume tout le passé : 4 096 ou 524 288 tokens, toujours 1 Mio. La croissance disparaît ; c’est l’aboutissement des mémoires des sessions précédentes.
Pourquoi / à quel prix : Un budget constant et dérisoire — 16 000 fois moins que le cache à 131 072 tokens. Le prix, connu des sessions 13-16 : compression et interférence — le rappel n’est plus exact et se dégrade avec la longueur, même si la mémoire, elle, ne bouge pas.
Vérification de compréhension
Nommez l’entrée, l’état transformé, la sortie et une hypothèse nécessaire. Comparez ensuite votre chaîne à l’explication ci-dessus.
3. MLA
Le problème : Entre 16 Gio exacts et 1 Mio approximatif, l’écart est brutal. Existe-t-il un milieu : garder une entrée PAR token — la fidélité structurée — mais payer moins par entrée ?
L’idée : Multi-head Latent Attention compresse chaque token en un vecteur latent c_t (512 valeurs) — la seule chose mise en cache — puis reconstruit K et V via W_UK et W_UV au moment de lire. Largeur ÷ 4 ⇒ 32 Kio/token, 4 Gio à 131 072 tokens.
Pourquoi / à quel prix : Le cache garde sa structure par token et la facture est divisée par 4. Le prix : une reconstruction à chaque lecture — de la mémoire troquée contre du calcul, surtout au décodage — et la croissance reste O(n) : le gain est un coefficient, pas un changement d’asymptote.
Vérification de compréhension
Nommez l’entrée, l’état transformé, la sortie et une hypothèse nécessaire. Comparez ensuite votre chaîne à l’explication ci-dessus.
4. Factorisation bas rang
Le problème : La compression de MLA repose sur une question d’algèbre pure : quand remplacer une grande matrice W par un produit de deux petites fait-il vraiment économiser ? Mal choisi, le goulot r ne gagne rien du tout.
L’idée : W (d×m) ≈ A(d×r)·B(r×m) coûte r(d+m) paramètres au lieu de d·m. Pour 4096×4096 : r=512 divise par 4 ; r=2048 donne 16 777 216 — exactement le coût d’origine. Le seuil d’équilibre est r = d·m/(d+m) = 2048 ici.
W≈AB, A∈R^{d×r}, B∈R^{r×m}
Pourquoi / à quel prix : Sous le seuil, l’économie est réelle et le calcul plus rapide. Le prix : la capacité de la projection est plafonnée au rang r — toute transformation qui exigerait un rang supérieur est structurellement hors de portée, quel que soit l’entraînement.
Vérification de compréhension
Nommez l’entrée, l’état transformé, la sortie et une hypothèse nécessaire. Comparez ensuite votre chaîne à l’explication ci-dessus.
5. MLA n’est pas mémoire fixe
Le problème : Deux annonces se ressemblent : « cache compressé 4× » et « mémoire constante ». Une équipe budgète 4 Gio « pour toujours » avec MLA — et découvre 16 Gio à 524 288 tokens. Où est passée la promesse ?
L’idée : Il n’y en avait pas : MLA compresse chaque entrée, il ne fusionne pas les tokens. Une entrée par token ⇒ croissance linéaire à coefficient réduit. Seul un état récurrent fusionne le passé en un objet de taille fixe.
Pourquoi / à quel prix : Distinguer les deux évite l’erreur de capacité en production : MLA borne le coefficient, l’état borne la croissance. Le prix de la confusion se lit dans la trace : le gain ×4 de MLA est ravalé par ×4 tokens — la longueur continue de commander.
Vérification de compréhension
Nommez l’entrée, l’état transformé, la sortie et une hypothèse nécessaire. Comparez ensuite votre chaîne à l’explication ci-dessus.
6. Bas rang n’est pas LoRA
Le problème : Même formule W ≈ AB dans deux contextes : la factorisation architecturale de MLA et l’adaptation LoRA. Un lecteur pressé conclut « MLA, c’est du LoRA intégré » — et propose de « retirer l’adaptateur » d’un modèle qui n’en a pas.
L’idée : Rôles opposés : dans MLA, A et B SONT le chemin normal, entraînés depuis zéro, inamovibles. LoRA ajoute un delta bas rang À CÔTÉ de poids gelés, pour adapter après coup — fusionnable ou désactivable à volonté.
Pourquoi / à quel prix : Le discernement évite des décisions absurdes — geler « l’adaptateur » de MLA, ou croire LoRA indispensable à l’inférence. Le prix : une vigilance permanente ; la même algèbre sert des architectures et des procédés d’adaptation, et seul le contexte décide du sens.
Vérification de compréhension
Nommez l’entrée, l’état transformé, la sortie et une hypothèse nécessaire. Comparez ensuite votre chaîne à l’explication ci-dessus.
Développement depuis la source de cours
Chapitre 13 — Enregistrements complets contre mémoire compressée
13.1 Deux stratégies de mémoire
But : comparer les enregistrements exacts aux résumés. Le cache clés-valeurs standard conserve des données par jeton. La mémoire linéaire récurrente compresse de nombreux jetons dans un état de taille fixe.
Une archive vidéo conserve chaque image ; un compte rendu conserve un résumé compact. Chacun répond mieux à certaines questions.
Étape par étape
-
Cache par jeton : grandit avec le contexte ; préserve un accès plus direct aux jetons individuels.
-
État fixe : ne grandit pas avec le nombre de jetons ; risque l’interférence et la perte d’information.
-
Les conceptions hybrides peuvent employer les deux mécanismes dans des couches ou rôles différents.
Exemple détaillé : Pour 1 000 jetons, une méthode par jeton conserve 1 000 enregistrements par couche concernée. Une méthode à état fixe conserve un état de forme prédéterminée. Cela ne prouve pas qu’elle utilise toujours moins de mémoire au total, mais explique la différence d’échelle.
Pourquoi c’est important : L’architecture est un compromis entre fidélité, vitesse, trafic mémoire et facilité d’entraînement.
Vérification rapide : quelle stratégie est la plus susceptible de retrouver un ancien jeton précis ? Réponse : l’enregistrement par jeton, même si la qualité dépend toujours de l’attention apprise.
13.2 Compression latente et MLA
But : réduire la taille du cache sans condenser toute l’histoire dans une seule matrice récurrente. Un vecteur latent est une représentation apprise plus petite. Multi-head Latent Attention, abrégé MLA, stocke une information latente comprimée et reconstruit les clés ou valeurs propres aux têtes lorsque nécessaire.
Stocke un dossier compressé au lieu de plusieurs copies déployées, puis décompresse la vue nécessaire à chaque travailleur.
Étape par étape
-
Comprimer la représentation cachée x en c = xW_down.
-
Mettre en cache le latent plus petit c.
-
Utiliser des projections apprises vers le haut pour créer les formes de clés/valeurs nécessaires aux têtes d’attention.
-
Une tête est un sous-espace d’attention parallèle ; plusieurs têtes peuvent apprendre des relations différentes.
Exemple détaillé : Exemple de formes : x possède 8 coordonnées. La compression à 2 donne c avec 2 coordonnées. Ré-étendre c en une clé à 8 coordonnées ne préserve pas magiquement tous les vecteurs 8-D possibles ; la clé est limitée aux motifs apprenables à travers le goulot de 2 dimensions.
Pourquoi c’est important : MLA est une mémoire comprimée par jeton, pas un unique état récurrent fixe pour tout le passé.
Vérification rapide : le cache MLA reste-t-il normalement constant lorsque le nombre de jetons augmente ? Réponse : non. Il peut être plus petit par jeton, mais grandit encore avec le nombre de jetons.
13.3 Factorisation de faible rang et LoRA
But : comprendre les espaces intermédiaires étroits. Une matrice complète 8×8 contient 64 nombres. La remplacer par une matrice 8×2 suivie d’une matrice 2×8 utilise 16+16=32 nombres dans ce comptage simplifié.
Un couloir étroit limite le nombre de flux indépendants pouvant passer en même temps.
Étape par étape
-
Projeter vers le bas : h = xA.
-
Projeter vers le haut : y = hB.
-
La transformation combinée AB a un rang au plus égal à la largeur étroite.
-
Low-Rank Adaptation, LoRA, ajoute généralement une mise à jour de faible rang entraînable à un poids de base gelé ; les mathématiques sont liées, mais l’usage n’est pas automatiquement identique à la compression architecturale.
Exemple détaillé : Cette distinction évite une confusion fréquente : toute factorisation de faible rang n’est pas nécessairement un adaptateur LoRA de spécialisation.
Pourquoi c’est important : Le faible rang échange une partie de la flexibilité contre moins de paramètres, de stockage ou de calcul, selon son emplacement.
Vérification rapide : combien de nombres contiennent des matrices 10×3 et 3×10 ensemble ? Réponse : 30+30=60.
Cas guidé complet
Avec 32 couches, 8 têtes KV, d_head=128, BF16 et 4 096 tokens, le cache brut simplifié vaut 4 096×32×2×8×128×2 octets = 536 870 912 octets = 512 Mio (0,5 Gio). Diviser la largeur latente par quatre réduit le terme par token, pas sa croissance linéaire.
Méthode de lecture: écrire les données, annoncer la forme de chaque objet, effectuer une seule transformation, puis interpréter le résultat avant de continuer.