Connect with us

Intelligence artificielle

PowerInfer: Service rapide de grands modèles de langage avec une GPU de consommation

mm

En raison de leurs capacités exceptionnelles de création de contenu, les grands modèles de langage génératifs sont maintenant à la pointe de la révolution de l’IA, avec des efforts en cours pour améliorer leurs capacités génératives. Cependant, malgré les progrès rapides, ces modèles nécessitent une puissance et des ressources computationnelles considérables. Cela est dû en grande partie au fait qu’ils sont composés de centaines de milliards de paramètres. De plus, pour fonctionner sans heurts, les modèles d’IA génératifs s’appuient sur des milliers de GPU, ce qui entraîne des coûts d’exploitation importants. Les exigences opérationnelles élevées sont une raison clé pour laquelle les modèles d’IA génératifs ne sont pas encore déployés avec efficacité sur des appareils personnels.

Dans cet article, nous allons discuter de PowerInfer, un moteur d’inférence LLM à haute vitesse conçu pour les ordinateurs standard alimentés par une seule GPU de consommation. Le cadre PowerInfer cherche à exploiter la localité élevée inhérente à l’inférence LLM, caractérisée par une distribution en loi de puissance dans les activations des neurones. Cela signifie qu’à tout moment, un petit sous-ensemble de neurones « chauds » est constamment actif sur les entrées, tandis que le reste, appelé neurones « froids », s’active en fonction des entrées ou des exigences spécifiques. Cette approche permet au cadre PowerInfer de réduire la puissance de calcul nécessaire pour que l’IA générative produise les sorties souhaitées.

Nous allons examiner en détail le cadre PowerInfer, en explorant sa méthodologie, son pipeline et les résultats de son application pratique. Commençons.

PowerInfer: Modèle de langage rapide à grande échelle avec GPU de consommation

Les grands modèles de langage génératifs, tels que ChatGPT et DALL-E, sont connus pour leurs tâches de traitement du langage naturel et de génération de contenu sophistiquées. En raison de leurs exigences computationnelles élevées, ces modèles sont généralement déployés dans des centres de données avec des GPU avancés. La nécessité d’une telle puissance de calcul limite leur déploiement aux centres de données, soulignant la nécessité de déployer des modèles de langage à grande échelle sur des plateformes locales plus accessibles comme les ordinateurs personnels.

L’augmentation de l’accessibilité des grands modèles de langage pourrait réduire les coûts d’inférence et de génération de contenu, améliorer la confidentialité des données et permettre une personnalisation des modèles. De plus, tandis que les déploiements de centres de données donnent la priorité au débit élevé, les déploiements LLM locaux pourraient se concentrer sur la faible latence en raison de tailles de lots plus petites.

Cependant, le déploiement de ces modèles sur des appareils locaux pose des défis importants en raison de leurs exigences de mémoire considérables. Les grands modèles de langage, fonctionnant comme des transformateurs autoregressifs, génèrent du texte token par token, chaque token nécessitant l’accès à l’ensemble du modèle, composé de centaines de milliards de paramètres. Cela nécessite de nombreux GPU de haute gamme pour une génération de sortie à faible latence. De plus, les déploiements locaux traitent généralement les requêtes individuelles de manière séquentielle, limitant les possibilités de traitement parallèle.

Pour répondre aux exigences de mémoire complexes du cadre d’IA générative, les solutions existantes emploient des méthodes telles que le déchargement de modèle et la compression. Les techniques telles que la distillation, la suppression et la quantification réduisent la taille du modèle, mais sont encore trop grandes pour les GPU de consommation standard dans les ordinateurs personnels. Le déchargement de modèle, qui partitionne le modèle à la couche de transformation entre les CPU et les GPU, permet un traitement de couche distribué sur les mémoires CPU et GPU. Cependant, cette méthode est limitée par l’interconnexion PCIe lente et les capacités de calcul limitées des CPU, ce qui entraîne une latence d’inférence élevée.

Le cadre PowerInference postule que la discordance entre les caractéristiques d’inférence LLM et la structure matérielle est la principale cause des problèmes de mémoire dans l’inférence LLM. Idéalement, les données accédées fréquemment devraient être stockées dans des GPU à bande passante élevée et capacité limitée, tandis que les données moins fréquemment accédées devraient être dans des CPU à bande passante faible et capacité élevée. Cependant, le grand volume de paramètres de chaque itération d’inférence LLM rend l’ensemble de travail trop grand pour un seul GPU, ce qui entraîne une exploitation inefficace de la localité.

Le processus d’inférence dans les grands modèles de langage montre une localité élevée, avec chaque itération activant un nombre limité de neurones. Le cadre PowerInference vise à exploiter cette localité en gérant un petit nombre de neurones « chauds » avec le GPU, tandis que le CPU gère les neurones « froids ». Il pré-sélectionne et précharge les neurones « chauds » dans le GPU et identifie les neurones activés pendant l’exécution. Cette approche minimise les coûteuses transferts de données PCIe, permettant aux GPU et CPU de traiter leurs neurones assignés de manière indépendante.

