Was bedeutet GGUF?

GGUF ist ein binäres Dateiformat für GGML-basierte Inferenz-Engines. Es speichert Modellgewichte, Tokenizer-Daten und Metadaten in einer einzigen Datei. Wenn Du mit Tools wie Ollama, llama.cpp oder LM Studio arbeitest, lädst Du in der Regel GGUF-Dateien herunter. GGUF wird häufig für quantisierte Modelle genutzt, kann aber auch Gewichte in voller Präzision tragen, etwa in F16, BF16 oder F32. Es hat die älteren Formate GGML, GGMF und GGJT abgelöst und ist heute der De-facto-Standard im llama.cpp-nahen Ökosystem für lokale Inferenz.

GGUF leicht erklärt

Ein Sprachmodell wie Llama 3 oder Mistral entsteht durch Training auf großen Textmengen. Das Ergebnis ist eine Sammlung von Milliarden numerischer Parameter (Modellgewichte), die das gesamte Wissen des Modells kodieren. Diese Gewichte werden standardmäßig in hoher Genauigkeit gespeichert, typischerweise als 16 Bit pro Wert (bf16 oder fp16). Ein Modell mit 7 Milliarden Parametern belegt als Rohgewichte in bf16 rund 14 GB.

14 GB nur für ein mittelgroßes Modell. Größere Modelle mit 70 Milliarden Parametern kommen auf rund 140 GB an reinen Gewichten. Der tatsächliche Speicherbedarf zur Laufzeit liegt noch darüber, weil zusätzlich der KV-Cache (abhängig von Kontextlänge und Batchgröße) sowie Verwaltungsstrukturen im Speicher gehalten werden müssen.

Hier kommt Quantisierung ins Spiel. Sie reduziert die Genauigkeit jedes einzelnen Parameters. Statt 16 Bit pro Wert werden nur noch 4 oder 5 Bit verwendet. Die Idee dahinter: Ein Sprachmodell braucht nicht für jeden Parameter die volle Präzision. Viele Gewichte lassen sich mit deutlich weniger Speicher darstellen, ohne dass die Textqualität spürbar leidet.

GGUF ist das Dateiformat, das diese Modelle speichert und nutzbar macht. Es packt drei Dinge in eine einzige Datei:

Durch diese Bündelung reicht eine einzige Datei aus, um ein Modell lokal auszuführen. Kein Nachladen von Konfigurationen, kein Zusammensuchen einzelner Dateien.

Die konkreten Zahlen verdeutlichen den Effekt der Quantisierung: Ein 7B-Modell in bf16 hat eine Dateigröße von rund 14 GB. Dasselbe Modell als GGUF-Datei in Q4-Quantisierung wiegt nur noch etwa 4 GB. Der tatsächliche Speicherbedarf zur Laufzeit hängt zusätzlich von der eingestellten Kontextlänge und dem genutzten Offload-Modus (GPU, CPU oder gemischt) ab. Mit Quantisierung läuft ein 7B-Modell auf einer normalen Grafikkarte oder sogar auf einem aktuellen Laptop. Genau das macht GGUF so relevant: Es bringt leistungsfähige Sprachmodelle auf Consumer-Hardware.

Wie hängen GGUF und Checkpoint zusammen?

Wenn ein Sprachmodell trainiert wird, speichert der Trainingsprozess regelmäßig den aktuellen Zustand. Solche Trainings-Checkpoints enthalten neben den Modellgewichten auch Optimizer-Zustände, Scheduler-Konfigurationen und weitere Trainingsdaten. Sie dienen dazu, das Training fortsetzen zu können. Für die Konvertierung nach GGUF werden nur die Modellgewichte benötigt, nicht der gesamte Trainings-Checkpoint. Veröffentlichte Modelle auf Hugging Face liegen typischerweise als reine Gewichte im Safetensors- oder PyTorch-Format vor.

Diese Modellgewichte sind das Rohmaterial. GGUF ist das Endprodukt für die lokale Nutzung. Dazwischen liegt ein Konvertierungsprozess mit zwei Schritten:

Das Werkzeug dafür ist llama.cpp. Es enthält Konvertierungsskripte, die Safetensors- und PyTorch-Gewichte direkt in GGUF umwandeln. Der Befehl convert_hf_to_gguf.py nimmt ein Hugging-Face-Modell entgegen und erzeugt daraus eine GGUF-Datei in der gewünschten Quantisierungsstufe.

In der Praxis musst Du diese Konvertierung selten selbst durchführen. Auf Plattformen wie Hugging Face stellen Community-Mitglieder bereits fertig quantisierte GGUF-Dateien bereit. Du lädst die passende Variante herunter und kannst sofort loslegen. Wenn Du allerdings ein eigenes Modell trainiert oder feinabgestimmt hast, ist der Weg von den exportierten Gewichten zur GGUF-Datei ein notwendiger Schritt, bevor Du es lokal nutzen kannst.

Wofür braucht Quantisierung das GGUF-Format?

