Simple Science

La science de pointe expliquée simplement

# Informatique# Apprentissage automatique# Informatique distribuée, parallèle et en grappes

Améliorer l'efficacité des grands modèles de langage

Une nouvelle méthode de gestion de la mémoire améliore les performances des grands modèles de langage.

― 9 min lire


Utilisation efficace deUtilisation efficace dela mémoire dans les LLMsperformances et réduit les coûts.Une nouvelle méthode améliore les
Table des matières

Les grands modèles de langage (LLMs) comme GPT et PaLM changent notre façon d'interagir avec la tech, permettant des applis comme l'aide à la programmation et les chatbots. Beaucoup de boîtes essaient de proposer ces modèles comme des services en ligne, mais les faire tourner coûte cher. Ces modèles ont souvent besoin de beaucoup de matos, comme des GPU, pour traiter les requêtes rapidement. Traiter une seule requête peut coûter dix fois plus qu'une recherche classique à cause de ces exigences élevées. Du coup, trouver comment améliorer l'efficacité des LLMs et réduire les coûts est super important.

Les LLMs génèrent du texte en prédisant un mot (ou un token) à la fois en se basant sur les mots précédents et le contexte. Ça veut dire qu'ils fonctionnent souvent de manière séquentielle, ce qui peut ralentir le truc et limiter le nombre de requêtes traitées en même temps. L'utilisation de la mémoire pour ces requêtes peut être énorme et mène souvent à des inefficacités.

Défis de gestion de la mémoire

Quand un modèle traite des requêtes, il doit garder ce qu'on appelle un cache clé-valeur (KV) pour se souvenir du contexte de la conversation ou de la tâche. Ce cache peut devenir assez grand et, s'il n'est pas géré correctement, ça mène à du gaspillage de mémoire et limite le nombre de requêtes traitées en même temps.

Actuellement, beaucoup de systèmes stockent les caches KV de manière à utiliser des blocs de mémoire contigus. Cette méthode a deux problèmes principaux. D'abord, il y a souvent beaucoup de mémoire gaspillée parce que les requêtes peuvent varier énormément en longueur. Si une requête est configurée pour utiliser un bloc de mémoire beaucoup plus grand que ce dont elle a réellement besoin, ça mène à de la Fragmentation interne, où certaines parties de ce bloc de mémoire restent inutilisées. Deuxièmement, si les blocs de mémoire sont alloués d'une manière qui ne permet pas de les réutiliser facilement pour d'autres requêtes, ça peut mener à de la Fragmentation externe.

Ces deux problèmes réduisent l'efficacité globale du système, ce qui est problématique quand on essaie de traiter beaucoup de requêtes en même temps. Il y a aussi une perte de partage de mémoire potentiel, qui pourrait se produire quand plusieurs requêtes partagent le même contexte ou les mêmes informations.

Solution proposée

Pour s’attaquer à ces problèmes de gestion de la mémoire, une nouvelle approche appelée PagedAttention est introduite. Ce système est inspiré de la façon dont les systèmes d'exploitation traditionnels gèrent la mémoire en utilisant une technique appelée pagination. Au lieu de dédier un bloc de mémoire spécifique pour chaque requête, le Cache KV est divisé en plus petits blocs. Ces blocs peuvent être stockés de manière non contiguë, permettant à la mémoire d'être utilisée de façon plus flexible.

Ce design fait quelques choses importantes :

  1. Réduit la fragmentation interne : Comme les petits blocs peuvent être alloués au besoin, il y a moins d'espace perdu dans chaque bloc.
  2. Élimine la fragmentation externe : Tous les blocs sont de la même taille, ce qui permet de les réutiliser plus facilement pour différentes requêtes.
  3. Facilite le partage de mémoire : Les requêtes qui partagent le même contexte peuvent utiliser les mêmes blocs de mémoire, maximisant l'efficacité.

Améliorations des performances

Des tests montrent que cette nouvelle approche de gestion de la mémoire améliore significativement le Débit des LLMs populaires, les rendant 2 à 4 fois plus efficaces comparé aux systèmes existants. Cette amélioration est particulièrement visible lors du traitement de séquences plus longues, de modèles plus grands ou de méthodes de décodage complexes.

Comment fonctionnent les modèles de langage

Les LLMs comme le modèle Transformer génèrent du texte en évaluant la probabilité du prochain mot dans une phrase en fonction de ce qui a déjà été dit. Pour chaque nouveau mot, le modèle regarde les tokens qui l'ont précédé et utilise ceux-ci pour prédire le suivant.

Lorsqu'une requête est faite à un LLM, cela implique deux phases principales :

  1. Phase de prompt : Le modèle prend l'ensemble du prompt de l'utilisateur et calcule la probabilité du premier nouveau token. Pendant cette phase, il génère aussi des vecteurs de clé et de valeur qui représentent le contexte.
  2. Phase de génération : Le modèle génère des tokens supplémentaires un par un en se basant sur les tokens déjà générés. Chaque génération de token dépend des vecteurs de clé et de valeur du contexte du token.

Ce processus séquentiel peut conduire à des réponses plus lentes puisque cela sous-utilise souvent la puissance de calcul disponible.

Techniques de traitement par lots efficaces

Une façon d'améliorer les performances est le traitement par lots, où plusieurs requêtes sont traitées ensemble. Cependant, le traitement par lots pose des défis parce que les requêtes peuvent varier considérablement en termes de temps d'arrivée et de longueur. Une approche simple pourrait causer des retards ou des ressources gaspillées.

