Gated MLA et NoPE¶
Les 24 couches d'attention globale de Kimi K3. Elles ne représentent que 26 % de la profondeur, mais ce sont elles qui garantissent le rappel exact à longue distance.
MLA : compresser le cache KV¶
Multi-head Latent Attention, introduite par DeepSeek-V2, adoptée par Kimi K2 et K2.5, conservée par K3.
Le principe¶
Dans une attention classique, on met en cache les clés et valeurs de chaque tête : \(2 \times H \times d_h\) valeurs par jeton. Chez Kimi K3, cela ferait \(2 \times 96 \times 128 = 24\,576\) valeurs par jeton et par couche.
MLA ne met en cache qu'un vecteur latent compressé :
Les clés et valeurs de chaque tête sont reconstruites à la volée par des projections montantes apprises, au moment du calcul de l'attention.
| Grandeur | Sans compression | Avec MLA (K3) | Facteur |
|---|---|---|---|
| Cache par jeton et par couche | 24 576 valeurs | 512 (+64 pour la partie rope) | ~43× |
Confirmé par la configuration : kv_lora_rank: 512, q_lora_rank: 1536,
qk_nope_head_dim: 128, qk_rope_head_dim: 64, v_head_dim: 128.
Intuition
Au lieu d'archiver 96 photos différentes de chaque instant, on archive un résumé unique, et on régénère les 96 points de vue quand on en a besoin. On échange de la mémoire contre du calcul — un bon marché, puisque la mémoire est la ressource rare.
Erreur fréquente
Confondre MLA et GQA. GQA partage des têtes clé/valeur entre plusieurs têtes de requête : les têtes deviennent moins nombreuses mais restent explicites. MLA garde 96 têtes distinctes et compresse leur stockage commun en un latent. MLA préserve mieux l'expressivité à taux de compression égal.
L'ajout de K3 : la porte de sortie¶
Exactement la même construction que pour KDA — une porte sigmoïde de rang plein, dépendante de l'entrée, appliquée canal par canal avant la projection de sortie.
Cohérence de conception
Le rapport souligne que \(\mathbf{W}_g\) est de rang plein « pour correspondre à la nouvelle paramétrisation utilisée par KDA dans K3 ». Les deux types de couches partagent donc le même mécanisme de filtrage de sortie.
Effet revendiqué : chaque jeton module les canaux qu'il lit depuis l'attention globale.
Confirmé par la configuration : mla_use_output_gate: true.
NoPE : supprimer l'encodage de position¶
C'est le choix le plus contre-intuitif de l'architecture — et l'un des plus conséquents.
Le rappel du problème¶
L'attention softmax est invariante par permutation : sans information supplémentaire, l'ordre des jetons est invisible. On injecte donc la position, généralement par RoPE, qui applique aux requêtes et clés une rotation d'angle proportionnel à la position.
Ce que fait Kimi K3¶
Aucun encodage positionnel n'est appliqué aux couches MLA.
mla_use_nope: true. Le rapport : no explicit positional encoding is applied
to their queries or keys.
Pourquoi c'est possible¶
Parce que les 69 couches KDA intercalées portent déjà la position, par construction : la décroissance \(\mathbf{\alpha}_t\) atténue mécaniquement l'influence des jetons éloignés. Une couche KDA « sait » naturellement ce qui est proche et ce qui est loin.
La division du travail, énoncée par le rapport
The intervening KDA layers provide position-sensitive and recency-aware sequence mixing, while the MLA layers provide unrestricted global content interaction.
KDA = position et récence. MLA = contenu pur, sans notion de distance.
Pourquoi c'est un gain majeur¶
L'argument décisif
Étendre le contexte d'un modèle à RoPE demande de modifier l'encodage positionnel : rebaser la fréquence RoPE, appliquer une interpolation (YaRN, NTK-aware scaling), puis réentraîner sur des séquences longues pour que le modèle s'adapte à la nouvelle géométrie.
C'est fragile, coûteux, et cela dégrade souvent les performances à contexte court.
Avec NoPE, il n'y a rien à modifier. Le rapport : le modèle extrapolates directly to 1M-token contexts without any positional-encoding modification.
C'est ce qui rend le curriculum 8 K → 64 K → 256 K → 1 M économique : on change simplement la longueur des séquences d'entraînement, sans toucher au modèle.
Une curiosité à noter si vous réimplémentez
La configuration conserve qk_rope_head_dim: 64, alors même que
mla_use_nope: true. La dimension est donc allouée dans les projections
mais la rotation n'est pas appliquée. C'est très probablement un héritage
structurel du code MLA de DeepSeek, conservé pour compatibilité.
À vérifier dans modeling_kimi_linear.py avant de dimensionner vos
matrices : si vous supprimez ces 64 dimensions, votre décompte de
paramètres divergera du dépôt officiel.
Un détail de précision numérique¶
Le rapport signale un problème rarement discuté :
Pour corriger l'erreur d'arrondi biaisée qui apparaît dans flash attention, nous adoptons la méthode de Qiu et al. (2026) et gardons la sortie d'attention en FP32 pendant l'entraînement.
Pourquoi c'est important
L'accumulation en basse précision dans FlashAttention introduit un biais d'arrondi systématique (pas seulement du bruit). À l'échelle de 93 couches et de milliers de milliards de jetons, ce biais s'accumule et dégrade l'entraînement. C'est l'objet d'un article dédié cité par le rapport (Why Low-Precision Transformer Training Fails, arXiv 2510.04212).
Mais garder la sortie en FP32 double l'empreinte du tuile de sortie en mémoire partagée du GPU. La réponse de Kimi K3 est un exemple parfait de co-conception :
Nous redessinons donc le noyau d'entraînement pour la superposer aux tampons de préparation KV au lieu du tuile de requête, ce qui libère de la mémoire partagée pour un pipeline KV plus profond et un débit d'entraînement supérieur.
Autrement dit : la contrainte numérique coûte de la mémoire sur puce, et l'équipe la récupère en réorganisant la disposition des tuiles.
Récapitulatif des couches Gated MLA¶
| Caractéristique | Valeur |
|---|---|
| Nombre de couches | 24 (indices 4, 8, …, 92, 93) |
| Têtes | 96 |
| Rang latent KV | 512 |
| Rang latent Q | 1 536 |
| Dimensions QK (nope / rope) | 128 / 64 |
| Dimension V par tête | 128 |
| Encodage de position | Aucun |
| Porte de sortie | Sigmoïde de rang plein |
| Paramètres par couche | ~232 M |
| Précision de sortie (entraînement) | FP32 |
Vérification de compréhension¶
Un modèle 100 % NoPE fonctionnerait-il ?
Mal. Des travaux ont montré qu'un décodeur causal pur peut inférer une notion de position à partir du masque causal seul, mais faiblement et sans passer l'échelle. Chez Kimi K3, NoPE n'est viable que parce que les couches KDA portent l'information positionnelle. C'est une propriété de l'hybride, pas de MLA.
Pourquoi la couche 93 est-elle une MLA plutôt qu'une KDA ?
Pour que la dernière opération de mélange de jetons avant la production du logit soit un accès exact au contexte, et non une lecture dans une mémoire compressée. Le rapport le dit explicitement.
Le cache MLA de Kimi K3 à 1 M de jetons, cela fait quelle taille ?
\(1\,048\,576 \times (512 + 64) \times 24\ \text{couches} \times 2\ \text{octets} \approx 29\) Gio en BF16. C'est déjà considérable — mais à comparer aux ~1,2 Tio qu'exigerait une attention classique sans compression MLA sur 93 couches.
Chapitre précédent : Kimi Delta Attention · Chapitre suivant : Attention Residuals