Intelligence artificielle

PowerInfer : Moteur d’inférence de langage à grande échelle rapide avec une GPU de consommation

mm

En raison de leurs capacités exceptionnelles de création de contenu, les modèles de langage à grande échelle 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. C’est en grande partie dû au fait qu’ils se composent 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 standards alimentés par une seule GPU de consommation. Le cadre PowerInfer vise à 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, sa pipeline et les résultats de sa mise en œuvre pratique. Commençons.

PowerInfer : Moteur d’inférence de langage à grande échelle rapide avec une GPU de consommation

Les modèles de langage à grande échelle génératifs, tels que ChatGPT et DALL-E, sont connus pour leurs tâches de traitement de langage naturel et de génération 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 modèles de langage à grande échelle 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, alors 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 modèles de langage à grande échelle, fonctionnant comme des transformateurs autorégressifs, 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 demandes 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. Des techniques telles que la distillation, le élagage et la quantification réduisent la taille du modèle, mais sont encore trop grandes pour les GPU 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 PowerInfer 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 accessibles 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 accessibles 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 modèles de langage à grande échelle démontre une localité élevée, avec chaque itération activant un nombre limité de neurones. Le cadre PowerInfer 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é-chargement les neurones « chauds » dans le GPU et identifie les neurones activés pendant l’exécution. Cette approche minimise les transferts de données coûteux 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 rencontre des obstacles. Les prévisionnistes 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évisionnistes pour les couches avec une asymétrie et une rareté plus élevées, en maintenant l’exactitude 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 ainsi la nécessité de conversions de format épars spécifiques pendant l’exécution.

Enfin, placer les neurones activés de manière optimale entre le CPU et le GPU est un défi. Le cadre PowerInfer utilise une étape 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 la pipeline.

Grâce à la variation observée dans les propriétés de localité parmi les différents modèles de langage à grande échelle, le composant hors ligne profile la rareté d’activation du cadre LLM, lui permettant de faire la distinction entre 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 demandes LLM pendant l’exécution avec une faible latence.

Phase hors ligne : résolveur de politiques et profileur LLM

Lors de la phase hors ligne, un composant profileur LLM utilise des demandes dérivées d’un ensemble de données général pour collecter des données d’activation à partir du processus d’inférence. Dans la première étape, il surveille l’activation des neurones sur toutes les couches du cadre, puis utilise un composant résolveur de politiques pour catégoriser les neurones en « chauds » ou « froids ». L’objectif principal du résolveur de politiques 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 résolveur de politiques utilise des métriques d’impact de neurones et des spécifications matérielles pour équilibrer la charge de travail entre les couches, et maximise 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 demandes des utilisateurs, en fonction de la sortie du résolveur de politiques 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 ensuite pré-chargés dans le GPU pour le traitement. Pendant ce temps, le CPU calcule et transfère les résultats pour ses neurones pour les intégrer avec le GPU. Le moteur en ligne est capable de se concentrer sur les lignes et les colonnes individuelles des matrices parce qu’il utilise des opérateurs épars sensibles aux neurones sur les CPU ainsi que sur les GPU.

Prévisionnistes de rareté adaptatifs

Le concept principal derrière la réduction des 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 comme étant actifs. Traditionnellement, dans chaque couche de transformation, un cadre utilise deux prévisionnistes différents pour prédire l’activation des neurones dans les blocs MLP et d’auto-attention, en conséquence de quoi le calcul d’inférence est limité aux neurones prédits comme étant actifs. Cependant, il est difficile de concevoir des prévisionnistes 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 la prédiction. Puisque ces prévisionnistes sont déployés par le cadre fréquemment 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éployent généralement un grand nombre de prévisionnistes 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évisionnistes 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évisionniste dans la couche de transformation sans 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 interne pour maintenir l’exactitude.

Placement et gestion des neurones

Comme mentionné précédemment, alors que le composant résolveur de politiques hors ligne détermine la politique de placement des neurones, le composant moteur d’inférence en ligne charge le modèle dans la mémoire GPU et CPU conformément à 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é de manière « chaude ». Assurer le calcul précis des neurones segmentés dans la séquence déterminée est essentiel pour obtenir 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 autre 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

Compte tenu de la rareté d’activation observée dans les modèles de langage à grande échelle, les neurones inactifs et leurs poids peuvent être contournés par des opérations de multiplication de matrices, créant ainsi 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 leurs 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 des 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 des neurones aux couches CPU ou GPU. Le résolveur de politiques génère cette politique et contrôle le placement des 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 résolveur de politiques 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 les invites à partir des ensembles de données ChatGPT et Alpaca, compte tenu de 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 l’observer, 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 affecte considérablement le temps d’inférence global.

De plus, comme on peut l’observer sur 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. Au cœur du cadre PowerInfer se trouve une tentative d’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. Le cadre PowerInfer est un système d’interférence rapide conçu pour les modèles de langage à grande échelle qui utilise des prévisionnistes 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.