Des techniques de traitement par lots plus fines peuvent aider à surmonter ces défis. En permettant plus de flexibilité dans la manière dont les requêtes sont traitées, ces méthodes peuvent considérablement augmenter le débit en réduisant les temps d'attente et le gaspillage de mémoire.

Défis de mémoire lors du traitement des requêtes

La taille du cache KV augmente rapidement avec le nombre de requêtes, menant à des problèmes de gestion de la mémoire. Par exemple, un modèle peut nécessiter une grande quantité de mémoire juste pour stocker ce cache, limitant le nombre de requêtes pouvant être traitées en même temps.

Il est crucial d'avoir une approche sophistiquée de gestion de la mémoire.

Limitations du système actuel

La plupart des systèmes existants stockent le cache KV comme un seul bloc de mémoire, entraînant plusieurs formes de gaspillage :

  • Mémoire réservée qui n'est pas utilisée.
  • Fragmentation interne due à une surallocation d'espace.
  • Fragmentation externe à cause des tailles de requêtes variables.

Le résultat peut faire chuter l'utilisation efficace de la mémoire à aussi bas que 20%.

Le nouveau système de gestion de la mémoire

Le système proposé récemment s'inspire de la façon dont les systèmes d'exploitation gèrent la mémoire par pagination. Au lieu de nécessiter un bloc entier de mémoire dès le départ pour chaque requête, ce système ne réserve que ce qui est nécessaire au fur et à mesure que la requête avance.

Dans cette approche, un gestionnaire de cache KV prend en charge l'organisation de la mémoire, rendant possible l'allocation et la désallocation de mémoire plus dynamiquement. Cela permet de s'assurer que la mémoire disponible peut être utilisée efficacement, maximisant le débit.

Gestion de différents scénarios de décodage

La nouvelle méthode peut aussi gérer divers scénarios de décodage efficacement. Par exemple, dans des cas comme l'échantillonnage parallèle, où un modèle génère plusieurs sorties à partir d'une seule entrée, le cache KV peut être partagé entre ces sorties, rendant l'utilisation de la mémoire plus efficace.

Dans des tâches plus complexes comme la recherche par faisceaux, le modèle peut gérer dynamiquement le cache KV pour partager la mémoire efficacement tout au long du processus de décodage, permettant des réductions significatives de l'utilisation de la mémoire.

Aspects de la planification et de la préemption

Quand la demande de requêtes excède la capacité du système, une forme de planification est nécessaire pour prioriser les requêtes. La méthode proposée utilise un système de premier arrivé, premier servi pour garantir l'équité.

Exécution distribuée

Pour les modèles plus grands qui dépassent la capacité mémoire d'un seul GPU, le système est conçu pour fonctionner sur plusieurs GPU tout en gérant la mémoire efficacement. Cela garantit que toutes les parties du modèle peuvent accéder à la mémoire nécessaire sans gaspillage de ressources.

Évaluation des performances

La méthode nouvellement introduite a été testée sur divers charges de travail et comparée à des systèmes de référence de premier plan. Les résultats indiquent une amélioration significative du débit sans sacrifier la précision.

Conclusion

Cet nouvel algorithme d'attention et ce système de gestion de la mémoire offrent une nouvelle approche pour servir efficacement les grands modèles de langage. En réduisant le gaspillage de mémoire et en permettant le partage entre les requêtes, ce système peut grandement améliorer le débit dans des applications pratiques.

Les travaux futurs peuvent explorer encore plus d'applications de ces techniques de gestion de la mémoire, aidant à réduire encore le coût et la complexité de travail avec les grands modèles de langage.

Source originale

Titre: Efficient Memory Management for Large Language Model Serving with PagedAttention

Résumé: High throughput serving of large language models (LLMs) requires batching sufficiently many requests at a time. However, existing systems struggle because the key-value cache (KV cache) memory for each request is huge and grows and shrinks dynamically. When managed inefficiently, this memory can be significantly wasted by fragmentation and redundant duplication, limiting the batch size. To address this problem, we propose PagedAttention, an attention algorithm inspired by the classical virtual memory and paging techniques in operating systems. On top of it, we build vLLM, an LLM serving system that achieves (1) near-zero waste in KV cache memory and (2) flexible sharing of KV cache within and across requests to further reduce memory usage. Our evaluations show that vLLM improves the throughput of popular LLMs by 2-4$\times$ with the same level of latency compared to the state-of-the-art systems, such as FasterTransformer and Orca. The improvement is more pronounced with longer sequences, larger models, and more complex decoding algorithms. vLLM's source code is publicly available at https://github.com/vllm-project/vllm

Auteurs: Woosuk Kwon, Zhuohan Li, Siyuan Zhuang, Ying Sheng, Lianmin Zheng, Cody Hao Yu, Joseph E. Gonzalez, Hao Zhang, Ion Stoica

Dernière mise à jour: 2023-09-12 00:00:00

Langue: English

Source URL: https://arxiv.org/abs/2309.06180

Source PDF: https://arxiv.org/pdf/2309.06180

Licence: https://creativecommons.org/licenses/by/4.0/

Changements: Ce résumé a été créé avec l'aide de l'IA et peut contenir des inexactitudes. Pour obtenir des informations précises, veuillez vous référer aux documents sources originaux dont les liens figurent ici.

Merci à arxiv pour l'utilisation de son interopérabilité en libre accès.

Plus d'auteurs

Articles similaires