25 Punkte von xguru 2024-07-31 | Noch keine Kommentare. | Auf WhatsApp teilen
  • Große Sprachmodelle (LLMs) sind zu groß, um auf gewöhnlicher Hardware zu laufen, und haben meist Milliarden von Parametern, sodass GPUs mit viel VRAM erforderlich sind
  • Daher konzentriert sich die Forschung zunehmend darauf, diese Modelle durch verbessertes Training, Adapter und Ähnliches kleiner zu machen; eine der wichtigsten Techniken in diesem Bereich ist die Quantisierung

Part 1: Das „Problem“ großer Sprachmodelle

  • LLMs (Large Language Models) wurden nach der Anzahl der enthaltenen Parameter benannt
  • Solche Modelle enthalten in der Regel Milliarden von Parametern (hauptsächlich Gewichte), was erhebliche Speicherkosten verursachen kann
  • Während der Inferenz entstehen Aktivierungen durch das Produkt aus Eingaben und Gewichten und können ebenfalls sehr groß sein
  • Deshalb versucht man, Milliarden von Werten so effizient wie möglich darzustellen und gleichzeitig den benötigten Speicherplatz pro Wert zu minimieren

Wie numerische Werte dargestellt werden

  • Ein gegebener Wert wird oft als Gleitkommazahl dargestellt
  • Diese Werte werden als „Bits“ dargestellt, und der IEEE-754-Standard beschreibt, wie Bits jeweils die Funktion von Vorzeichen, Exponent oder Mantisse (fraction) zur Darstellung eines Werts übernehmen
  • Je mehr Bits zur Darstellung eines Werts verwendet werden, desto präziser ist er im Allgemeinen
  • Je mehr Bits verfügbar sind, desto größer ist der darstellbare Wertebereich

Speicherbeschränkungen

  • Nimmt man ein Modell mit 70 Milliarden Parametern an, dann werden allein zum Laden des Modells bei Verwendung von FP32 (full-precision) 280 GB Speicher benötigt
  • Deshalb ist es äußerst wichtig, die Anzahl der Bits zur Darstellung der Modellparameter zu minimieren, doch mit sinkender Präzision nimmt in der Regel auch die Genauigkeit des Modells ab
  • Ziel ist es, die Zahl der Bits zur Darstellung der Werte zu verringern und dabei die Genauigkeit beizubehalten; genau hier kommt die Quantisierung ins Spiel

Part 2: Einführung in die Quantisierung

  • Quantisierung zielt darauf ab, die Präzision von Modellparametern von hoher Bitbreite (z. B. 32-Bit-Gleitkomma) auf niedrigere Bitbreite (z. B. 8-Bit-Integer) zu reduzieren
  • Bei jeder Verringerung der Bitzahl wird ein Mapping durchgeführt, um die ursprünglichen Parameter in eine Darstellung mit niedrigerer Bitzahl zu „komprimieren“

Gängige Datentypen

FP16

  • Geht man von FP32 zu FP16 (half precision), ist der Wertebereich, den FP16 annehmen kann, deutlich kleiner als bei FP32

BF16

  • Um einen FP32 ähnlichen Wertebereich zu erhalten, wurde bfloat16 eingeführt, eine Art „abgeschnittenes FP32“
  • BF16 verwendet dieselbe Anzahl an Bits wie FP16, kann aber einen größeren Wertebereich abdecken und wird häufig in Deep-Learning-Anwendungen eingesetzt

INT8

  • Reduziert man die Bitzahl weiter, nähert man sich statt einer Gleitkomma- einer integerbasierten Darstellung an

Symmetrische Quantisierung

  • Der Bereich der ursprünglichen Gleitkommawerte wird auf einen im quantisierten Raum um 0 zentrierten symmetrischen Bereich abgebildet
  • Der quantisierte Wert von 0 im Gleitkommaraum ist im quantisierten Raum exakt 0

Asymmetrische Quantisierung

  • Anders als bei der symmetrischen Quantisierung ist sie nicht um 0 zentriert symmetrisch
  • Der Minimalwert (β) und der Maximalwert (α) werden aus dem Gleitkommabereich auf den Minimal- bzw. Maximalwert des quantisierten Bereichs abgebildet
  • Eine solche Methode wird Zero-Point-Quantisierung genannt

