Dieses Repository enthält eine Implementierung des LLaMA 2-Modells (Large Language Model Meta AI), einer Generative Pretrained Transformer (GPT)-Variante. Der Schwerpunkt der Implementierung liegt auf der Modellarchitektur und dem Inferenzprozess. Der Code wurde neu strukturiert und stark kommentiert, um das Verständnis der wichtigsten Teile der Architektur zu erleichtern.
RMS-Normalisierung: RMSNorm ist eine Vereinfachung der ursprünglichen Layer-Normalisierung (LayerNorm). LayerNorm ist eine Regularisierungstechnik, die das Problem der internen Kovariatenverschiebung lösen könnte, um die Schichtaktivierungen zu stabilisieren und die Modellkonvergenz zu verbessern. Es hat sich in LLaMA 2 als recht erfolgreich erwiesen.
Aktivierungsfunktion: LLaMA 2 verwendet die SwiGLU-Aktivierungsfunktion anstelle von ReLU, was zu einer verbesserten Trainingsleistung führt.
Rotary Positional Embeddings (RoPE): Inspiriert durch das GPT-Neo-X-Projekt enthält LLaMA 2 rotierende Positionseinbettungen auf jeder Ebene und verbessert so das Positionsverständnis des Modells.
Erhöhte Kontextlänge und Grouped-Query Attention (GQA): Das LLaMA 2-Modell verfügt über ein verdoppeltes Kontextfenster (von 2048 auf 4096 Token) und nutzt Grouped-Query Attention. Dies ermöglicht eine bessere Verarbeitung langer Dokumente, Chatverläufe und Zusammenfassungsaufgaben.
KV-Caching ist eine entscheidende Optimierungstechnik, die in dieser Implementierung eingesetzt wird, um den Inferenzprozess für die Decodierung des Sprachmodells (LM) zu beschleunigen. Bei der autoregressiven Dekodierung, bei der jedes Token auf der Grundlage früherer Token vorhergesagt wird, ist die Selbstaufmerksamkeit innerhalb des Modells kausal. Dies bedeutet, dass die Darstellung eines Tokens nur auf der Grundlage von ihm selbst und den vorherigen Token berechnet wird, nicht auf der Grundlage der zukünftigen.
Bei der Selbstaufmerksamkeit wird die Eingabesequenz mithilfe von Schlüssel-, Wert- und Abfrageprojektionen projiziert. Der KV-Cache speichert effizient die Ergebnisse der Schlüssel- und Wertprojektionen, wodurch redundante Berechnungen in zukünftigen Decodierungsiterationen überflüssig werden. Dadurch können die Darstellungen von Tokens, die während der autoregressiven Dekodierung fixiert bleiben, aus dem Cache abgerufen werden, was die Inferenzgeschwindigkeit deutlich erhöht.
Diese KV-Caching-Technik ist ein wichtiges Architekturmerkmal, das die Effizienz und Geschwindigkeit des LLaMA-Modells während der Dekodierung erhöht.
Das LLaMA 2-Modell beinhaltet eine Variation des von Shazeer (2019) vorgeschlagenen Konzepts der Multi-Query Attention (MQA), eine Verfeinerung des Multi-Head Attention (MHA)-Algorithmus. MQA steigert die Effizienz von Aufmerksamkeitsmechanismen und sorgt gleichzeitig für eine minimale Verschlechterung der Genauigkeit.
Bei der herkömmlichen Mehrkopfaufmerksamkeit wird die gesamte Aufmerksamkeitsberechnung h-mal wiederholt, wobei h die Anzahl der Aufmerksamkeitsköpfe ist. Die GQA reduziert jedoch die Rechenredundanz, indem die Kopfabmessung (h) aus den K- und V-Werten entfernt oder deutlich reduziert wird. In MQA durchläuft jeder „Kopf“ des Abfragewerts (Q) die gleiche K- und V-Transformation, wodurch die Aufmerksamkeitsberechnung optimiert wird.
Diese Verfeinerung führt zu einer ähnlichen Rechenleistung wie MHA, reduziert jedoch die Menge der aus dem Speicher gelesenen/geschriebenen Daten erheblich. Infolgedessen verbessert GQA sowohl die Leistung (durch eine Erhöhung der Rechenintensität) als auch die Speicherplatzeffizienz (durch eine Verringerung der Menge der gespeicherten KV-Cache-Daten), was es zu einer wertvollen Ergänzung der LLaMA-Architektur macht.
Im LLaMA 2-Modell spielen Rotary Positional Embeddings (RoPE) eine entscheidende Rolle bei der Verbesserung der Aufmerksamkeitsmechanismen, indem sie Positionsinformationen in die Token-Darstellungen integrieren. Das Konzept der „Aufmerksamkeit“ ist mächtig, aber um sicherzustellen, dass die berechnete Aufmerksamkeit sinnvoll ist, müssen Token eine Vorstellung von der Position haben.
Es gibt zwei Haupttypen von Positionseinbettungen: absolute und relative. Einbettungen mit absoluter Position kodieren die absolute Position eines Wortes in der Eingabephrase, während Einbettungen mit relativer Position die relative Position zwischen zwei Wörtern kodieren. Diese Einbettungen liefern wichtige Positionsinformationen, die Token helfen, ihren Kontext in einer Sequenz zu verstehen.
Rotary Positional Embeddings verfolgen einen einzigartigen Ansatz, indem sie Rotationsmatrizen nutzen, um Positionsinformationen einzubetten. Das Ziel besteht darin, sicherzustellen, dass das innere Produkt der Vektoren q und k an den Positionen m und n nur von q, k und ihrem relativen Abstand (m – n) abhängt. Die Rotationsmatrix, bei der der Winkel die Position des Vektors ist, wird durch Matrixmultiplikation in den ursprünglichen Vektor eingebettet und entspricht diesem Kriterium.
Dieser innovative Ansatz zur Einbeziehung von Positionsinformationen verbessert die Fähigkeit des Modells, Token-Beziehungen und -Kontexte zu verstehen, und trägt so zu verbesserten Aufmerksamkeitsmechanismen bei.
model.py
: Enthält die Implementierung des LLaMA-Transformermodells mit detaillierten Kommentaren, die jede Komponente und Funktionalität erläutern.
inference.py
: Demonstriert die Verwendung des trainierten LLaMA-Modells für Inferenzen und bietet Einblicke in die Eingabe- und Ausgabeverarbeitung.
Fühlen Sie sich frei, den Code zu erkunden, etwaige Fehler zu korrigieren und mit dem LLaMA 2-Modell zu experimentieren!