The Labs logoThe Labs
← Tous les articles
Technologie · mesuré, majoritairement négatif

Réduire la mémoire d'un modèle de langage : les économies sont plus faibles que ne le suggèrent les articles

Lorsqu'un modèle de langage traite un long prompt, il stocke une clé et une valeur pour chaque token. Cet ensemble forme le cache KV. Pour 32 000 tokens, il occupe 2,4 Go par requête sur le modèle testé. De nombreux articles proposent d'en supprimer la majeure partie et de ne conserver que les tokens importants. Nous avons testé cette approche sur un GPU accessible gratuitement en posant deux questions rarement étudiées ensemble : le modèle retrouve-t-il encore les informations nécessaires ? Et la mémoire est-elle réellement libérée ?

Conceptual illustration generated with AI. Not experimental data or a depiction of the actual equipment.

Réponse courte : à 25 % et 12,5 % du cache, chaque méthode testée a perdu les faits nécessaires presque à chaque fois.

Ce que nous avons mesuré

Le modèle était Qwen3-4B-Instruct sur un T4 Kaggle gratuit. La tâche était synthétique : plusieurs fiches projets (« Project X has status S and codeword C ») cachées parmi des documents sans rapport, puis une question sur un, deux ou les trois. Les réponses étaient notées par correspondance exacte du mot de code. Les prompts faisaient 8k, 16k et 32k tokens, 6 cas chacun. L'exécution a été arrêtée à une limite de temps convenue, donc le niveau 32k compte 3 cas sur 6. Il reste 255 résultats enregistrés sur 306 prévus. Chaque politique et budget ci-dessous compte 15 questions.

Nous avons comparé six façons de choisir quoi garder : aucune éviction, une fenêtre glissante, des tokens aléatoires, un score key-norm et nos propres réimplémentations des idées de scoring SnapKV et H2O. Chacune a été exécutée au niveau token et au niveau page (blocs de 16 tokens).

Ce qui a marché et ce qui n'a pas marché
BONNES RÉPONSES SUR 15, QUAND25 % DU CACHE EST CONSERVÉCache complet15 sur 15snap, pages, 25%2 sur 15keynorm, tokens, 25%2 sur 15h2o, tokens, 25%1 sur 15random, tokens, 25%0 sur 15window, 25%0 sur 15

Source : résultats enregistrés de l'exécution, 255 enregistrements. Le budget de 12,5 % est pire : 0 ou 1 bonne réponse sur 15 pour chaque méthode.

Avec le cache complet, le modèle a répondu 15 sur 15. Avec un quart, les meilleures méthodes ont obtenu 2 sur 15. La mauvaise réponse typique gardait le nom du projet mais inventait les chiffres, par exemple « cobalt-381 » au lieu de « cobalt-2609 ». Notre lecture : le scoring garde le sens d'un token et abandonne le nombre rare qui porte la réponse. C'est une hypothèse issue de ces exécutions, pas un mécanisme testé.

La mémoire qui ne revient pas

Les serveurs d'inférence stockent le cache en pages de 16 tokens. Une page ne peut être réutilisée que lorsque ses 16 tokens ont disparu. Si l'on supprime des tokens dispersés, on libère bien moins qu'on ne le pense. Nous avons simulé cette comptabilité sur les mêmes exécutions. Les méthodes alignées sur les pages libèrent presque tout, mais elles ont aussi perdu la réponse. Les méthodes qui gardaient un peu de précision libéraient beaucoup moins.

MÉMOIRE LIBÉRÉE PAR QUESTION, EN MO (PAGESSIMULÉES), MOYENNE SUR LES DEUX BUDGETS ET TOUTES LES LONGUEURSwindow2373 MBsnap, pages1963 MBsnap, tokens1406 MBh2o, tokens976 MBkeynorm, tokens320 MBrandom, tokens201 MB

Source : comptabilité simulée des pages en blocs de 16 sur les exécutions enregistrées (moyenne de 30 cas par méthode). Pas une mesure sur un vrai serveur paginé. Chaque méthode fondée sur un score a logiquement retiré environ 1962 Mo par question, donc 320 Mo libérés représentent 16 % de cela. La méthode fenêtre a logiquement retiré 2376 Mo par question, dont 2373 Mo sont devenues des pages entières (la valeur tracée). Pourquoi elle retire plus que les autres méthodes n'a pas été vérifié ; à comparer avec prudence.

Un résultat de plus. Dans le cache statique Hugging Face que nous avons utilisé, le décodage n'a pas accéléré après l'éviction (environ 1510 à 1640 ms par token). Cela indique que la bibliothèque applique toujours l'attention sur toute la largeur. Cela ne dit pas qu'un serveur paginé se comporterait pareil.

Limites

Ces résultats soulèvent une question qui mérite une évaluation rigoureuse : une méthode devrait sélectionner des pages entières tout en conservant les nombres et les noms. Nous n'avons pas encore construit une telle méthode.