Cependant, le déploiement de LLM sur des appareils locaux fait face à des obstacles. Les prédicteurs en ligne, essentiels pour identifier les neurones actifs, consomment une quantité considérable de mémoire GPU. Le cadre PowerInfer utilise une méthode adaptative pour construire de petits prédicteurs pour les couches avec une asymétrie et une rareté d’activation plus élevées, en maintenant la précision tout en réduisant la taille. De plus, les cadres LLM nécessitent des opérateurs épars spécialisés. Le cadre PowerInfer emploie des opérateurs épars sensibles aux neurones qui communiquent directement avec les neurones, éliminant le besoin de conversions de format épars spécifiques.

Enfin, placer les neurones activés entre le CPU et le GPU de manière optimale est difficile. Le cadre PowerInfer utilise une phase hors ligne pour créer une politique de placement de neurones, en mesurant l’impact de chaque neurone sur les résultats de l’inférence LLM et en le formulant comme un problème linéaire entier.

Architecture et méthodologie

La figure suivante décrit l’architecture du cadre PowerInfer, composée de composants hors ligne et en ligne dans le pipeline. 

Grâce à la variation observée dans les propriétés de localité parmi les différents grands modèles de langage, le composant hors ligne profile la rareté d’activation de la structure LLM, lui permettant de distinguer les neurones « chauds » et « froids ». D’un autre côté, lors de la phase hors ligne, deux types de neurones sont chargés par le moteur d’inférence dans les CPU et les GPU, servant ainsi les requêtes LLM pendant l’exécution avec une faible latence. 

Phase hors ligne : solveur de politique et profileur LLM

Lors de la phase hors ligne, un composant profileur LLM utilise des requêtes dérivées d’un ensemble de données générales pour collecter des données d’activation à partir du processus d’inférence. Dans la première étape, il surveille l’activation des neurones dans toutes les couches de la structure, puis utilise un composant solveur de politique pour catégoriser les neurones en « chauds » ou « froids ». L’objectif principal du solveur de politique est d’allouer les neurones activés plus fréquemment aux couches GPU, tandis que les autres sont alloués aux couches CPU. Dans la deuxième étape, le composant solveur de politique utilise des métriques d’impact de neurone et des spécifications matérielles pour équilibrer la charge de travail entre les couches, et maximiser la métrique d’impact du GPU pour les neurones en utilisant la programmation linéaire entière. 

Phase en ligne : moteur d’inférence LLM sensible aux neurones

Une fois la phase hors ligne exécutée avec succès, le cadre passe à l’exécution de la phase en ligne. Dans la troisième étape du processus, le moteur en ligne attribue les neurones « chauds » et « froids » à leurs unités de traitement respectives avant de traiter les requêtes utilisateur, en fonction de la sortie du solveur de politique hors ligne. Lors de l’exécution, et dans la quatrième étape, le moteur en ligne gère les calculs GPU-CPU en créant des exécuteurs CPU et GPU qui sont des threads s’exécutant sur le côté CPU. Le moteur prédit ensuite les neurones activés et passe les neurones non activés. Les neurones activés sont alors préchargés dans le GPU pour le traitement. Pendant ce temps, le CPU calcule et transfère les résultats pour ses neurones à intégrer avec le GPU. Le moteur en ligne est capable de se concentrer sur les lignes et les colonnes individuelles de neurones dans les matrices, car il utilise des opérateurs épars sensibles aux neurones sur les CPU ainsi que sur les GPU. 

Prédicteurs d’éparpillement adaptatifs

Le concept principal pour réduire les charges de calcul par le moteur d’inférence en ligne dans le cadre PowerInfer est qu’il ne traite que les neurones qu’il prédit être activés. Traditionnellement, dans chaque couche de transformation, un cadre utilise deux prédicteurs différents pour prédire l’activation des neurones dans les blocs MLP et d’auto-attention, ce qui limite le calcul d’inférence aux neurones prédits comme actifs. Cependant, il est difficile de concevoir des prédicteurs efficaces pour le déploiement local, car la quantité limitée de ressources rend difficile l’équilibre entre la taille du modèle et la précision de prédiction. Puisque ces prédicteurs sont déployés fréquemment par le cadre pour prédire les neurones actifs, ils doivent être stockés dans le GPU pour permettre un accès plus rapide. Cependant, les cadres déployés généralement un grand nombre de prédicteurs qui occupent une quantité considérable de mémoire, même celle nécessaire pour stocker les paramètres LLM. 

De plus, la taille des prédicteurs est généralement déterminée par deux facteurs : la dissymétrie interne et la rareté des couches LLM. 

Pour optimiser ces facteurs, le cadre PowerInfer utilise une méthode d’entraînement itératif pour chaque prédicteur dans la couche de transformation sans une taille fixe. Dans la première étape de cette méthode d’entraînement, la taille du modèle de base est établie sur la base du profil de rareté du modèle, et la taille du modèle est ajustée itérativement en prenant en compte la dissymétrie d’activation interne pour maintenir la précision. 

Placement et gestion des neurones

