1. Optimisation de l'inférence de modèle
Avec la mise en œuvre de modèles dans divers scénarios, l’accélération de l’inférence de modèles est depuis longtemps devenue un élément important de l’ingénierie de l’IA. Ces dernières années, les grands modèles basés sur l'architecture Transformer sont devenus courants, obtenant des résultats SoTA dans diverses tâches. Leurs coûts élevés en formation et en inférence rendent leurs pratiques de déploiement à des coûts raisonnables encore plus importantes.
Les défis rencontrés par l'inférence de grand modèle comprennent principalement les deux points suivants :
- Les énormes besoins en mémoire (mémoire vidéo) proviennent principalement des exigences immédiates en matière de paramètres et d'inférence du modèle lui-même.
- Pour un modèle LLaMA2-30B, le chargement du modèle lui-même dans la mémoire vidéo nécessite environ 60 Go de mémoire vidéo. Pendant le processus d'inférence, le cache KV d'un seul jeton nécessite environ 1,6 Mo de mémoire vidéo : 6 656 (layer dim) * 52 (. numéro de couche) *2 ( K & V) * 2 (fp16, 2 octets) ; pour une demande de 2 048 jetons, 3,3 Go de mémoire vidéo sont requis.
- Le parallélisme est médiocre car le processus de génération est généralement un processus en série en termes de timing, ce qui rend le processus de décodage difficile à paralléliser et devient un goulot d'étranglement informatique.
Les méthodes courantes d'optimisation du raisonnement incluent la distillation des connaissances (KD), l'élagage et la quantification, ainsi que diverses solutions proposées pour l'optimisation de la mémoire LLM (telles que Flash Attention, Paged Attention, etc.).
La distillation fait référence à la construction directe d'un petit modèle en tant que modèle d'étudiant et à l'apprentissage supervisé des connaissances du modèle original grâce à la combinaison d'étiquettes souples et d'étiquettes originales, de sorte que le petit modèle ait des performances comparables au modèle original et remplace finalement le grand modèle avec un petit modèle pour améliorer l’efficacité du raisonnement.
[Source de l'image : Distillation des connaissances : une enquête, 2021, p2]
L'élagage « affine » le modèle en éliminant les poids sans importance dans le modèle et améliore l'efficacité du raisonnement du modèle. Afin de garantir les capacités du modèle, le processus d'élagage doit généralement également être accompagné d'un réglage fin du modèle sur la base des données d'entraînement. . Selon les différentes dimensions des poids de taille, elle peut être divisée en taille structurée et taille non structurée.
- Élagage structuré : élagage généralement des canaux sans importance en blocs en fonction d'une ou plusieurs dimensions du tenseur de poids, et maintien d'une multiplication matricielle normale. Toutefois, étant donné que les canaux élagués affectent le raisonnement des couches supérieures et inférieures, la précision logique du réseau doit être modifiée ; être vérifié.
- Élagage non structuré : élagage aléatoire des éléments sans importance dans le tenseur de poids, de sorte qu'il conserve généralement la structure de poids d'origine, ce qui entraîne des calculs de multiplication clairsemés, mais il ne convient pas au matériel à usage général, un matériel spécial est donc nécessaire pour l'accélérer.
À l'heure actuelle, il existe peu d'applications d'élagage en LLM. Par exemple, le travail d'élagage suivant basé sur l'activation [1] effectue principalement un élagage non structuré basé sur la valeur absolue du poids lui-même et la valeur absolue du tenseur d'entrée. le tenseur de poids lui-même est rendu clairsemé et la perte de précision du modèle ne peut pas répondre aux exigences techniques.
[Source de l'image : Une approche d'élagage simple et efficace pour les grands modèles de langage, 2021, p2]
Comme indiqué ci-dessous, les travaux récents sur l'élagage structuré [2] utilisent des méthodes de recherche pour trouver des sous-structures dans le modèle et maintiennent la précision du modèle grâce au recyclage. La précision du modèle élagué est considérablement réduite par rapport au modèle original. par rapport à d'autres modèles plus petits avec le même nombre de paramètres (après élagage) pour montrer l'importance de sa méthode.
[Source de l'image : Sheared LLaMA : accélération de la pré-formation du modèle de langage via un élagage structuré, 2023, p3]
[Source de l'image : huggingface/Sheared-llama-1.3B]
La raison pour laquelle la quantification est devenue le premier choix pour les réseaux de neurones et le LLM tient aux avantages suivants :
- La réflexion intuitive de la réduction de la mémoire vidéo.
- Généralement, les poids LLM sont stockés dans FP16, et une fois les poids quantifiés dans int4, le volume sera intuitivement réduit à 1/4 de la taille d'origine (en fait, il peut être légèrement plus grand en raison des intégrations non quantifiées, de l'allocation de mémoire et d'autres raisons) et les besoins en ressources pour la mémoire vidéo considérablement réduits.
- Accélération des opérateurs tels que W4A16 et W8A16 pour augmenter la vitesse de calcul.
2. Introduction à la quantification
base
L’essence de la quantification est généralement de convertir les paramètres du modèle, ou le processus de raisonnement de l’ensemble du modèle, de la virgule flottante à l’entier.
Le paramètre de quantification se compose généralement de deux valeurs : l'échelle et le point zéro. La première est une virgule flottante et la seconde est un nombre entier. En supposant que x soit un tenseur (il peut s'agir d'un poids ou d'une variable intermédiaire pour le raisonnement), le processus de quantification peut s'exprimer comme suit,
Utilisez b pour représenter la largeur de bit de quantification, q{min} et q{max} représentent respectivement la plage de valeurs entières. Par exemple, la quantification int-8 peut prendre [-128,127], c'est-à-dire q{min}=. -2^(b-1 )=-128, q{max}=2^(b-1)-1=127, clamp(a;q{min},q{max}) signifie que la valeur d'entrée a est sur la base de l'opération de troncature de plage [q{min}, q{max }], x{int} représente le résultat quantifié, s et z représentent l'échelle et le point zéro des paramètres de quantification.
【图片出处:Une étude des méthodes de quantification pour une inférence efficace des réseaux neuronaux, 2021, p5;Une introduction à la quantification des grands modèles de langage, p12】
Le processus de déquantification d'un entier en virgule flottante est le suivant,
Concernant les paramètres de quantification, il existe de nombreux algorithmes basés sur la recherche, l'optimisation, le LKD (distillation couche par couche) et d'autres algorithmes pour calculer leurs solutions optimales, minimisant ainsi la perte de précision causée par la quantification et la méthode de calcul d'échelle et la plus directe ; Ceci est basé sur les éléments tenseurs min/max.
Ce qui suit est un exemple de code simple qui représente la quantification du tenseur x de fp32 au type entier int8, puis la quantification inverse à fp32 :
Un exemple de la procédure x->x{int}->x_hat est le suivant :
x avant quantification :
Après quantification x_hat :
Symétrique/asymétrique
Par rapport à la quantification asymétrique, la définition de la quantification symétrique est que la plage de valeurs entières mappée par la quantification est symétrique sur la base de la valeur 0, c'est-à-dire que le point zéro de la formule ci-dessus est 0, qmax = -qmin, ce qui donne l'expression forme de quantification plus simplifiée.
La quantification asymétrique est bénéfique pour utiliser pleinement la plage de quantification. Par exemple, le tenseur d'excitation produit par Conv+ReLU a toutes les valeurs positives. Si une quantification symétrique est utilisée, toutes les virgules flottantes seront mappées sur la plage [0~127], la moitié de la plage est inutilisée et sa précision de quantification ne l'est pas. aussi bon que la quantification asymétrique.
[Source de l'image : Enquête sur les méthodes de quantification pour une inférence efficace sur les réseaux neuronaux, 2021, p5]
En pratique, il est souvent choisi d'effectuer une quantification symétrique sur le tenseur de poids et une quantification asymétrique sur le tenseur d'entrée. Ce qui suit est une analyse du livre blanc sur la quantification de Qualcomm. Par exemple, lorsque la quantification asymétrique est sélectionnée pour les poids et les entrées, en prenant comme exemple la multiplication matricielle de la couche linéaire, l'expression est développée comme suit :
- Le premier élément est l’opération de multiplication du tenseur entier, qui est une opération immédiate nécessaire ;
- Les opérations des troisième et quatrième éléments incluent la multiplication des poids d'échelle, nuls et entiers. Ceux-ci sont tous prédits à l'avance et peuvent donc être calculés à l'avance et ajoutés sous forme de décalages.
- Le calcul du deuxième élément dépend de x{int}, qui doit être calculé immédiatement pour chaque inférence, ce qui entraînera une puissance de calcul supplémentaire.
Par conséquent, lorsque nous changeons la quantification de poids en quantification symétrique (zW=0), la formule ci-dessus est simplifiée comme suit. Dans le calcul en temps réel, il nous suffit de calculer la multiplication matricielle du premier élément, et le deuxième élément est le. élément de biais pré-calculé :
Lorsque les deux sont quantifiés symétriquement, les expressions sont simplifiées comme suit :
En comparant le calcul en virgule flottante W{x} dans le modèle original, W{int}x{int} est la multiplication entre entiers et entiers. Ce dernier est beaucoup plus rapide sur le GPU Nvidia que le premier. Il s'agit d'un modèle quantifié. la vitesse est fortement accélérée.
3. Quantification du LLM
Défis de la quantification LLM
Du point de vue des performances du modèle, l'une des prémisses que la quantification doit résoudre du début à la fin est de savoir comment maintenir la précision du modèle quantifié, c'est-à-dire faire sentir aux utilisateurs du modèle que le modèle quantifié peut maintenir les performances d'origine tout en améliorant la efficacité du raisonnement.
Les opérations qui doivent être quantifiées dans le réseau neuronal sont principalement la couche convolutive Conv(x;W) et la couche entièrement connectée Wx, c'est-à-dire la quantification du poids (WQ) et l'excitation de W et x respectivement selon les opérations décrites. dans la partie précédente Quantification (Activation Quantization, AQ).
Contrairement au modèle CNN ou au petit modèle Transformer, le tenseur d'excitation généré par la multiplication matricielle du grand modèle Transformer a généralement plus de valeurs aberrantes, c'est-à-dire que le groupe de points formé par la plupart des points de la distribution de valeurs est loin de la valeur de ces éléments. les valeurs avec une valeur absolue élevée mais une faible proportion augmentent la difficulté de quantification. Comment choisir les valeurs aberrantes est généralement une difficulté majeure dans le travail de quantification. Si vous y réfléchissez trop, la plage de quantification sera trop grande et la plage d'expression de quantification sera réduite. Si vous la tronquez trop, ces valeurs avec un absolu grand. les valeurs seront généralement dans le Il a un plus grand impact sur les résultats de l'inférence du modèle, conduisant à de mauvaises performances du modèle, et cette dernière est particulièrement évidente dans la quantification LLM.
Les figures ci-dessous montrent les statistiques de valeur d'élément d'une certaine couche de tenseurs d'entrée de Resnet18 et Opt-13B respectivement, représentant l'écart type de leurs distributions respectives. La valeur maximale de l'entrée Resnet18 est d'environ 28 sigma et la proportion de valeurs absolues. autre que 6sigma est de 0,05 % ; et La valeur d'entrée maximale du réseau Opt-13B est de 325 sigma, et la proportion de valeurs absolues autres que 6 sigma est de 0,2 %. En termes d'effet de quantification, la précision int-8 de Resnet18 ne présente pratiquement aucune perte, tandis que la précision du modèle int-8 d'Opt-13B s'est effondrée.
[Source de l'image : Introduction à la quantification des grands modèles de langage, p20]
En réponse au défi de la quantification incitative, certaines solutions tentent de réduire la précision de la quantification, comme l'idée proposée par SmoothQuant.
[Source de l'image : SmoothQuant, p4]
Dans la multiplication matricielle, ils réduisent la valeur du tenseur d'entrée ) et diag(s)·W. Cela réduit la difficulté de quantification du tenseur X tout en garantissant que le produit de l'opération de multiplication reste inchangé. Dans l'ingénierie réelle, l'erreur de quantification provoquée par ce schéma de quantification a toujours un impact relativement évident sur l'effet de raisonnement des grands modèles, et il existe des erreurs évidentes même dans la quantification de précision int-8. Par exemple, les résultats d’application SmoothQuant suivants pour Llama2-7B montrent que sa perplexité est très faible et difficile à appliquer en pratique.
Par conséquent, la plupart des solutions pratiques dans le déploiement technique actuel sont des solutions de quantification fondées uniquement sur le poids, c'est-à-dire abandonnant la quantification de l'activation.
GPTQ
GPTQ est le premier schéma de quantification accepté pour le déploiement technique. L'effet de quantification de W8A16 ou W4A16 est proche du modèle d'origine dans la plupart des scénarios, et le processus de quantification est très rapide.
Processus de quantification
En prenant comme exemple l'opération unitaire de base de la multiplication matricielle, basée sur l'erreur quadratique moyenne du produit avant et après quantification uniquement en poids, la fonction d'optimisation suivante peut être écrite,
W est le poids de la couche linéaire dans Transformer et X représente son entrée correspondante. Le processus de quantification hors ligne consiste à quantifier module par module (Transformateur) et couche par couche (Q, K, V, O, Fc1, Fc2).
Les paramètres et données sont définis comme suit :
- W∈R^{K×M},X∈R^{M×N},Y=W×X∈R^{K ×N}
- calibrer l'ensemble : une partie des données est utilisée pour l'inférence, utilisée pour afficher la plage de valeurs du tenseur d'entrée de chaque couche et quantifiée en fonction de cela.
Le processus de quantification spécifique est le suivant :
- Calculez le Hessian (la fonction d'optimisation ci-dessus concerne le Hessian de W_hat, pas le Hessian en rétropropagation), et ajoutez le terme de perturbation :
- tri par ordre d'acte (desc_act, les colonnes avec des plages de valeurs similaires sont quantifiées ensemble), basé sur diag(H), les colonnes de W sont réorganisées en fonction de la dimension M de la même manière, H est réorganisé en deux dimensions en conséquence.
- Trouvez l'inverse H^(-1) (décomposition cholesky).
- Pour W le long de la dimension M, quantifiez bloc par bloc de gauche à droite, taille de bloc B = 128, et la partie non quantifiée du côté droit est mise à jour en fonction de H ^ (-1) pour compenser la perte de quantification.
- (Boucle interne) Pour chaque bloc, quantifiez colonne par colonne, calculez l'erreur et mettez à jour les colonnes non quantifiées dans le bloc en fonction de l'erreur.
- (boucle externe) Après avoir exécuté le bloc, mettez à jour toutes les colonnes qui le suivent :
Taille de groupe
- Si la taille du groupe n'est pas spécifiée, la valeur par défaut est g=-1. Les paramètres de quantification sont comptés en unités de toutes les colonnes et le poids de chaque ligne est quantifié. Pour W∈R^{K×M}, le nombre de. les paramètres de quantification sont K × 1.
- Si la taille du groupe est spécifiée, par exemple g=128, les paramètres de quantification seront comptés en unités de 128 colonnes et le poids de chaque ligne sera quantifié pour W∈R^{K×M}, le nombre de. les paramètres de quantification sont K× (M/g).
Réorganiser desc_act
Selon la matrice hessoise H, W est réorganisé en fonction de la dimension M basée sur diag(H). Le but est de donner la priorité aux colonnes de poids correspondant à l'activation avec des valeurs absolues plus grandes. Ces colonnes sont considérées comme des colonnes plus importantes qui affectent les résultats du raisonnement. Par conséquent, on espère produire une erreur aussi petite que possible lors de la quantification de ces colonnes. Déplace davantage d’erreurs de quantification vers des colonnes ultérieures et moins importantes.
Certaines expériences montrent que l'effet de desc_act sur la perte de quantification est une astuce efficace dans la plupart des tâches.
Perplexité de Pygmalion-7B avec GPTQ [7]
[Source de l'image : https://huggingface.co/reeducator/vicuna-13b-free/discussions/22]
opérateur
À proprement parler, le W4A16 basé sur le poids uniquement n'a pas beaucoup d'amélioration d'efficacité par rapport au W16A16 d'origine, et le processus quant/déquant est également ajouté à l'inférence à mesure que le poids uniquement devient le courant dominant de la quantification LLM et que son application se développe ; et plus Il existe de nombreux travaux open source basés sur l'écriture d'opérateurs efficaces W4A16 pour accélérer le raisonnement des algorithmes quantifiés. Par exemple, le package python de GPTQ, AutoGPTQ, a été intégré à l'outil open source exllama, qui réécrit le calcul parallèle de multiplication quantifiée. basé sur triton et CUDA. Dans
exllama/exllama_ext/matrix.cuh, vous pouvez voir l'implémentation par dot_product8_h de out=W_hat·x=(W{int}-z)s·x=(W{int}-z)x·s.
[Source de l'image : https://github.com/turboderp/exllama/blob/3b013cd53c7d413cf99ca04c7c28dd5c95117c0d/exllama_ext/matrix.cuh#L86]
AWQ
Par rapport à GPTQ, qui conçoit des solutions basées sur des problèmes d'optimisation, AWQ est une solution quantitative basée sur la recherche.
En utilisant Q(·) pour représenter le processus de quantification et de quantification inverse, le processus de quantification avant modification est le suivant :
Après modification, le processus de quantification est le suivant, en ajoutant une mise à l'échelle à W :
recherche
Le nom complet de l'AWQ est Quantification du poids sensible à l'activation, ce qui signifie que l'influence de la valeur d'activation est prise en compte dans le processus de quantification du poids. Le point de départ repose également sur le fait que dans chaque canal de poids, le canal avec une valeur d'activation correspondante plus grande est relativement important, et vice versa, son importance est ensuite multipliée par un facteur d'échelle Δ pour refléter son importance et la valeur. de Δ est égal à La plage est conçue par la valeur tensorielle de l'activation de l'entrée.
La norme de mesure de la recherche est basée sur la comparaison des résultats de sortie avant et après la quantification de couche linéaire, et celle avec le résultat MSE le plus petit est la solution optimale.
Effet
En termes de performances du modèle, le coefficient de mise à l'échelle optimal est trouvé grâce à une recherche d'échelle couche par couche pour obtenir la solution avec la plus petite erreur de quantification. La comparaison des effets suivante tirée de l'article de l'AWQ montre les résultats de quantification dans le test de deux générations de lamas. du point de vue de Perplexity. Légèrement meilleur que GPTQ et la version triée de GPTQ.
[Source de l'image : AWQ, p6]
À en juger par la précision des tâches réelles, la précision d'AWQ est comparable à celle de la version act_order de GPTQ (GPTQ-R), tandis que la vitesse est meilleure que cette dernière.
[Source de l'image : AWQ, p5]
En termes de performances de calcul du modèle, GPTQ a une opération de réorganisation et la multiplication matricielle est MV (matrice × vecteur), qui est un accès mémoire discontinu, tandis qu'AWQ n'a pas d'opération de réorganisation et la multiplication matricielle est ( matrice×matrice), ce qui est plus rapide.
4. Résumé
Concernant les performances SOTA actuelles du travail de quantification LLM, elles sont essentiellement basées sur le mode de quantification basé uniquement sur le poids. La réduction de la mémoire vidéo requise pour exécuter le modèle sur le GPU est sa principale contribution.
De la performance du modèle, car il y a une perte de quantification inévitable, et le modèle LLM est généralement beaucoup plus sensible à la quantification que le modèle CNN traditionnel, bien que les performances du LLM après quantification ne soient pas très différentes de celles avant quantification sur de nombreuses tâches , mais dans Vous ne pourrez peut-être toujours pas effectuer certaines tâches.
Du point de vue de l'accélération du modèle, la quantification basée uniquement sur le poids favorise le travail d'accélération sous-jacent, qui est essentiellement accéléré sur les opérateurs de multiplication tels que W4A16, W3A16 et W8A16, à en juger par les données théoriques fournies dans l'article, par rapport au modèle FP16. n'est généralement que 1,x ~ 3,x fois l'amélioration de la vitesse, mais l'effet de déploiement réel peut être inférieur à cette valeur, et son effet d'accélération est bien inférieur à la méthode de quantification traditionnelle de W4A4, W8A8 et d'autres opérateurs de multiplication d'entiers complets .
D'une manière générale, les travaux quantitatifs dans le domaine du LLM sont encore préliminaires. Si la précision des performances du modèle est très élevée dans les tâches réelles, il est recommandé d'utiliser des algorithmes et des outils basés uniquement sur le cache KV pour améliorer le débit mémoire de l'unité, comme par exemple. Flash Attention-2, Attention paginée, etc.
5. Référence
1. Une approche d'élagage simple et efficace pour les grands modèles de langage, 2023.
2. Sheared LLaMA : accélération de la pré-formation du modèle de langage via un élagage structuré, 2023.
3. Un livre blanc sur la quantification des réseaux neuronaux, 2021.
4. SmoothQuant : Quantification post-formation précise et efficace pour les grands modèles de langage, 2023.
5. GPTQ : Quantification post-formation précise pour les transformateurs génératifs pré-entraînés, 2023.
6. AWQ : Quantification du poids prenant en compte l'activation pour la compression et l'accélération LLM, 2023.
7. Une évaluation des performances de GPTQ.
*Texte/ Xujiong
Cet article est original de Dewu Technology. Pour des articles plus intéressants, veuillez consulter : Site officiel de Dewu Technology.
La réimpression sans l'autorisation de Dewu Technology est strictement interdite, sinon la responsabilité légale sera engagée conformément à la loi !
L'équipe de la Google Python Foundation a été licenciée. Google a confirmé les licenciements et les équipes impliquées dans Flutter, Dart et Python se sont précipitées vers la hot list de GitHub - Comment les langages et frameworks de programmation open source peuvent-ils être si mignons ? Xshell 8 ouvre le test bêta : prend en charge le protocole RDP et peut se connecter à distance à Windows 10/11 Lorsque les passagers se connectent au WiFi ferroviaire à grande vitesse , la « malédiction vieille de 35 ans » des codeurs chinois apparaît lorsqu'ils se connectent au haut débit. rail WiFi. Le premier outil de recherche IA à support à long terme de MySQL version 8.4 Perplexica : Entièrement open source et gratuit, une alternative open source à Perplexity. Les dirigeants de Huawei évaluent la valeur de l'open source Hongmeng : il possède toujours son propre système d'exploitation malgré une suppression continue. par des pays étrangers. La société allemande de logiciels automobiles Elektrobit a ouvert une solution de système d'exploitation automobile basée sur Ubuntu.