Modèle / jeu de données
NVIDIA/kvpress avatar
NVIDIA/kvpress

kvpress : compresser le cache KV sans réentraîner le modèle

LLM KV cache compression made easy

1 209 étoiles179 forksPythonApache-2.0
GitHub

En bref

De quoi s’agit-il ?
kvpress est une bibliothèque Python de NVIDIA qui rassemble une dizaine de méthodes de compression du cache clé-valeur, activables via un pipeline transformers personnalisé. Le projet est jeune, orienté recherche, et suppose une lecture attentive de la documentation avant tout usage en production.
À qui s’adresse-t-il ?
kvpress convient aux équipes qui expérimentent la compression du cache KV et veulent comparer plusieurs méthodes sans réécrire leur code de génération. Il ne convient pas à qui cherche un gain de mémoire garanti en production : la documentation ne fournit aucune mesure de débit ni de qualité, et la compatibilité de DecodingPress se limite aux ScorerPress.
Puis-je l’utiliser commercialement ?
Oui. Apache-2.0 est une licence permissive : vous pouvez utiliser, modifier et vendre un logiciel qui en dépend, à condition de conserver les mentions de droit d’auteur et de licence.
Est-il encore maintenu ?
Oui. Les derniers commits datent d’il y a 1 jour.
En quel langage est-il écrit ?
Principalement Python, d’après les statistiques de langage de GitHub.

Ces réponses reposent sur les données GitHub du projet (dernière synchronisation le 15 septembre 2026) et sur notre analyse. Elles ne constituent pas un avis juridique.

ANALYSE OPEN SOURCE APPROFONDIE

Le cache KV, ce coût qui grandit avec le contexte

Le README donne un chiffre qui résume le problème : traiter 1M de tokens avec Llama 3.1-70B en float16 demanderait jusqu'à 330GB de mémoire. Cette croissance est linéaire en longueur de contexte, et elle frappe au moment du prefilling, quand le cache se remplit avant que le premier token de réponse ne soit produit. kvpress vise les chercheurs et développeurs qui travaillent sur ce goulot précis : réduire l'empreinte du cache pendant le prefilling, sans réentraîner le modèle. Toutes les presses actuelles sont annoncées comme training free, ce qui est le point de conception central. On ne modifie pas les poids, on supprime des paires clé-valeur jugées peu importantes selon un score.

Une hiérarchie de presses, du score au budget par couche

L'architecture visible dans le dépôt est une hiérarchie de classes. Tout part de BasePress (kvpress/presses/base_press.py). Plusieurs presses héritent ensuite de ScorerPress (kvpress/presses/scorer_press.py) et partagent le même principe : calculer un score par paire KV, puis élaguer les scores les plus faibles. Les variantes diffèrent par la définition du score. KnormPress utilise l'inverse de la norme de la clé. SnapKVPress prend la moyenne des poids d'attention des dernières requêtes. ExpectedAttentionPress estime le poids d'attention attendu pendant la phase de génération. StreamingLLMPress conserve uniquement les tokens initiaux et récents, une règle positionnelle et non un score. PyramidKVPress sort du schéma uniforme : il alloue un budget plus large aux couches basses et plus étroit aux couches hautes. QFilterPress projette les clés sur la composante SVD principale des vecteurs de requête pour approximer les scores. Chaque press expose un attribut compression_ratio.

Le pipeline kv-press-text-generation

L'intégration à transformers passe par un pipeline enregistré automatiquement au nom de kv-press-text-generation dès que kvpress est importé. Il gère les gabarits de conversation et la tokenisation. L'exemple du README instancie ExpectedAttentionPress avec compression_ratio=0.5, appelle pipe(context, question=question, press=press) et lit la clé "answer" du dictionnaire retourné. Un détail compte pour l'évaluation : la compression n'est appliquée qu'aux tokens du contexte, ce qui permet de tester plusieurs questions sur un même contexte compressé. C'est un choix pratique pour comparer des presses à contexte fixe, mais cela signifie aussi que la question elle-même n'est jamais compressée, ce qui éloigne légèrement le scénario d'un service où les tours de conversation s'accumulent.

DecodingPress : la compression pendant la génération