Comme mentionné précédemment, alors que le composant solveur de politique hors ligne détermine la politique de placement de neurones, le composant moteur d’inférence en ligne charge le modèle dans la mémoire GPU et CPU en fonction de la politique générée. Pour chaque couche qui peut ou non avoir plusieurs matrices de poids, le cadre PowerInfer attribue chaque neurone au CPU ou au GPU en fonction de savoir si le neurone est activé « chaud ». Assurer le calcul précis des neurones segmentés dans la séquence déterminée est essentiel pour des résultats précis. Pour résoudre ce problème, le cadre PowerInfer génère deux tables de neurones : une située dans la mémoire GPU et une située dans la mémoire CPU, chaque table corrélant les neurones individuels à leur position d’origine dans la matrice. 

Opérateur sensible aux neurones

Étant donné la rareté d’activation observée dans les grands modèles de langage, les neurones inactifs et leurs poids peuvent être ignorés par les opérations de multiplication de matrice, ce qui crée un besoin d’opérateurs épars. Au lieu d’employer des opérateurs épars qui ont plusieurs limitations, le cadre PowerInfer utilise des opérateurs sensibles aux neurones qui calculent les neurones et les poids activés directement sur le GPU et le CPU sans nécessiter de conversion au format dense pendant l’exécution. Les opérateurs sensibles aux neurones diffèrent des opérateurs épars traditionnels car ils se concentrent sur les vecteurs de ligne et de colonne individuels dans une matrice unique plutôt que de se concentrer sur l’ensemble de la matrice. 

Politique de placement de neurones

Pour exploiter les capacités de calcul des CPU et des GPU, le composant hors ligne du cadre PowerInfer génère une politique de placement qui guide le cadre lors de l’attribution de neurones aux couches CPU ou GPU. Le solveur de politique génère cette politique et contrôle le placement de neurones dans chaque couche, ce qui aide à déterminer la charge de travail de calcul pour les unités de traitement individuelles. Lors de la génération de la politique de placement, le composant solveur de politique prend en compte différents facteurs, notamment la fréquence d’activation pour chaque neurone, la surcharge de communication et les capacités de calcul telles que les bandes passantes et les tailles de mémoire de chaque unité de traitement. 

Résultats et mise en œuvre

Pour démontrer les capacités de généralisation du cadre PowerInfer sur des appareils avec différentes configurations matérielles, les expériences sont menées sur deux ordinateurs personnels distincts : l’un équipé d’un processeur Intel i9-13900K, d’une GPU NVIDIA RTX 4090 et de 192 Go de mémoire hôte, tandis que l’autre fonctionne avec un processeur Intel i7-12700K, une GPU NVIDIA RTX 2080Ti et 64 Go de mémoire hôte. 

Les performances de bout en bout du cadre PowerInfer sont comparées à celles de llama.cpp avec une taille de lot de 1 et des paramètres de déploiement par défaut. Le cadre échantillonne ensuite des invites à partir des ensembles de données ChatGPT et Alpaca, étant donné la variabilité de la longueur observée dans les entrées et les sorties de dialogue du monde réel. La figure suivante montre les vitesses de génération pour les différents modèles. 

Comme on peut le voir, le cadre PowerInfer génère 8,32 jetons par seconde et atteint jusqu’à 16 jetons générés par seconde, surpassant ainsi le cadre llama.cpp d’une marge significative. De plus, à mesure que le nombre de jetons de sortie augmente, les performances du cadre PowerInfer s’améliorent également, car la phase de génération a un impact significatif sur le temps d’inférence global. 

De plus, comme on peut le voir dans l’image ci-dessus, le cadre PowerInfer surpasse le cadre llama.cpp sur les ordinateurs personnels de faible gamme avec un taux de génération de pointe de 7 jetons par seconde et une vitesse de génération de jetons moyenne de 5 jetons par seconde. 

L’image ci-dessus montre la distribution de la charge de neurones entre le GPU et le CPU pour les deux cadres. Comme on peut le voir, le cadre PowerInfer augmente considérablement la part de charge de neurones du GPU, passant de 20 à 70 %. 

L’image ci-dessus compare les performances des deux cadres sur deux ordinateurs personnels avec des spécifications différentes. Comme on peut le voir, le cadre PowerInfer offre systématiquement une vitesse de génération de jetons de sortie élevée par rapport au cadre llama.cpp. 

Pensées finales

Dans cet article, nous avons discuté de PowerInfer, un moteur d’inférence LLM à haute vitesse pour un ordinateur standard alimenté par une seule GPU de consommation. Le cadre PowerInfer tente d’exploiter la localité élevée inhérente à l’inférence LLM, une méthode caractérisée par la distribution en loi de puissance des activations de neurones. Le cadre PowerInfer est un système d’interférence rapide conçu pour les grands modèles de langage qui utilise des prédicteurs adaptatifs et des opérateurs sensibles aux neurones pour activer les neurones et la rareté de calcul. 

Un ingénieur de profession, un écrivain de cœur. Kunal est un rédacteur technique avec une profonde affection et une compréhension de l'IA et du ML, dédié à simplifier les concepts complexes dans ces domaines grâce à sa documentation engageante et informative.