Bereichsmapping und Clipping

  • Bildet man den gesamten Bereich eines Vektors ab, können Ausreißer dazu führen, dass alle kleinen Werte auf dieselbe Low-Bit-Darstellung gemappt werden und damit ihre Unterscheidbarkeit verlieren
  • Stattdessen kann man bestimmte Werte clippen
  • Clipping bedeutet, einen anderen Dynamikbereich der ursprünglichen Werte festzulegen, sodass alle Ausreißer denselben Wert erhalten
  • Der Quantisierungsfehler für Nicht-Ausreißer wird dadurch stark reduziert, während der Fehler für Ausreißer zunimmt

Kalibrierung

Gewichte (und Biases)

  • Gewichte und Biases können als statische Werte betrachtet werden, die vor dem Ausführen des Modells bekannt sind
  • Biases sind deutlich weniger zahlreich als Gewichte, deshalb werden sie in höherer Präzision (z. B. INT16) beibehalten; der Hauptfokus der Quantisierung liegt auf den Gewichten
  • Zu den Kalibrierungsmethoden für statische und bekannte Gewichte gehören die manuelle Auswahl eines Perzentils des Eingabebereichs, die Optimierung des mittleren quadratischen Fehlers (MSE) zwischen ursprünglichen und quantisierten Gewichten oder die Minimierung der Entropie (KL-Divergenz) zwischen ursprünglichen und quantisierten Werten

Aktivierungen

  • Eingaben werden im gesamten LLM fortlaufend aktualisiert und üblicherweise als „Aktivierungen“ bezeichnet
  • Diese Werte ändern sich bei jeder Einspeisung von Eingabedaten während der Inferenz und sind daher schwer exakt zu quantisieren
  • Sie werden nach jeder Hidden Layer aktualisiert, sodass erst während des Durchlaufs der Eingabedaten durch das Modell bekannt ist, welche Werte sie bei der Inferenz annehmen

Part 3: Post-Training Quantization (PTQ)

Dynamische Quantisierung

  • Nachdem Daten eine Hidden Layer durchlaufen haben, werden Aktivierungen gesammelt
  • Diese Aktivierungsverteilung wird verwendet, um die Werte für Zero-Point (z) und Skalierungsfaktor (s) zu berechnen, die zur Quantisierung der Ausgabe benötigt werden
  • Jedes Mal, wenn die Daten eine neue Schicht durchlaufen, wird der Prozess wiederholt. Daher hat jede Schicht ihre eigenen z- und s-Werte und damit ein anderes Quantisierungsschema

Statische Quantisierung

  • Zero-Point (z) und Skalierungsfaktor (s) werden im Voraus berechnet, nicht während der Inferenz
  • Um diese Werte zu finden, wird ein Kalibrierungsdatensatz verwendet, der dem Modell zugeführt wird, um solche potenziellen Verteilungen zu sammeln
  • Bei der eigentlichen Inferenz werden s- und z-Werte nicht neu berechnet, sondern global für alle Aktivierungen zur Quantisierung verwendet
  • Dynamische Quantisierung ist in der Regel etwas genauer, da sie für jede Hidden Layer s- und z-Werte berechnet, kann aber mehr Rechenzeit kosten
  • Statische Quantisierung ist dagegen weniger genau, aber schneller, weil s- und z-Werte bereits bekannt sind

Der Bereich der 4-Bit-Quantisierung

  • Unter 8 Bit zu gehen hat sich als schwierig erwiesen, weil der Quantisierungsfehler mit jedem verlorenen Bit steigt
  • Es werden zwei bei HuggingFace häufig geteilte Methoden untersucht: GPTQ und GGUF

GPTQ

  • Eine der bekanntesten Methoden zur Quantisierung auf 4 Bit
  • Verwendet asymmetrische Quantisierung und arbeitet schichtweise, sodass jede Schicht unabhängig verarbeitet wird, bevor mit der nächsten fortgefahren wird
  • Während des schichtweisen Quantisierungsprozesses werden die Gewichte der Schicht zunächst mit der inversen Hesse-Matrix transformiert; diese ist die zweite Ableitung der Verlustfunktion des Modells und zeigt, wie empfindlich die Modellausgabe auf Änderungen jedes einzelnen Gewichts reagiert
  • Vereinfacht gesagt zeigt sie die (inverse) Wichtigkeit jedes Gewichts in einer Schicht
  • Gewichte mit kleinen Werten in der Hesse-Matrix sind wichtiger, weil kleine Änderungen an ihnen große Auswirkungen auf die Modellleistung haben können

GGUF

  • GPTQ ist eine gute Quantisierungsmethode, wenn das gesamte LLM auf der GPU ausgeführt werden soll, aber diese Kapazität ist nicht immer vorhanden
  • Stattdessen kann GGUF verwendet werden, um alle Schichten des LLM auf die CPU auszulagern
  • Dadurch können CPU und GPU gemeinsam genutzt werden, wenn nicht genügend VRAM vorhanden ist

