Aller au contenu

Vue d'ensemble de l'architecture

Le schéma général

                    ENTRÉE : texte, images, vidéos
                                │
        ┌───────────────────────┴────────────────────────┐
        │                                                │
   texte → tokeniseur                        images/vidéos → MoonViT-V2
        │  (163 840 jetons)                        (27 couches, 401 M)
        │                                                │
        │                                          projecteur MLP
        │                                                │
        └───────────────────────┬────────────────────────┘
                                │
                    séquence unifiée de vecteurs (d = 7168)
                                │
                    ┌───────────▼───────────┐
                    │  COUCHE 1 (dense)     │  FFN classique, pas de MoE
                    └───────────┬───────────┘
                                │
        ╔═══════════════════════▼═══════════════════════════╗
        ║  BLOC ×23  :  KDA, KDA, KDA, Gated MLA            ║
        ║  chaque couche d'attention est suivie d'un        ║
        ║  Stable LatentMoE                                 ║
        ║  chaque couche lit ses entrées via AttnRes        ║
        ╚═══════════════════════╤═══════════════════════════╝
                                │
                    ┌───────────▼───────────┐
                    │  COUCHE 93 : Gated MLA│  attention globale finale
                    └───────────┬───────────┘
                                │
                       agrégation AttnRes finale
                                │
                          RMSNorm + lm_head
                                │
                    163 840 logits → softmax

Le décompte des couches

93 couches au total. La décomposition est directement lisible dans le champ full_attn_layers de la configuration publiée :

\[ \underbrace{23 \times (3\ \text{KDA} + 1\ \text{MLA})}_{92\ \text{couches}} \;+\; \underbrace{1\ \text{MLA}}_{\text{couche } 93} = 93 \]

soit 69 couches KDA et 24 couches Gated MLA.

Pourquoi une MLA supplémentaire à la fin ?

Le rapport le dit explicitement : ensuring that the final layer always performs global attention. La dernière opération de mélange de jetons avant la production du logit est donc toujours une attention globale exacte, et non une attention linéaire à mémoire compressée.

Intuition : c'est au dernier instant que le modèle a besoin d'un accès exact et non filtré à tout le contexte pour trancher.

La couche 1 est dense (first_k_dense_replace: 1) : son FFN est un SiTU-GLU classique à pleine largeur (dimension intermédiaire 33 792), sans routage. Les 92 autres couches ont un Stable LatentMoE.

Pourquoi la première couche est-elle dense ?

Pratique héritée de DeepSeek et conservée par toute la série Kimi. À la première couche, les représentations sont encore très proches des embeddings bruts ; le routage y est peu informatif et tend à se dégrader en routage par identité de jeton. Une couche dense évite ce gaspillage.

Ce que fait une couche

Chaque couche \(l\) enchaîne deux sous-couches, chacune précédée d'une lecture AttnRes et suivie d'une écriture résiduelle :

        ┌──── AttnRes : combinaison pondérée de b₀ … b_{n-1}, b_n^{i-1}
        │      (au lieu du simple h_{l-1})
        ▼
  ┌──────────┐
  │ RMSNorm  │
  └────┬─────┘
       ▼
  ┌────────────────────────────────┐
  │ KDA  (couches 1,2,3,5,6,7,…)   │  mélange de jetons
  │  ou Gated MLA (couches 4,8,…)  │
  └────┬───────────────────────────┘
       ▼  porte sigmoïde de rang plein
       ▼
  ┌──────────┐
  │ RMSNorm  │
  └────┬─────┘
       ▼
  ┌────────────────────────────────┐
  │ Stable LatentMoE               │  mélange de canaux
  │  2 partagés + 16/896 routés    │
  └────┬───────────────────────────┘
       ▼
   sortie de la couche, sommée dans la représentation du bloc b_n

Les trois axes, concrètement

Axe séquence : où circule l'information entre positions

