Aller au contenu

SWA Bounded Replay

Le problème

L'attention à fenêtre glissante crée une dépendance qui s'accumule avec la profondeur. Le cache local de la couche 5 dépend des états cachés de la couche 4, qui dépendent de ceux de la couche 3, et ainsi de suite.

Reconstruire exactement le cache de fenêtre glissante de \(L\) couches exige donc de rejouer :

\[ L \times n_{\text{win}} = 40 \times 128 = 5\,120 \text{ jetons} \]

à travers tout le réseau. DeepSeek-V4 avait proposé ce mécanisme sous le nom de Zero SWA Caching — et le rapport de V4.1 constate sans détour que son coût « s'est révélé prohibitif dans les déploiements de production ».

L'idée

SWA Bounded Replay ne rejoue que les \(n_{\text{win}}\) derniers jetons — 128, et non 5 120 — et tronque l'attention à fenêtre glissante au segment rejoué.

Formellement, pour un rejeu commençant à la position \(s\), une requête à la position \(i\) n'attend que les clés locales dans l'intervalle :

\[ \left[\max(s,\ i - W + 1),\ i\right] \]

au lieu de \(\left[i - W + 1,\ i\right]\). Les requêtes proches du début du segment rejoué voient donc moins de contexte local qu'elles n'en verraient dans une passe complète.

L'état reconstruit n'est pas mathématiquement identique à celui d'une passe exacte. C'est une approximation assumée.

Pourquoi cela peut fonctionner

Le pari repose sur le résultat cité au chapitre Attention creuse et fenêtre glissante : le champ récepteur effectif de la fenêtre glissante est bien plus petit que son champ récepteur théorique \(L \times n_{\text{win}}\).

Si l'information au-delà de quelques centaines de jetons ne circule pratiquement plus par la voie locale — parce qu'elle s'atténue à chaque couche — alors rejouer 128 jetons capture l'essentiel de ce que 5 120 auraient apporté.

Deux applications distinctes

Le mécanisme sert deux fois, pour deux problèmes différents.

Encoder SWA Bounded Replay

Problème résolu : rendre la mise en cache de préfixe indépendante du cache de fenêtre glissante, ce qui permet de retirer purement et simplement ce dernier du cache persistant.

Fonctionnement : quand le cache de fenêtre glissante de l'encodeur manque, on rejoue les 128 derniers jetons du préfixe en cache et on les traite avec le suffixe non mis en cache. Les jetons rejoués ne régénèrent que le cache local : le cache global en cache est réutilisé tel quel, sans recalcul ni écrasement. Le suffixe, lui, génère les deux.

Coût : le rapport reconnaît que l'état de préfixe rejoué étant approché, le cache global et le cache local calculés pour le suffixe dépendent de la position du succès de cache et ne sont donc pas identiques d'une position à l'autre.

Une conséquence sous-estimée

Cela signifie que la même requête, servie deux fois avec des états de cache différents, ne produit pas exactement les mêmes activations. Le modèle n'est plus déterministe par rapport à l'historique de cache du serveur — une propriété qui complique le débogage et la reproduction d'un incident en production.

Decoder SWA Bounded Replay

Problème résolu : terminer le préremplissage à la fin de l'encodeur, sans exécuter le décodeur — ce qui est la condition pour que le gain du CED soit réel.

Fonctionnement : sous le CED, le cache global du décodeur est projeté depuis les états cachés finaux de l'encodeur. Le seul obstacle à s'arrêter là est le cache local du décodeur, généré par chaque couche depuis son propre état caché. On rejoue donc les 128 derniers jetons du prompt, on fait passer leurs sorties d'encodeur à travers les couches du décodeur sous la même troncature, et on utilise le cache local obtenu uniquement pour le décodage, jamais pour la mise en cache de préfixe.

Gain : cela borne la passe décodeur à 128 jetons au lieu de \(L/2 \times n_{\text{win}} = 2\,560\), et divise presque par deux le calcul total de préremplissage.

Ce que cela donne au total

En supprimant le cache de fenêtre glissante du cache persistant, deux facteurs multiplicatifs se composent :

Facteur Effet
Le cache local n'est plus persisté ÷ 2 environ — il représentait près de la moitié du cache persistant de V4
Le cache global persisté est lui-même compressé (CSA2 + FP4) ÷ 4
Total ÷ 8

Une précaution méthodologique

DeepSeek indique simuler le même rejeu pendant le post-entraînement, par « adaptation consciente de l'entraînement ». Le modèle apprend donc à fonctionner avec des états locaux approchés, plutôt que de les subir à l'inférence.

C'est la même précaution que pour l'indexeur hiérarchique, et elle vaut d'être signalée : elle distingue une approximation apprise d'une approximation appliquée après coup.

Le niveau de preuve

Le rapport technique affirme à trois reprises que l'impact sur la qualité des réponses est « négligeable » ou que la stratégie « ne compromet quasiment pas » la qualité.

Aucun chiffre n'accompagne ces affirmations

Il n'y a dans le rapport ni ablation, ni comparaison de scores entre rejeu exact et rejeu borné, ni caractérisation des cas où l'écart serait le plus grand. La section 6 reconnaît d'ailleurs explicitement que « la reconstruction approchée d'état dans SWA Bounded Replay peut encore causer une dégradation des capacités dans des cas limites non testés », et annonce une attention particulière à venir sur « la reconstruction d'état SWA aux frontières de reprise de cache ».

Le mécanisme est donc revendiqué comme peu coûteux, non démontré tel.


Chapitre suivant : Cache persistant et noyaux