Optimisation de la mémoire GPU : comment surmonter les goulots d'étranglement

Le déploiement de modèles de langage se heurte souvent à la saturation de la mémoire GPU. L'utilisation de PagedAttention et de caches hiérarchiques résout ce problème d'infrastructure.

Optimisation de la mémoire GPU : comment surmonter les goulots d'étranglement
Photo : Unsplash / Fotis Fotopoulos

Le déploiement de modèles de langage à grande échelle en entreprise met souvent en lumière un paradoxe frustrant : alors que l'utilisation des unités de calcul GPU reste faible, la consommation de mémoire atteint 100 %, entraînant des erreurs de saturation et des temps de réponse excessifs. Ce goulot d'étranglement découle rarement d'un manque de puissance brute, mais plutôt d'une gestion inefficace du cache KV.

Comprendre le goulot d'étranglement du cache KV

Les modèles de langage génèrent du texte de manière autorégressive, produisant les jetons un par un. Lors du mécanisme d'attention, chaque nouveau jeton doit analyser l'ensemble du texte précédent. Pour éviter des recalculs mathématiques constants, les moteurs d'inférence stockent les matrices de clés et de valeurs des jetons précédents dans la mémoire rapide du GPU, constituant ainsi le cache KV.

Bien que ce mécanisme optimise la puissance de calcul, il pose un défi majeur : la taille du cache KV augmente de manière dynamique avec chaque jeton généré et chaque utilisateur simultané. Sous une fenêtre de contexte de 32 000 jetons, une seule requête active peut monopoliser des dizaines gigaoctets uniquement pour son cache KV.

La fragmentation mémoire des serveurs traditionnels

Les serveurs d'inférence traditionnels souffrent d'une fragmentation structurelle profonde. Ne connaissant pas la longueur exacte de la réponse, l'approche naïve consistait à réserver un bloc de mémoire contigu et massif pour chaque utilisateur en fonction de la fenêtre de contexte maximale.

Cette méthode génère deux inefficacités majeures :

  • De la mémoire verrouillée en pure perte pour des espaces réservés mais inutilisés.

  • Des trous de fragmentation qui empêchent l'allocation de nouveaux blocs contigus lors de l'arrivée de requêtes.

Le modèle des systèmes d'exploitation : PagedAttention

Les ingénieurs du moteur open source vLLM ont compris que la gestion de la mémoire GPU devait s'inspirer des systèmes d'exploitation comme Linux, qui allouent la mémoire par petites pages à la demande.

Cette approche, nommée PagedAttention, fragmente le cache KV en petits blocs physiques fixes de 16 jetons. Une table de correspondance virtuelle relie l'ordre logique de la phrase aux emplacements physiques, réduisant le gaspillage mémoire de 80 % à moins de 4 %.

L'optimisation des architectures RAG avec LMCache

Les systèmes RAG d'entreprise nécessitent l'ingestion de documents longs, une phase initiale lourde en calculs appelée pré-remplissage. Dans les architectures cloud standard, le cache KV disparaît à chaque redémarrage de pod.

Pour pallier cette limite, des solutions comme LMCache stockent les blocs de jetons dans des couches hiérarchiques, telles que la mémoire vive du CPU ou des disques NVMe rapides. Lorsqu'un utilisateur interroge un document déjà analysé, le moteur récupère instantanément le cache KV existant.

Mesures pratiques pour l'optimisation des clusters

Les équipes techniques peuvent appliquer quatre mesures pour optimiser leurs performances :

  • Migrer vers des moteurs d'inférence spécialisés intégrant PagedAttention, tels que vLLM ou SGLang.

  • Analyser les métriques en séparant le temps d'attente du premier jeton et la latence inter-jetons.

  • Activer la mise en cache de préfixes pour réutiliser les instructions système.

  • Planifier la capacité des infrastructures en fonction de ratios de données précis.

Dans la même rubrique