Couches KDA (69) Couches Gated MLA (24)
Mécanisme Récurrence à décroissance + règle delta Attention softmax sur latent compressé
Coût en longueur \(O(T)\) \(O(T^2)\)
Mémoire par requête État fixe \(128 \times 128\) par tête Cache latent de rang 512 par jeton
Position Implicite (décroissance) Aucune (NoPE)
Rôle Récence, structure locale, position Rappel global exact

Axe profondeur : où circule l'information entre couches

Au lieu de \(\mathbf{h}_{l} = \mathbf{h}_{l-1} + f_{l-1}(\mathbf{h}_{l-1})\), chaque couche calcule une combinaison pondérée par attention des sorties de tous les blocs précédents et de l'embedding. Les 93 couches sont regroupées en 8 blocs de 12 couches (le dernier partiel : \(93 = 7\times12 + 9\)), et l'embedding compte comme une neuvième source.

Axe largeur : où circule l'information entre canaux

Chaque couche MoE dispose de \(896 \times 33{,}0\text{ M} = 29{,}6\) milliards de paramètres d'experts, dont \(16 \times 33{,}0\text{ M} = 528\) millions sont utilisés par jeton — plus 2 experts partagés toujours actifs.

Le budget de paramètres, module par module

Reconstruit depuis la configuration publiée ; le calcul complet et exécutable est en Retrouver les paramètres.

Module Par couche Total Part
Experts routés (896) 29,60 G 2 723 G 98,0 %
Couches KDA (69) 440 M 30,4 G 1,1 %
Experts partagés (2) 132 M 12,2 G 0,4 %
Embedding + lm_head — 2,35 G 0,08 %
Couches Gated MLA (24) 232 M 5,6 G 0,20 %
Projections \(\mathbf{W}^{\downarrow},\mathbf{W}^{\uparrow}\) 51 M 4,7 G 0,17 %
FFN dense (couche 1) 727 M 0,73 G 0,03 %
Routeurs 6,4 M 0,59 G 0,02 %
Encodeur visuel — 0,40 G 0,01 %
Total ≈ 2 779 G 100 %

La lecture qui compte

98 % des paramètres sont des experts MoE, et 98,2 % d'entre eux sont inactifs pour un jeton donné. Kimi K3 est essentiellement une immense bibliothèque de petits réseaux, plus une machinerie d'attention relativement modeste (36 G de paramètres, soit 1,3 % du total) chargée de décider quoi consulter.

Par où l'information passe, pour un seul jeton

1  embedding                                    7 168 valeurs
2  couche 1 dense (FFN 33 792)                  0,73 G params actifs
3  ×92 couches :
     a. AttnRes : lit ≤ 9 représentations       ~7 168 × 9 comparaisons
     b. attention KDA ou MLA                    ~440 M ou 232 M params
     c. routeur : 896 scores → top 16           6,4 M params
     d. W↓ : 7168 → 3584                        25,7 M params
     e. 16 experts en dimension 3 584           528 M params
     f. RMSNorm + W↑ : 3584 → 7168              25,7 M params
     g. 2 experts partagés en dimension 7 168   132 M params
4  RMSNorm finale
5  lm_head : 7 168 → 163 840                    1,17 G params
                                                ─────────────────
                                    total actif ≈ 104 G paramètres

Vérification de compréhension

Combien de communications all-to-all une passe avant déclenche-t-elle ?

Deux par couche MoE (dispatch et combine), soit \(92 \times 2 = 184\) pour un seul jeton traversant le modèle. C'est ce volume que MoonEP doit rendre parfaitement équilibré et sans copie intermédiaire.

Pourquoi les couches KDA ont-elles plus de paramètres (440 M) que les couches MLA (232 M) ?

Parce que MLA compresse : ses projections passent par des goulots de rang faible (512 pour KV, 1 536 pour Q), tandis que KDA projette à pleine largeur \(7168 \to 96\times128 = 12\,288\) pour Q, K et V — trois matrices de 88 M chacune, plus la porte et la sortie. C'est le prix de l'absence de cache : KDA n'a rien à compresser, puisqu'il ne stocke rien qui croisse.


Chapitre suivant : L'attention hybride 3:1