Ce référentiel contient une implémentation du modèle LLaMA 2 (Large Language Model Meta AI), une variante Generative Pretrained Transformer (GPT). L'implémentation se concentre sur l'architecture du modèle et le processus d'inférence. Le code est restructuré et abondamment commenté pour faciliter la compréhension des éléments clés de l'architecture.
RMS-Normalization : RMSNorm est une simplification de la normalisation de couche d'origine (LayerNorm). LayerNorm est une technique de régularisation qui pourrait gérer le problème de décalage de covariable interne afin de stabiliser les activations de couches et d'améliorer la convergence du modèle. Cela s’est avéré assez efficace dans LLaMA 2.
Fonction d'activation : LLaMA 2 utilise la fonction d'activation SwiGLU au lieu de ReLU, ce qui améliore les performances d'entraînement.
Embeddings positionnels rotatifs (RoPE) : Inspiré du projet GPT-Neo-X, LLaMA 2 intègre des intégrations positionnelles rotatives à chaque couche, améliorant ainsi la compréhension positionnelle du modèle.
Augmentation de la longueur du contexte et de l'attention aux requêtes groupées (GQA) : le modèle LLaMA 2 a une fenêtre de contexte doublée (de 2 048 à 4 096 jetons) et utilise l'attention aux requêtes groupées. Cela permet un meilleur traitement des documents longs, des historiques de discussion et des tâches de synthèse.
La mise en cache KV est une technique d'optimisation cruciale utilisée dans cette implémentation pour accélérer le processus d'inférence pour le décodage du modèle de langage (LM). Lors du décodage autorégressif, où chaque jeton est prédit sur la base des jetons précédents, l'attention personnelle au sein du modèle est causale. Cela implique que la représentation d'un jeton est calculée uniquement sur la base de lui-même et des jetons précédents, et non des futurs.
En auto-attention, la séquence d'entrée est projetée à l'aide de projections de clé, de valeur et de requête. Le cache KV stocke efficacement les résultats des projections de clé et de valeur, éliminant ainsi le besoin de calculs redondants lors des futures itérations de décodage. En conséquence, les représentations des jetons qui restent fixes pendant le décodage autorégressif peuvent être récupérées du cache, améliorant considérablement la vitesse d'inférence.
Cette technique de mise en cache KV est une caractéristique architecturale clé qui améliore l'efficacité et la vitesse du modèle LLaMA lors du décodage.
Le modèle LLaMA 2 intègre une variante du concept d'attention multi-requête (MQA) proposé par Shazeer (2019), un raffinement de l'algorithme d'attention multi-têtes (MHA). MQA améliore l’efficacité des mécanismes d’attention tout en maintenant une dégradation minimale de la précision.
Dans l'attention multi-têtes traditionnelle, l'ensemble du calcul de l'attention est répliqué h fois, où h est le nombre de têtes d'attention. Cependant, GQA réduit la redondance informatique en supprimant ou en réduisant considérablement la dimension de la tête (h) des valeurs K et V. Dans MQA, chaque « tête » de la valeur de requête (Q) subit la même transformation K et V, optimisant le calcul de l'attention.
Ce raffinement se traduit par des performances de calcul similaires à celles du MHA, mais réduit considérablement la quantité de données lues/écrites à partir de la mémoire. En conséquence, GQA améliore à la fois les performances (via une augmentation de l'intensité arithmétique) et l'efficacité de l'espace mémoire (via une diminution de la quantité de données de cache KV stockées), ce qui en fait un ajout précieux à l'architecture LLaMA.
Dans le modèle LLaMA 2, les Rotary Positional Embeddings (RoPE) jouent un rôle crucial dans l'amélioration des mécanismes d'attention en incorporant des informations de position dans les représentations de jetons. Le concept « d'attention » est puissant, mais pour garantir que l'attention calculée ait du sens, les jetons doivent avoir une notion de position.
Les intégrations de positions sont de deux types principaux : absolues et relatives. Les intégrations de position absolue codent la position absolue d'un mot dans la phrase d'entrée, tandis que les intégrations de position relative codent la position relative entre deux mots. Ces intégrations fournissent des informations de position vitales qui aident les jetons à comprendre leur contexte dans une séquence.
Les intégrations positionnelles rotatives adoptent une approche unique en tirant parti des matrices de rotation pour intégrer des informations de position. Le but est de garantir que le produit scalaire des vecteurs q et k, aux positions m et n, dépend uniquement de q, k et de leur distance relative (m — n). La matrice de rotation, où l'angle est la position du vecteur, est intégrée dans le vecteur d'origine par multiplication matricielle, en s'alignant sur ce critère.
Cette approche innovante d'incorporation d'informations de position améliore la capacité du modèle à comprendre les relations symboliques et le contexte, contribuant ainsi à améliorer les mécanismes d'attention.
model.py
: Contient l'implémentation du modèle de transformateur LLaMA avec des commentaires détaillés expliquant chaque composant et fonctionnalité.
inference.py
: montre comment utiliser le modèle LLaMA formé pour l'inférence, fournissant des informations sur le traitement des entrées et des sorties.
N'hésitez pas à explorer le code, à corriger les éventuelles erreurs et à expérimenter le modèle LLaMA 2 !