La compression en décodage est présentée comme expérimentale. DecodingPress enveloppe une base_press et compresse périodiquement le cache pendant la génération de tokens. Ses paramètres sont compression_interval (512 par défaut), target_size (2048 par défaut) et hidden_states_buffer_size (256 par défaut). La logique change : au lieu d'un ratio, on fixe une taille cible, et le ratio est recalculé automatiquement à chaque intervalle pour retomber sur target_size. Le README précise que seuls les ScorerPress sont acceptés comme base_press, car le décodage et le prefilling ne se compressent pas de la même façon. Certaines presses n'ont pas besoin d'états cachés bufferisés et peuvent mettre hidden_states_buffer_size à 0. L'exemple associe KnormPress à compression_interval=10 et target_size=512, avec attn_implementation réglé sur flash_attention_2.

Installation et dépendances optionnelles

L'installation standard tient en une commande : pip install kvpress. Pour une installation locale, le README recommande uv : git clone du dépôt, puis uv sync dans le répertoire. Les dépendances optionnelles s'ajoutent par extras, par exemple uv sync --extra eval --extra flash-attn. Ce découpage indique que l'évaluation et l'attention Flash ne font pas partie du socle minimal, et que les exemples utilisant flash_attention_2 exigent l'extra correspondant. Rien dans le matériel fourni ne décrit la matrice de compatibilité entre versions de transformers, de PyTorch et de CUDA, ni les versions de Python prises en charge. C'est une zone à vérifier soi-même avant de figer un environnement.

Ce que la documentation ne dit pas

Le README ne contient aucune mesure de qualité après compression, aucun chiffre de débit, aucune comparaison chiffrée entre presses. Il renvoie à un article arXiv (2510.00636), à un blog Hugging Face et à un leaderboard externe pour les évaluations, mais ces résultats ne sont pas reproduits dans le dépôt lui-même. Autrement dit, choisir un compression_ratio reste une décision à valider sur votre propre tâche. La limitation la plus nette concerne DecodingPress : la restriction aux ScorerPress exclut de fait StreamingLLMPress ou PyramidKVPress en tant que base. La compression en prefilling, elle, s'applique au contexte uniquement, comme indiqué plus haut. Enfin, le projet n'a pas de page d'accueil dédiée : la documentation de référence est le README et les notebooks cités.

Face à H2O ou aux implémentations maison

L'alternative la plus directe est d'implémenter soi-même une politique d'élagage dans le code d'attention, ou d'utiliser une bibliothèque dédiée à une seule méthode comme H2O. La différence d'approche est nette. Une implémentation maison vous lie à une méthode et à une version de transformers, mais vous contrôlez chaque détail du masque d'attention. kvpress impose sa hiérarchie BasePress et ScorerPress, en échange de quoi vous pouvez permuter ExpectedAttentionPress et KnormPress en changeant une ligne, et réutiliser le même pipeline. Ce que kvpress n'apporte pas, c'est un moteur d'inférence optimisé : il s'appuie sur transformers et sur les implémentations d'attention existantes. Si votre goulot est le débit de serving plutôt que la mémoire du cache, l'outil n'est pas le bon point d'attaque.

Licence, maintenance et coût de mise à jour

Le projet est publié sous Apache-2.0, une licence permissive qui autorise l'usage commercial et la modification, avec obligation de conserver les mentions de copyright et le texte de licence, et une clause de brevets. Ce n'est pas un avis juridique : faites relire le fichier LICENSE et les licences des dépendances par qui de droit. Le rythme de publication est irrégulier : v0.5.2 le 1er avril 2026, v0.5.3 le 9 avril, v0.5.4 le 2 juillet, pour un dernier push en septembre 2026. Les écarts entre v0.5.2 et v0.5.3 suggèrent des correctifs rapprochés. La compatibilité descendante n'est pas documentée, et l'API de DecodingPress est explicitement étiquetée expérimentale : attendez-vous à des ajustements de paramètres entre versions mineures. Le coût réel de mise à jour se situe là, dans la vérification du comportement de vos presses après chaque montée de version de transformers.

Conclusion éditoriale

kvpress convient aux équipes qui expérimentent la compression du cache KV et veulent comparer plusieurs méthodes sans réécrire leur code de génération. Il ne convient pas à qui cherche un gain de mémoire garanti en production : la documentation ne fournit aucune mesure de débit ni de qualité, et la compatibilité de DecodingPress se limite aux ScorerPress. Avant d'adopter, vérifier le contenu de kvpress/presses/base_press.py, la liste des presses réellement importables dans votre version, et si votre modèle impose flash_attention_2 comme le suggère l'exemple de décodage.

Sources officielles

  1. Issues
  2. License: Apache-2.0
  3. NVIDIA/kvpress on GitHub
  4. README
  5. Releases
Notes de la communauté

Notes de la communauté