Aller au contenu

CSA2 — l'attention creuse compressée de seconde génération

Ce qui change par rapport à V4

DeepSeek-V4 utilisait une architecture hybride : certaines couches en CSA (Compressed Sparse Attention, ratio 4), d'autres en HCA (Heavily Compressed Attention, ratio 128). V4.1-Flash abandonne cette hybridation et n'utilise que du CSA2.

Trois simplifications accompagnent ce passage :

Aspect CSA (V4) CSA2 (V4.1)
Groupes de compression chevauchants — une entrée agrège \(2m\) jetons disjoints — une entrée agrège \(m\) jetons
Encodage de position dans le compresseur plongement positionnel absolu supprimé
Clés d'indexeur voie de compression séparée depuis l'état caché projetées depuis le cache principal

La troisième est la plus conséquente. En dérivant les clés d'indexeur du cache principal plutôt que de l'état caché, CSA2 les rend partageables en même temps que lui : une couche qui réutilise le cache principal d'une autre réutilise automatiquement ses clés d'indexeur.

Les trois modes

Chaque couche CSA2 reçoit statiquement — à la conception du modèle, pas dynamiquement à l'exécution — l'un de trois modes.

Dans les trois cas, la couche calcule toujours sa propre requête principale et son propre cache de fenêtre glissante. Ce qui varie, c'est l'origine de trois choses : le cache principal, les clés d'indexeur, les indices Top-K.

Mode Full

La couche fait tout : elle compresse son propre cache principal, en projette les clés d'indexeur, exécute l'indexeur, et produit des indices Top-K frais.

C'est le chemin complet, équivalent à une couche CSA de DeepSeek-V4.

Couches concernées : 2, 8, 14 (encodeur) et 20 (décodeur).

Mode Reindex

La couche réutilise le cache principal et les clés d'indexeur de la couche source la plus récente. Mais elle calcule sa propre requête d'indexation, rescore les clés partagées, et sélectionne ses propres 512 indices.

Le cache est partagé, la sélection ne l'est pas.

Couches concernées : 24, 28, 32, 36 (décodeur uniquement).

Mode Reuse

La couche réutilise le cache principal et les derniers indices Top-K calculés contre ce cache. Elle n'exécute aucun indexeur, ne calcule aucun score. Elle se contente de lire les 512 entrées désignées et de faire son attention.

Couches concernées : les 32 restantes.

                     cache principal   clés indexeur   indices Top-K
   Full                  calculé          calculées       calculés
   Reindex              réutilisé        réutilisées     recalculés
   Reuse                réutilisé        réutilisées     réutilisés

Pourquoi séparer le partage du cache et la réutilisation des indices

Ces deux formes de réutilisation ont des effets différents :

  • partager le cache économise du stockage — c'est ce qui divise les 890 octets ;
  • réutiliser les indices économise du calcul — l'indexeur n'est pas exécuté.

Les travaux antérieurs cités par DeepSeek font l'un ou l'autre. IndexCache réutilise les indices entre couches mais chaque couche garde son cache : gain de calcul, aucun gain de stockage. YOIO calcule le routage creux une fois pour tout le réseau : gain maximal mais performance limitée. HySparse laisse les couches creuses réutiliser le cache des couches denses : mais il reste des couches d'attention complète.

CSA2 découple les deux, ce qui permet au mode Reindex d'exister : partager le stockage tout en laissant chaque groupe de couches choisir où regarder.

Pourquoi le Reindex n'existe que dans le décodeur

Dans l'encodeur, les groupes sont de 6 couches et tous les modes non-Full sont Reuse. Dans le décodeur, un mode Reindex ouvre chaque groupe de 4.

La différence tient au CED. Dans le décodeur, un seul cache est produit — celui de la couche 20, à partir de \(H_{20}\) — et il doit servir vingt couches. Laisser quatre d'entre elles rechoisir leurs positions limite la perte de diversité. Dans l'encodeur, on peut se permettre trois caches distincts, donc trois sélections distinctes, sans mécanisme supplémentaire.

L'interaction avec le CED

Quand CSA2 est combiné au CED, la couche du décodeur assignée au mode Full calcule son cache global depuis \(H_{20}\), la sortie de l'encodeur, et non depuis son propre état caché. Les modes Reindex et Reuse sont inchangés.

C'est la seule modification que le CED impose à CSA2 — mais elle est ce qui rend possible de sauter le décodeur pendant le préremplissage.

Ce que cela donne en pratique

Le cache global de tout le modèle est produit par quatre couches :

Couche Zone Ratio Ce qu'elle stocke par jeton
2 encodeur 2 178 o
8 encodeur 2 178 o
14 encodeur 2 178 o
20 décodeur 1 356 o
890 o

Les 36 autres couches ne stockent rien du tout dans le cache global. C'est l'essentiel du facteur 4 revendiqué contre DeepSeek-V4-Flash — le FP4 fournit le reste.

Le gain en noyaux de calcul

Le rapport technique donne un chiffre parlant sur l'implémentation : une couche en mode Reuse s'exécute avec 15 noyaux GPU au préremplissage et 11 au décodage. C'est très peu, et cela concerne la grande majorité des couches.

À retenir

CSA2 exploite les trois dimensions de compression simultanément : taille d'entrée (latent unique en FP4), dimension séquentielle (ratio 2 dans l'encodeur), dimension des couches (4 sources sur 40). Aucun travail antérieur cité ne couvre les trois.


Chapitre suivant : L'indexeur hiérarchique