Part 4: Quantization Aware Training (QAT)

  • In Teil 3 wurde betrachtet, wie ein Modell nach dem Training quantisiert werden kann, doch dieser Ansatz hat den Nachteil, dass er den eigentlichen Trainingsprozess nicht berücksichtigt
  • Genau hier kommt Quantization Aware Training (QAT) ins Spiel. Anders als PTQ zielt QAT darauf ab, das Quantisierungsverfahren bereits während des Trainings zu lernen
  • QAT ist tendenziell genauer als PTQ, weil die Quantisierung schon während des Trainings berücksichtigt wurde

Das Zeitalter der 1-Bit-LLMs: BitNet

  • BitNet stellt die Gewichte des Modells mit einem einzigen Bit dar, als -1 oder 1
  • Dies geschieht, indem der Quantisierungsprozess direkt in die Transformer-Architektur eingebracht wird
  • Die Transformer-Architektur bildet die Grundlage der meisten LLMs und besteht aus Berechnungen mit linearen Schichten
  • BitNet ersetzt diese linearen Schichten durch sogenannte BitLinear-Schichten

Gewichtsquantisierung

  • Während des Trainings werden Gewichte in INT8 gespeichert und anschließend mit der Grundstrategie, der Signumfunktion, auf 1 Bit quantisiert
  • Im Wesentlichen wird die Gewichtsverteilung um 0 zentriert, dann wird alles links von 0 zu -1 und alles rechts davon zu 1

Aktivierungsquantisierung

  • Um Aktivierungen zu quantisieren, verwendet BitLinear absmax-Quantisierung, um Aktivierungen von FP16 in INT8 umzuwandeln, da die Matrixmultiplikation (×) eine höhere Präzision erfordert

Dequantisierung

  • Es wurden α (der größte Absolutwert der Aktivierungen) und β (der mittlere Absolutwert der Gewichte) verfolgt; diese Werte helfen später dabei, die Aktivierungen wieder in FP16 zu dequantisieren
  • Die Ausgabeaktivierungen werden mit {α, γ} reskaliert und in die ursprüngliche Präzision zurückdequantisiert

Alle großen Sprachmodelle sind 1,58 Bit

  • BitNet 1.58b wurde eingeführt, um die zuvor erwähnten Skalierungsprobleme zu verbessern
  • Bei dieser neuen Methode kann jedes einzelne Gewicht im Modell nicht nur -1 oder 1, sondern nun auch 0 als Wert annehmen und wird damit ternär
    • Interessanterweise verbessert allein das Hinzufügen von 0 BitNet deutlich und macht die Berechnung wesentlich schneller

Die Kraft der 0

  • Warum ist das Hinzufügen von 0 eine so große Verbesserung? Das hängt vollständig mit der Matrixmultiplikation zusammen
  • Mit auf 1,58 Bit quantisierten Gewichten lässt sich nicht nur die Rechengeschwindigkeit stark erhöhen, weil nur Multiplikationen ausgeführt werden müssen, sondern auch Feature-Filtering ermöglichen

Quantisierung

  • Für die Gewichtsquantisierung verwendet BitNet 1.58b absmean-Quantisierung, eine Variante der zuvor betrachteten absmax-Quantisierung
  • Dabei wird die Gewichtsverteilung einfach komprimiert und mithilfe des absoluten Mittelwerts (α) quantisiert; die Werte werden dann auf -1, 0 oder 1 gerundet
  • Im Vergleich zu BitNet ist die Aktivierungsquantisierung bis auf einen Punkt gleich geblieben. Statt Aktivierungen auf den Bereich [0, 2ᵇ⁻¹] zu skalieren, werden sie nun mit absmax-Quantisierung auf [-2ᵇ⁻¹, 2ᵇ⁻¹] skaliert
  • Für die 1,58-Bit-Quantisierung waren (hauptsächlich) zwei Tricks nötig:
    • Hinzufügen von 0, um eine ternäre Darstellung [-1, 0, 1] zu erzeugen
    • absmean-Quantisierung für Gewichte
  • „13B BitNet b1.58 ist in Bezug auf Latenz, Speichernutzung und Energieverbrauch effizienter als ein 3B-FP16-LLM“

  • Dadurch lässt sich ein leichtgewichtiges Modell erhalten, weil es nur rechnerisch effiziente 1,58 Bit verwendet

Noch keine Kommentare.

Noch keine Kommentare.