Quantisierung ist ein Verarbeitungsschritt. GGUF ist ein häufig genutztes Zielformat im GGML-Umfeld, aber Quantisierung ist nicht an GGUF gebunden und GGUF ist nicht auf quantisierte Modelle beschränkt. Quantisierung reduziert die Präzision der Modellparameter, und GGUF speichert diese reduzierten Werte in einem Format, das Inferenz-Tools direkt verarbeiten können.

Die verschiedenen Quantisierungsstufen tragen Kürzel, die Dir auf Hugging Face oder in Ollama ständig begegnen. Die Zahlen in den Namen geben die nominale Quantisierungsklasse an. Die effektive Speicherbelegung pro Parameter liegt durch Skalierungsfaktoren und Blockstrukturen etwas über dem Nominalwert:

Das "K" in den Bezeichnungen kennzeichnet die K-Quant-Familie: eine Gruppe blockbasierter Quantisierungsschemata in llama.cpp. Die Buchstaben S, M und L stehen für die Größenvarianten Small, Medium und Large. Sie unterscheiden sich in der Anzahl und Verteilung der Quantisierungsblöcke und damit im Verhältnis von Dateigröße zu Qualität.

Der Tradeoff ist klar: Weniger Bits bedeuten kleinere Dateien, schnellere Inferenz und geringeren Speicherbedarf. Gleichzeitig sinkt die Qualität der generierten Texte. Bei Q4_K_M ist der Unterschied zur Vollfassung für die meisten Anwendungen kaum wahrnehmbar. Bei Q2_K wirst Du merken, dass das Modell häufiger Fehler macht oder weniger kohärent antwortet.

Für den Einstieg ist Q4_K_M ein häufig empfohlener Startpunkt. Es bietet ein gutes Verhältnis aus Qualität und Ressourcenverbrauch. Die optimale Wahl hängt aber von Modell, Aufgabe, Kontextlänge und Backend ab. Wenn Du mehr VRAM zur Verfügung hast, greife zu Q5_K_M oder Q8_0.

GGUF und VRAM: Welches Modell passt auf Deine Hardware?

Die wichtigste Frage bei der Modellwahl: Passt es in Deinen Speicher? Die folgenden Dateigrößen zeigen, wie viel Platz die reinen Modellgewichte als Q4_K_M-quantisierte GGUF-Dateien einnehmen:

Der tatsächliche VRAM-Bedarf zur Laufzeit liegt über der reinen Dateigröße. Dazu kommen der KV-Cache (wächst mit der Kontextlänge), Compute-Buffer und Overhead des Inferenz-Frameworks. Bei einem 7B-Modell in Q4_K_M mit 4096 Token Kontext kannst Du mit etwa 5 bis 6 GB VRAM rechnen. Bei maximaler Kontextlänge (z.B. 32K Token) steigt der Bedarf deutlich. Außerdem lässt sich das Modell teilweise auf CPU/RAM auslagern (Offloading), was den VRAM-Bedarf senkt, aber die Geschwindigkeit reduziert.

Typische Hardware und ihre Möglichkeiten:

Drei Erfahrungsregeln helfen Dir bei der Auswahl:

GGUF und Inferenz: Vom Format zur Antwort

Inferenz bezeichnet den Vorgang, bei dem ein trainiertes Modell auf eine Eingabe reagiert und Text erzeugt. Die GGUF-Datei ist dabei der Ausgangspunkt. Der Weg von der Datei zur fertigen Antwort läuft in mehreren Schritten ab.

Zuerst lädt das Inferenz-Tool die GGUF-Datei. Die Modellgewichte werden in den VRAM (bei GPU-Nutzung) oder in den RAM (bei CPU-Nutzung) geschrieben. Da der Tokenizer direkt in der GGUF-Datei enthalten ist, muss nichts separat geladen werden.

Dann gibst Du Deinen Prompt ein. Der Tokenizer zerlegt Deinen Text in Tokens, also numerische Einheiten, die das Modell verarbeiten kann. Aus "Erkläre mir Quantisierung" werden beispielsweise fünf bis sechs Token-IDs.

Das Modell verarbeitet diese Token-IDs durch seine Schichten und berechnet, welches Token als nächstes am wahrscheinlichsten folgt. Dieses Token wird ausgegeben, an die bisherige Sequenz angehängt, und der Prozess wiederholt sich. So entsteht Token für Token die Antwort.

Die gängigen Tools für diesen Prozess sind:

Die Geschwindigkeit der Textgenerierung hängt von mehreren Faktoren ab: Quantisierungsstufe, verfügbarer VRAM, Kontextlänge und Hardware. Niedrigere Quantisierung (weniger Bits) bedeutet weniger Rechenaufwand pro Token und damit schnellere Ausgabe. Wenn das gesamte Modell in den VRAM passt, ist die Inferenz am schnellsten. Sobald Teile in den langsameren RAM ausgelagert werden, sinkt die Geschwindigkeit spürbar. Grobe Erfahrungswerte: Auf einer RTX 4090 erzeugt ein 7B-Modell in Q4_K_M in der Größenordnung von 80 bis 120 Token pro Sekunde. Auf einem MacBook M2 mit 16 GB sind es etwa 20 bis 40 Token pro Sekunde. Die tatsächliche Geschwindigkeit hängt stark von Modell, Backend, Kontextlänge, Offload-Modus und Software-Version ab.