advanced · Session 18

Cache KV, mémoire récurrente, MLA et bas rang

Comparer trois budgets mémoire et distinguer compression par token, état fixe et factorisation bas rang.

120 min6 mécanismeslaboratoire causal

Ce que vous saurez faire

Ouvrir le laboratoire

Méthode de travail

Travaillez cette session comme une enquête causale. Avant chaque formule ou interaction, écrivez ce que vous pensez voir changer et ce qui doit rester fixe. Pendant le calcul, conservez les unités, les formes et les valeurs intermédiaires : elles permettent de localiser une erreur sans recommencer au hasard. Après le résultat, traduisez le nombre ou l’état en une phrase sur le comportement du système. Terminez toujours par un contre-exemple ou une valeur limite. Cette discipline sépare la compréhension d’un mécanisme de la simple reconnaissance de son vocabulaire et rend le laboratoire reproductible par un autre apprenant.

Construire le mécanisme pas à pas

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.

Frontière de validité

Les formules simplifiées omettent alignement, quantification, buffers et détails de partage. Elles servent à comparer des tendances, pas à promettre une empreinte réelle.

Statut de preuve: Mixte : mécanismes établis + choix de type Kimi K3 rapportés par la source.

Vérifications rapides

1. Que fait réellement Cache KV standard?

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.

2. Que fait réellement État récurrent fixe?

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.

3. Que fait réellement MLA?

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.

4. Que fait réellement Factorisation bas rang?

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.

Sources et frontière de preuve

Portée: Mixte : mécanismes établis + choix de type Kimi K3 rapportés par la source.