Key Findings
  • Quantisierung ist die Technik mit dem hochsten Return on Investment unter den Modellkomprimierungsverfahren -- die Umwandlung von FP16-Gewichten in INT4 reduziert den Speicherbedarf sofort um 75 %, wobei der Genauigkeitsverlust in den meisten Fallen unter 1 % liegt
  • AWQ (MLSys 2024 Best Paper) hat gezeigt, dass der Schutz von nur 1 % der kritischen Gewichte genugt, um 4-Bit-Quantisierung nahezu verlustfrei zu gestalten -- LLaMA-70B passt auf eine einzelne RTX 4090 (24 GB)
  • QLoRA macht Quantisierung nicht mehr nur zu einer Inferenztechnik -- die Kombination aus 4-Bit-Quantisierung + LoRA-Feinabstimmung ermoglicht das Feinabstimmen eines 65B-Modells auf einer einzelnen 48-GB-GPU, bei einer Qualitat, die der Volleprazisions-Feinabstimmung entspricht
  • BitNet b1.58 erreicht mit ternaren Gewichten {-1, 0, +1} bei 3B Parametern die Leistung von FP16-LLaMA, ist 2,71x schneller und benotigt 3,55x weniger Speicher -- und stellt damit die Grundannahme in Frage, dass Modelle Gleitkommazahlen benotigen

I. Das Dilemma des „Prazisionsgefangenen" in der KI: Sie bezahlen fur unnotige Prazision

Die KI-Branche hat eine teure Angewohnheit: Jeder Modellparameter wird mit 32-Bit- oder 16-Bit-Gleitkommazahlen gespeichert und berechnet. LLaMA-70B benotigt in FP16 gespeichert 140 GB Arbeitsspeicher -- das ubersteigt die Kapazitat jeder einzelnen Consumer-GPU. Selbst bei der Enterprise-Klasse A100 80GB sind mindestens zwei Karten erforderlich, um das Modell zu laden. Die Harvard Business Review weist darauf hin[1], dass der Energieverbrauch der weltweiten KI-Infrastruktur in alarmierendem Tempo wachst, wobei ein Grossteil der Rechenleistung fur die Aufrechterhaltung „unnotiger Prazision" aufgewendet wird.

Eine Studie des MIT Sloan Management Review[2] stellt zudem fest, dass kleinere, effizientere KI-Deployments oft hohere Geschaftsrenditen erzielen als das Streben nach dem grossten Modell. Die Kernfrage lautet: Benotigt ein Modell wirklich 16-Bit-Prazision?

Die Antwort lautet in den meisten Fallen „Nein". Die zentrale Erkenntnis der Quantisierung (Quantization) ist: In den Gewichten und Aktivierungswerten neuronaler Netze steckt eine grosse Menge redundanter Prazision. Die Umwandlung von FP16 (16-Bit-Gleitkomma) in INT4 (4-Bit-Ganzzahl) reduziert den Speicherbedarf sofort um 75 %, wahrend der Genauigkeitsverlust typischerweise unter 1 % liegt. Aggressivere Forschungsarbeiten (wie BitNet b1.58) belegen sogar, dass mit nur drei Werten {-1, 0, +1} LLMs trainiert werden konnen, die mit Volleprazisionsmodellen vergleichbar sind.

Im Gegensatz zu Pruning (Entfernung von Parametern) und Destillation (Training eines neuen Modells) besteht die Kernoperation der Quantisierung in der Reduzierung der numerischen Prazision jedes einzelnen Parameters -- die Modellstruktur bleibt unverandert, die Parameteranzahl bleibt gleich, aber die Anzahl der Bits pro Parameter wird drastisch reduziert. Das macht Quantisierung zur am einfachsten einfuhrbaren und am wenigsten auf Neutraining angewiesenen der drei grossen Komprimierungstechniken.

II. Technische Entwicklung: Vom vorsichtigen Versuch mit INT8 bis zum Durchbruch bei 1,58 Bit

2.1 Grundkonzepte: PTQ vs. QAT

Die Quantisierungstechniken lassen sich in zwei grosse Stromungen unterteilen, die sich in Kosten, Genauigkeit und Einsatzbereichen grundlegend unterscheiden:

Post-Training Quantization (PTQ) wird direkt nach dem Modelltraining durchgefuhrt und benotigt nur eine geringe Menge an Kalibrierungsdaten (typischerweise 128-512 Beispiele), ohne Neutraining. PTQ ist derzeit die vorherrschende Methode fur die LLM-Quantisierung, da die Kosten fur das Neutrainieren eines 70B+-Modells zu hoch sind. GPTQ, AWQ und GGUF-Quantisierung gehoren alle zur PTQ-Kategorie.

Quantization-Aware Training (QAT) simuliert den Quantisierungseffekt wahrend des Trainingsprozesses, sodass das Modell lernt, auch bei niedriger Prazision genau zu bleiben. QAT liefert in der Regel eine bessere Genauigkeit als PTQ, erfordert jedoch die vollstandige Trainingsinfrastruktur. Googles bahnbrechende Arbeit aus dem Jahr 2018[3] legte die ingenieurstechnische Grundlage fur QAT und ist bis heute die Kernmethode fur den Einsatz auf mobilen Geraten (TensorFlow Lite).

EigenschaftPTQ (Post-Training Quantization)QAT (Quantization-Aware Training)
Neutraining erforderlich?Nein (nur Kalibrierung)Ja (vollstandiges oder teilweises Training)
ZeitaufwandMinuten bis StundenTage bis Wochen
Genauigkeit (8-Bit)Nahezu verlustfreiNahezu verlustfrei
Genauigkeit (4-Bit)Leichter Ruckgang (mit GPTQ/AWQ kontrollierbar)Besser (aber hohere Kosten)
Genauigkeit (2-Bit)Deutlicher RuckgangAkzeptabel (erfordert spezielles Design)
EinsatzbereichLLM-Inferenz-Deployment (Mainstream)Edge-Gerate, extrem niedrige Bitanforderungen

2.2 LLM.int8(): Durchbruch durch die Speichergrenze grosser Modelle

Im Jahr 2022 veroffentlichten Tim Dettmers und Kollegen auf der NeurIPS die Arbeit LLM.int8()[4], die es erstmals ermoglichte, Modelle mit 175B Parametern (wie OPT-175B) in INT8-Prazision auf GPUs auszufuhren -- der Speicherbedarf halbierte sich, aber die Genauigkeit blieb vollstandig erhalten.

Die zentrale Entdeckung von LLM.int8() war: In grossen Transformer-Architekturen gibt es eine geringe Anzahl von „Ausreisser-Features" (Outlier Features) -- bestimmte Dimensionen der Aktivierungswerte sind uber 100-mal grosser als andere. Eine direkte Quantisierung wurde diese Ausreisser „abschneiden" und zu einem schwerwiegenden Genauigkeitseinbruch fuhren. Die Losung ist die Mixed-Precision-Zerlegung: Ausreisser-Dimensionen behalten FP16, alle ubrigen Dimensionen verwenden INT8 -- die Ergebnisse der Matrixmultiplikation werden anschliessend zusammengefuhrt.

Diese Arbeit loste nicht nur ein technisches Problem, sondern brachte auch die bitsandbytes-Bibliothek hervor -- heute das am weitesten verbreitete Quantisierungs-Backend im HuggingFace-Okosystem.

2.3 GPTQ: Einmalige Komprimierung auf 3-4 Bit

Wenn INT8 die „Sicherheitszone" der Quantisierung darstellt, dann hat GPTQ[5] (ICLR 2023) die „Aggressionszone" eroffnet -- die Komprimierung von LLMs auf 3-4 Bit pro Parameter.

GPTQ basiert auf einer cleveren Naherung: Informationen zweiter Ordnung (eine Approximation der Hesse-Matrix) werden verwendet, um die optimale Kompensationsstrategie bei der Quantisierung jedes Gewichts zu bestimmen. Durch schichtweise Quantisierung und „Weiterleitung" des Quantisierungsfehlers an nachfolgende Gewichte komprimierte GPTQ OPT-175B und BLOOM-176B in wenigen Stunden auf 3-4 Bit, bei nahezu unveranderter Genauigkeit. Das bedeutet: Ein Modell, das ursprunglich 350 GB Speicher benotigte, braucht nun nur noch ~44-88 GB -- und passt auf eine oder zwei High-End-GPUs.

Ein weiterer wichtiger Beitrag von GPTQ war die Etablierung eines Engineering-Benchmarks fur LLM-Quantisierung -- nachfolgende Methoden wie AWQ und SqueezeLLM verwenden GPTQ als Vergleichsbasis.

2.4 AWQ: Nur 1 % der kritischen Gewichte schutzen

AWQ[6] vom MIT-Han-Song-Team (MLSys 2024 Best Paper) lieferte eine uberraschende Erkenntnis: Nicht alle Gewichte sind gleich wichtig. Es genugt, anhand der Grosse der Aktivierungswerte jenes 1 % „kritischer Gewichte" zu identifizieren und speziell zu schutzen (durch Multiplikation mit einem Skalierungsfaktor vor der Quantisierung), um 4-Bit-Quantisierung nahezu verlustfrei zu gestalten.

Im Gegensatz zur schichtweisen Optimierung zweiter Ordnung bei GPTQ ist der AWQ-Ansatz intuitiver, schneller und zudem hardwarefreundlich -- das erzeugte Quantisierungsformat kann direkt effizient auf GPUs ausgefuhrt werden und erreicht auf Edge-GPUs eine uber 3-fache Beschleunigung.

2.5 QLoRA: Die goldene Kombination aus Quantisierung und Feinabstimmung

Quantisierung wurde traditionell als reine Inferenztechnik betrachtet -- zuerst das Modell trainieren, dann quantisieren und deployen. QLoRA[7] (NeurIPS 2023 Oral) hat diese Grenze durchbrochen: Es ermoglicht die Feinabstimmung des Modells im quantisierten Zustand.

Die drei grossen Innovationen von QLoRA:

Das Ergebnis: Eine einzelne 48-GB-GPU genugt fur die Feinabstimmung eines 65B-Modells, und die Qualitat ist mit einer vollstandigen 16-Bit-Feinabstimmung vergleichbar. Das QLoRA-Guanaco-Modell (auf dem OASST1-Datensatz feinabgestimmtes LLaMA) wurde innerhalb von 24 Stunden trainiert und erreichte 99,3 % der ChatGPT-Qualitat.

2.6 Extreme Komprimierung: SqueezeLLM, AQLM und QuIP#

Wenn die Bitzahl unter 3 Bit fallt, stosst die traditionelle uniforme Quantisierung (jeder Wert wird auf aquidistante diskrete Punkte abgebildet) an ihre Grenzen. Im Jahr 2024 losten drei ICML-Arbeiten dieses Problem gleichzeitig:

SqueezeLLM[8] verfolgt die Strategie „teile und herrsche": Wenige extreme Ausreisser werden in eine Sparse-Matrix isoliert (mit hoher Prazision beibehalten), wahrend die ubrigen Gewichte mit K-Means-basierter nicht-uniformer Quantisierung behandelt werden -- die diskreten Punkte sind nicht aquidistant, sondern konzentrieren sich in Bereichen, in denen die Gewichtsverteilung dicht ist.

AQLM[9] ubernimmt Techniken aus der Multi-Codebook-Quantisierung des Information Retrieval: Jede Gewichtsgruppe wird durch die „Summe" der Codeworter aus mehreren Codebooks dargestellt, wobei die Codebooks lernbar sind. Damit erreichte AQLM als erste Methode ein Pareto-Optimum unter 2 Bit.

QuIP#[10] geht mathematisch vor: Zunachst werden die Gewichte durch eine zufallige Hadamard-Transformation „durchmischt" (die Korrelationen zwischen Dimensionen werden aufgelost), anschliessend erfolgt Vektorquantisierung mit einem E8-Gitter-Codebook (der mathematisch dichtesten 8-dimensionalen Kugelpackung).

2.7 BitNet b1.58: Die Grundannahme „Modelle mussen Gleitkommazahlen sein" in Frage stellen

Wahrend die oben genannten Methoden bestehende Gleitkommamodelle „komprimieren", stellt Microsofts BitNet[11] eine fundamentalere Frage: Modelle mussen von Anfang an keine Gleitkommazahlen sein.

BitNet ersetzt die Standardschicht nn.Linear durch BitLinear und verwendet vom ersten Trainingsschritt an 1-Bit-Gewichte. Im Jahr 2024 veroffentlichte das Team BitNet b1.58[12], das die Gewichte auf drei Werte {-1, 0, +1} (1,58 Bits = log23) quantisiert. Bei 3B Parametern erreicht BitNet b1.58 die Leistung von FP16-LLaMA und bietet gleichzeitig:

Noch bemerkenswerter ist, dass der Leistungsvorteil von BitNet mit zunehmender Modellgrosse wachst -- dies deutet darauf hin, dass 1,58-Bit-Modelle bei grosserer Skalierung Volleprazisionsmodelle ubertreffen konnten. Die Inferenz-Engine von BitNet, bitnet.cpp (veroffentlicht auf der ACL 2025), ermoglicht die effiziente Ausfuhrung ternarer Modelle auf CPUs, sodass LLMs auch auf Geraten ohne GPU moglich werden.

III. Empirische Daten: Gesamtubersicht der Quantisierungskomprimierungseffekte

ModellTechnikBitzahlSpeichereinsparungGenauigkeitseinflussQuelle
OPT-175BLLM.int8()INT8~50 %Keine VerschlechterungDettmers et al., 2022
OPT-175B / BLOOM-176BGPTQ3-4 Bit75-81 %PPL nahezu unverandertFrantar et al., 2022
LLaMA-SerieAWQ4 Bit~75 %Nahezu verlustfrei; 3x+ BeschleunigungLin et al., 2024
LLaMA-65BQLoRA (NF4)4 Bit + LoRA~75 % (feinabstimmbar)Vergleichbar mit FP16-FeinabstimmungDettmers et al., 2023
LLaMA-SerieSqueezeLLM3 Bit~81 %Verlustfrei (Dense+Sparse)Kim et al., 2024
LLaMA-2-70BAQLM2 Bit~87 %2-Bit Pareto-OptimumEgiazarian et al., 2024
3B-SkalaBitNet b1.581,58 Bit3,55x ReduktionVergleichbar mit FP16-LLaMAMa et al., 2024
FLUX.1-dev (12B)SVDQuantW4A43,5x ReduktionNahezu verlustfreiLi et al., 2025

IV. Entscheidungsrahmen: Nutzen, Kosten und Anwendungsgrenzen der Quantisierung

Quantisierung hat unter den drei grossen Modellkomprimierungstechniken (Quantisierung, Pruning, Destillation) die niedrigste Einfuhrungshurde. Das Verstandnis ihrer Positionierung hilft bei der Wahl der richtigen Komprimierungsstrategie:

DimensionOriginalmodell (FP16/BF16)Quantisiertes Modell (INT4/INT8)
Speicherbedarf2 Bytes pro Parameter (z. B. LLaMA-70B: 140 GB)0,5 Bytes pro Parameter (INT4: 35 GB) bis 1 Byte (INT8: 70 GB)
InferenzgeschwindigkeitBasisgeschwindigkeitINT8: 1,5-2x Beschleunigung; INT4-AWQ: 3x+ Beschleunigung
GenauigkeitVolle PrazisionINT8 nahezu verlustfrei; INT4 Verlust <1 %; 2-Bit erfordert spezielle Methoden
EinfuhrungskostenSehr gering (PTQ benotigt nur Minuten bis Stunden, kein Neutraining)
FeinabstimmungsfahigkeitVollstandige FeinabstimmungQLoRA unterstutzt Feinabstimmung im quantisierten Zustand
HardwareanforderungenMehrere High-End-GPUsEine einzelne Consumer-GPU fur Inferenz; CPU mittels GGUF-Format moglich

Strategische Vorteile

Risiken, die gemanagt werden mussen

Quantisierung vs. Pruning vs. Destillation: Wann welche Methode?

SzenarioEmpfohlene TechnikGrund
Schnelle Reduktion des InferenzspeichersQuantisierung (AWQ / GPTQ / GGUF)Kein Neutraining, in Minuten abgeschlossen
Modellarchitektur muss geandert werdenDestillationDas Schulermodell kann eine andere Architektur verwenden
Redundante Strukturen entfernenPruningStrukturiertes Pruning verkleinert das Modell tatsachlich
Maximale Komprimierung anstrebenPruning + Destillation + QuantisierungDie Kombination aller drei kann 35-49x erreichen
Edge-Gerate / CPU-DeploymentQuantisierung (GGUF) + PruningGGUF unterstutzt nativ CPU-Inferenz
Feinabstimmung grosser Modelle mit kleinem BudgetQLoRA (Quantisierung + LoRA)Feinabstimmung eines 65B-Modells auf einer einzelnen GPU

V. Hands-on Lab: Google Colab Online-Labor (CV-Modellquantisierung)

Beginnen wir mit dem grundlegendsten Szenario: INT8-Quantisierung von ResNet-18 mit den integrierten Quantisierungswerkzeugen von PyTorch, mit Vergleich von Genauigkeit, Geschwindigkeit und Modellgrosse vor und nach der Quantisierung. Der gesamte Code kann direkt auf Google Colab ausgefuhrt werden (dieses Experiment verwendet die CPU, da PyTorchs dynamische Quantisierung fur CPUs optimiert ist).

Google Colab offnen, ein neues Notebook erstellen und den folgenden Code der Reihe nach einfugen:

5.1 Step 1 — Vortrainiertes Modell und Daten laden

import torch
import torch.nn as nn
import torch.quantization as quant
import torchvision
import torchvision.transforms as transforms
import torchvision.models as models
import time, os, copy

# Dieses Experiment verwendet die CPU (PyTorch-Quantisierungsinferenz ist fur CPUs optimiert)
device = torch.device("cpu")
print(f"Gerat: {device}")

# ---- Datensatz ----
transform_test = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2470, 0.2435, 0.2616)),
])

testset = torchvision.datasets.CIFAR10(root='./data', train=False,
                                       download=True, transform=transform_test)
testloader = torch.utils.data.DataLoader(testset, batch_size=256,
                                         shuffle=False, num_workers=2)

# Kalibrierungsdaten
calibration_set = torchvision.datasets.CIFAR10(root='./data', train=True,
                                                download=True, transform=transform_test)
calibloader = torch.utils.data.DataLoader(calibration_set, batch_size=64,
                                           shuffle=True, num_workers=2)

# ---- Modell: ResNet-18 (angepasst fur CIFAR-10) ----
model = models.resnet18(weights=None, num_classes=10)
model.conv1 = nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1, bias=False)
model.maxpool = nn.Identity()

# Vortrainierte Gewichte laden (10 Epochen trainiert)
import torch.optim as optim
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.1, momentum=0.9, weight_decay=5e-4)
scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=10)

trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
                                        download=True, transform=transforms.Compose([
    transforms.RandomCrop(32, padding=4),
    transforms.RandomHorizontalFlip(),
    transforms.ToTensor(),
    transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2470, 0.2435, 0.2616)),
]))
trainloader = torch.utils.data.DataLoader(trainset, batch_size=128, shuffle=True, num_workers=2)

print("Basismodell trainieren (10 Epochen)...")
model.train()
for epoch in range(10):
    for inputs, targets in trainloader:
        optimizer.zero_grad()
        loss = criterion(model(inputs), targets)
        loss.backward()
        optimizer.step()
    scheduler.step()
    if (epoch + 1) % 5 == 0:
        print(f"  Epoch {epoch+1}/10 abgeschlossen")

model.eval()
print("Basismodell-Training abgeschlossen")

5.2 Step 2 — Evaluierungsfunktionen

def evaluate(model, dataloader):
    """Berechnet die Testgenauigkeit (CPU)"""
    model.eval()
    correct, total = 0, 0
    with torch.no_grad():
        for inputs, targets in dataloader:
            outputs = model(inputs)
            _, predicted = outputs.max(1)
            total += targets.size(0)
            correct += predicted.eq(targets).sum().item()
    return 100. * correct / total

def measure_speed(model, input_size=(1, 3, 32, 32), n_runs=300):
    """Misst die CPU-Inferenzlatenz (ms)"""
    model.eval()
    dummy = torch.randn(*input_size)
    for _ in range(50):
        with torch.no_grad():
            model(dummy)
    start = time.perf_counter()
    for _ in range(n_runs):
        with torch.no_grad():
            model(dummy)
    return (time.perf_counter() - start) / n_runs * 1000

def get_model_size_mb(model):
    """Berechnet die Modellgrosse (MB)"""
    torch.save(model.state_dict(), "/tmp/_tmp_q.pth")
    size = os.path.getsize("/tmp/_tmp_q.pth") / 1024 / 1024
    os.remove("/tmp/_tmp_q.pth")
    return size

# ---- Basisdaten ----
base_acc = evaluate(model, testloader)
base_speed = measure_speed(model)
base_size = get_model_size_mb(model)

print(f"{'='*55}")
print(f"  Basismodell (FP32 ResNet-18)")
print(f"{'='*55}")
print(f"  Genauigkeit:    {base_acc:.2f}%")
print(f"  Inferenzlatenz: {base_speed:.2f} ms")
print(f"  Modellgrosse:   {base_size:.2f} MB")
print(f"{'='*55}")

5.3 Step 3 — Dynamische Quantisierung (am einfachsten: eine Zeile Code)

# Dynamische Quantisierung: eine Zeile Code, sofort erledigt
# Nur die Gewichte der Linear-Schichten werden in INT8 quantisiert,
# Aktivierungswerte werden zur Inferenzzeit dynamisch quantisiert
model_dynamic = torch.quantization.quantize_dynamic(
    copy.deepcopy(model),
    {nn.Linear},   # Welche Schichten quantisiert werden
    dtype=torch.qint8
)

dyn_acc = evaluate(model_dynamic, testloader)
dyn_speed = measure_speed(model_dynamic)
dyn_size = get_model_size_mb(model_dynamic)

print(f"\nDynamische Quantisierung (INT8)")
print(f"  Genauigkeit:    {dyn_acc:.2f}% (Delta {dyn_acc - base_acc:+.2f}%)")
print(f"  Inferenzlatenz: {dyn_speed:.2f} ms (Beschleunigung {base_speed/dyn_speed:.2f}x)")
print(f"  Modellgrosse:   {dyn_size:.2f} MB (Verkleinerung {base_size/dyn_size:.2f}x)")

5.4 Step 4 — Statische Quantisierung (besser: Gewichte + Aktivierungswerte werden quantisiert)

# Statische Quantisierung erfordert zuerst das Einfugen von Beobachtern,
# dann das Sammeln von Statistiken mit Kalibrierungsdaten
model_static = copy.deepcopy(model)
model_static.eval()

# Quantisierungskonfiguration festlegen
model_static.qconfig = torch.quantization.get_default_qconfig('x86')

# Schichten fusionieren (Conv + BN + ReLU -> eine einzelne Operation)
model_fused = torch.quantization.fuse_modules(model_static, [
    ['conv1', 'bn1', 'relu'],
])

# Beobachter einfugen
model_prepared = torch.quantization.prepare(model_fused)

# Kalibrierung: einige Batches der Trainingsdaten durchlaufen lassen
print("Statische Quantisierung: Kalibrierung lauft...")
with torch.no_grad():
    for i, (inputs, _) in enumerate(calibloader):
        model_prepared(inputs)
        if i >= 15:  # ca. 1000 Bilder
            break

# In quantisiertes Modell umwandeln
model_quantized = torch.quantization.convert(model_prepared)

stat_acc = evaluate(model_quantized, testloader)
stat_speed = measure_speed(model_quantized)
stat_size = get_model_size_mb(model_quantized)

print(f"\nStatische Quantisierung (INT8)")
print(f"  Genauigkeit:    {stat_acc:.2f}% (Delta {stat_acc - base_acc:+.2f}%)")
print(f"  Inferenzlatenz: {stat_speed:.2f} ms (Beschleunigung {base_speed/stat_speed:.2f}x)")
print(f"  Modellgrosse:   {stat_size:.2f} MB (Verkleinerung {base_size/stat_size:.2f}x)")

5.5 Step 5 — Vollstandiger Vergleich

print(f"\n{'='*70}")
print(f"  Vollstandiger Vergleich der Quantisierungseffekte (ResNet-18 / CIFAR-10 / CPU)")
print(f"{'='*70}")
print(f"{'Methode':<14} {'Genauigkeit':>8} {'Delta':>8} {'Latenz(ms)':>9} "
      f"{'Speedup':>7} {'Grosse(MB)':>9} {'Kompression':>7}")
print(f"{'-'*70}")

results = [
    ('FP32 Original', base_acc, 0, base_speed, 1.0, base_size, 1.0),
    ('Dynam. INT8', dyn_acc, dyn_acc-base_acc, dyn_speed,
     base_speed/dyn_speed, dyn_size, base_size/dyn_size),
    ('Stat. INT8', stat_acc, stat_acc-base_acc, stat_speed,
     base_speed/stat_speed, stat_size, base_size/stat_size),
]

for name, acc, delta, speed, speedup, size, compress in results:
    print(f"{name:<14} {acc:>7.2f}% {delta:>+7.2f}% {speed:>8.2f}  "
          f"{speedup:>6.2f}x {size:>8.2f}  {compress:>6.2f}x")

print(f"{'='*70}")
print(f"\nWichtige Beobachtungen:")
print(f"  - Dynamische Quantisierung ist am einfachsten (eine Zeile Code), quantisiert aber nur Linear-Schichten")
print(f"  - Statische Quantisierung ist umfassender, mit deutlicheren Verbesserungen bei Modellgrosse und Geschwindigkeit")
print(f"  - Der Genauigkeitsverlust ist bei beiden Methoden gering -- INT8 ist der sicherste Einstiegspunkt fur Quantisierung")
print(f"  - CPU-Inferenzbeschleunigung ist das primare Einsatzszenario fur Quantisierung")

VI. Hands-on Lab: LLM 4-Bit-Quantisierungsinferenz (Sprachmodelle)

Die CV-Modellquantisierung hat die Grundprinzipien demonstriert. Nun folgt das Hauptereignis -- das Laden und Ausfuhren grosser Sprachmodelle mit 4-Bit-Quantisierung auf dem kostenlosen Google Colab. Wir verwenden die bitsandbytes-Integration[13] von HuggingFace und das GPTQ-Format.

Google Colab offnen (T4-GPU auswahlen), ein neues Notebook erstellen und den folgenden Code der Reihe nach einfugen:

6.1 Methode 1: bitsandbytes 4-Bit (am einfachsten)

!pip install transformers accelerate bitsandbytes -q

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
import time

# Eine Zeile Konfiguration genugt, um 4-Bit-Quantisierung zu aktivieren
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,                    # 4-Bit-Quantisierung aktivieren
    bnb_4bit_quant_type="nf4",           # NF4-Format (von QLoRA empfohlen)
    bnb_4bit_compute_dtype=torch.float16, # FP16 fur Berechnungen verwenden
    bnb_4bit_use_double_quant=True,       # Double Quantization (weiterer Speichergewinn)
)

model_name = "microsoft/phi-2"  # 2,7B Parameter, auf kostenlosem Colab T4 ausfuhrbar

print("4-Bit-quantisiertes Modell wird geladen...")
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
model_4bit = AutoModelForCausalLM.from_pretrained(
    model_name,
    quantization_config=bnb_config,
    device_map="auto",
    trust_remote_code=True,
)

# Speicherstatistik
mem_allocated = torch.cuda.memory_allocated() / 1024**3
print(f"4-Bit-Modell erfolgreich geladen")
print(f"  GPU-Speicherverbrauch: {mem_allocated:.2f} GB")
print(f"  (FP16 benotigt ca. {2.7*2:.1f} GB, 4-Bit nur ca. {2.7*0.5:.1f} GB)")

# Generierungstest
prompts = [
    "The key advantage of model quantization is",
    "In machine learning, reducing model size while maintaining accuracy",
    "Knowledge Distillation and quantization are complementary because",
]

model_4bit.eval()
for prompt in prompts:
    inputs = tokenizer(prompt, return_tensors="pt").to(model_4bit.device)
    with torch.no_grad():
        outputs = model_4bit.generate(
            **inputs, max_new_tokens=60,
            do_sample=True, temperature=0.7, top_p=0.9,
        )
    text = tokenizer.decode(outputs[0], skip_special_tokens=True)
    print(f"\n  Prompt: {prompt}")
    print(f"  Output: {text[:200]}...")

6.2 Methode 2: Vorquantisiertes GPTQ-Modell laden

!pip install auto-gptq optimum -q

from transformers import AutoModelForCausalLM, AutoTokenizer

# Auf HuggingFace gibt es zahlreiche vorquantisierte GPTQ-Modelle aus der Community
# Zum Beispiel GPTQ-quantisierte Versionen von TheBloke
model_name = "TheBloke/Llama-2-7B-Chat-GPTQ"

print("GPTQ 4-Bit-Modell wird geladen...")
tokenizer = AutoTokenizer.from_pretrained(model_name)
model_gptq = AutoModelForCausalLM.from_pretrained(
    model_name,
    device_map="auto",
    torch_dtype=torch.float16,
)

mem = torch.cuda.memory_allocated() / 1024**3
print(f"GPTQ-Modell erfolgreich geladen")
print(f"  GPU-Speicher: {mem:.2f} GB (Original FP16 benotigt ~14 GB)")

# Dialogtest
messages = "What is model quantization and why is it important for AI deployment?"
inputs = tokenizer(messages, return_tensors="pt").to(model_gptq.device)
with torch.no_grad():
    outputs = model_gptq.generate(**inputs, max_new_tokens=100, temperature=0.7)
print(f"\n  Q: {messages}")
print(f"  A: {tokenizer.decode(outputs[0], skip_special_tokens=True)[:300]}...")

6.3 Methode 3: Ein Modell selbst quantisieren (AWQ)

!pip install autoawq -q

from awq import AutoAWQForCausalLM
from transformers import AutoTokenizer

# Modell auswahlen, das quantisiert werden soll
model_path = "facebook/opt-1.3b"  # 1,3B, auf kostenlosem Colab quantisierbar

print("AWQ-Quantisierung wird gestartet...")
print("  Originalmodell wird geladen...")
model = AutoAWQForCausalLM.from_pretrained(model_path)
tokenizer = AutoTokenizer.from_pretrained(model_path)

# AWQ-Quantisierungskonfiguration
quant_config = {
    "zero_point": True,   # Symmetrische Quantisierung
    "q_group_size": 128,  # Quantisierungsgruppen-Grosse
    "w_bit": 4,           # 4-Bit-Quantisierung
    "version": "GEMM",    # GPU-beschleunigte Version
}

# Quantisierung ausfuhren (einige Minuten)
model.quantize(tokenizer, quant_config=quant_config)

# Quantisiertes Modell speichern
save_path = "./opt-1.3b-awq-4bit"
model.save_quantized(save_path)
tokenizer.save_pretrained(save_path)

print(f"AWQ-Quantisierung abgeschlossen, gespeichert unter {save_path}")

# Dateigrosse vergleichen
import os
orig_size = sum(os.path.getsize(f"./opt-1.3b-awq-4bit/{f}")
                for f in os.listdir(save_path) if f.endswith('.safetensors'))
print(f"  Quantisierte Modellgrosse: {orig_size / 1024**2:.0f} MB")
print(f"  (Original FP16 ca. {1.3*2*1024:.0f} MB)")

6.4 Fortgeschritten: Quantisierte Modelle mit llama.cpp auf der CPU ausfuhren

Wenn Ihr Ziel darin besteht, LLMs auf einem Computer ohne GPU auszufuhren, ist das GGUF-Format von llama.cpp[14] die praktikabelste Losung:

# Im lokalen Terminal ausfuhren (nicht Colab):

# 1. llama.cpp installieren
git clone https://github.com/ggml-org/llama.cpp
cd llama.cpp && make -j

# 2. Von der Community quantisiertes GGUF-Modell herunterladen
#    (auf HuggingFace gibt es zahlreiche fertige Versionen)
# Beispiel: Q4_K_M ist das beste Gleichgewicht zwischen Qualitat und Grosse
huggingface-cli download TheBloke/Llama-2-7B-Chat-GGUF \
    llama-2-7b-chat.Q4_K_M.gguf --local-dir ./models

# 3. Direkt auf der CPU ausfuhren!
./llama-cli -m ./models/llama-2-7b-chat.Q4_K_M.gguf \
    -p "Explain model quantization in simple terms:" \
    -n 200 -t 8

# GGUF-Quantisierungsstufen im Vergleich:
# Q2_K:   2-Bit (kleinstes, geringere Qualitat)
# Q4_K_M: 4-Bit (empfohlen, bestes Gleichgewicht Qualitat/Grosse)
# Q5_K_M: 5-Bit (Qualitat nahe FP16)
# Q8_0:   8-Bit (nahezu verlustfrei, aber grosser)

VII. Diffusionsmodell-Quantisierung: FLUX mit 12B in eine 16-GB-Grafikkarte packen

Die Bedeutung der Quantisierung fur Diffusionsmodelle ist ebenso gross. FLUX.1-dev hat 12B Parameter und benotigt in FP16 24 GB VRAM -- das ubersteigt die Kapazitat einer RTX 4090. Quantisierung ist die Schlusseltechnologie, um diese Modelle auf Consumer-Hardware laufen zu lassen.

7.1 Q-Diffusion: Pionier der spezialisierten Quantisierung fur Diffusionsmodelle

Die Quantisierung von Diffusionsmodellen ist schwieriger als bei LLMs, da dasselbe Modell uber verschiedene Entrauschungs-Zeitschritte (Timesteps) arbeiten muss -- die Aktivierungswertverteilung ist bei jedem Zeitschritt unterschiedlich. Li et al. stellten auf der ICCV 2023 Q-Diffusion[15] vor, das dieses Problem erstmals loste: Durch zeitschrittbewusste Kalibrierung (statt einer einzigen globalen Kalibrierung) werden Quantisierungsstatistiken erhoben, und Shortcut-Verbindungen werden speziell behandelt, sodass eine 4-Bit-Gewichtsquantisierung bei nahezu unverandertem FID erreicht wird.

7.2 SVDQuant: Niedrigrang-Zweig absorbiert Ausreisser

SVDQuant[16] vom MIT-Han-Song-Team (ICLR 2025 Spotlight) treibt die Diffusionsmodell-Quantisierung weiter bis auf W4A4 (Gewichte und Aktivierungswerte jeweils 4 Bit). Die zentrale Innovation ist: Zunachst werden die Gewichte per SVD in einen Niedrigrang-Zweig (absorbiert Ausreisser, behalt hohe Prazision) und einen Restzweig (4-Bit-Quantisierung) zerlegt. In Kombination mit der eigens entwickelten Nunchaku-Inferenz-Engine kann das 12B-Modell von FLUX.1-dev flussig auf einer RTX 4090 mit 16 GB ausgefuhrt werden:

# 4-Bit FLUX.1 mit Nunchaku ausfuhren (RTX 4090 oder hoher erforderlich)
!pip install nunchaku diffusers transformers -q

import torch
from diffusers import FluxPipeline

# SVDQuant 4-Bit-Version laden
pipe = FluxPipeline.from_pretrained(
    "black-forest-labs/FLUX.1-dev",
    torch_dtype=torch.bfloat16
)

# Durch 4-Bit-quantisierten Transformer ersetzen
from nunchaku.models.flux import load_quantized_model
pipe.transformer = load_quantized_model(
    "mit-han-lab/svdq-int4-flux.1-dev",
    device="cuda"
)
pipe.to("cuda")

image = pipe(
    prompt="A photorealistic mountain landscape at golden hour",
    num_inference_steps=28,
    guidance_scale=3.5,
).images[0]
image.save("flux_svdquant_result.png")
print("4-Bit FLUX.1 Generierung abgeschlossen")

7.3 GGUF-Quantisierung: Stable Diffusion auf der CPU ausfuhren

Genau wie llama.cpp LLMs auf der CPU ermoglicht, erlaubt stable-diffusion.cpp auch Diffusionsmodelle in reiner CPU-Umgebung Bilder zu generieren. Die Community hat bereits GGUF-quantisierte Versionen fur SD 1.x/2.x, SDXL, SD3.5, FLUX und weitere Modelle bereitgestellt. In Kombination mit dem ComfyUI-GGUF-Plugin konnen auch Nicht-Entwickler quantisierte Diffusionsmodelle lokal einsetzen.

MethodeKonferenzGeeignete ModelleBitzahlErgebnis
Q-DiffusionICCV 2023SD-SerieW4Erste PTQ fur Diffusionsmodelle
SVDQuant + NunchakuICLR 2025FLUX / SD3W4A43,5x Speicherreduktion, 3x Beschleunigung
GGUF (sd.cpp)CommunitySD / SDXL / FLUXQ4-Q8CPU-Inferenz, ComfyUI-Integration
TensorRT FP8NVIDIASD / FLUXFP82-2,3x Beschleunigung, VRAM -40 %

VIII. Gesamtubersicht des Okosystems und der Werkzeuge

Das Werkzeug-Okosystem fur Quantisierung ist das ausgereifteste unter den drei grossen Komprimierungstechniken -- von einer Zeile Code bis zum Enterprise-Deployment gibt es fur jedes Szenario eine passende Losung:

Native HuggingFace-Integration

LLM-Quantisierungsformate

Enterprise-Plattformen

Speziell fur Diffusionsmodelle

IX. Von technischen Metriken zur Geschaftswirkung

Die Auswirkungen der Quantisierung auf das KI-Deployment von Unternehmen sind direkt und quantifizierbar (Wortspiel beabsichtigt):

X. Implementierungspfad: Dreistufige Umsetzungsstrategie

  1. Sofortige Wirkung -- bestehende quantisierte Modelle nutzen: Auf HuggingFace stehen bereits Tausende vorquantisierter Modelle bereit (GPTQ/GGUF-Versionen von TheBloke, AWQ-Versionen aus der Community). Einfach herunterladen und verwenden, keine Quantisierungskenntnisse erforderlich. Empfehlung: Beginnen Sie mit dem GGUF Q4_K_M-Format -- das beste Gleichgewicht zwischen Qualitat und Grosse
  2. Schrittweise Validierung -- eigene Modelle mit bitsandbytes quantisieren: Fugen Sie in Ihren bestehenden HuggingFace-Inferenz-Code BitsAndBytesConfig(load_in_4bit=True) ein und beobachten Sie die Genauigkeitsveranderungen. Wenn Sie eine Feinabstimmung benotigen, wenden Sie QLoRA direkt auf das quantisierte Modell an
  3. Produktionsoptimierung -- Deployment-Format wahlen: Fur GPU-Server wahlen Sie AWQ + vLLM (schnellste Inferenzgeschwindigkeit); fur CPU / Edge-Deployment wahlen Sie GGUF + llama.cpp; fur NVIDIA-GPU-Cluster wahlen Sie TensorRT-LLM (FP8/FP4). Fur die Bildgenerierung wahlen Sie SVDQuant (GPU) oder ComfyUI-GGUF (universell)

Quantisierung ist das „Plug-and-Play"-Element in der Trilogie der Modellkomprimierung (Pruning, Destillation, Quantisierung). Sie erfordert keine Anderung der Modellarchitektur (Anforderung bei Pruning), kein Neutraining (Anforderung bei Destillation), sondern lediglich eine Reduzierung der numerischen Prazision -- und diese einfache Operation kann die Hardwareanforderungen fur KI-Deployment um eine Grossenordnung senken.

Wenn Ihr Team eine Modellkomprimierungsstrategie evaluiert oder das optimale Gleichgewicht zwischen Kosten, Latenz und Genauigkeit finden mochte, laden wir Sie herzlich zu einem vertieften technischen Gesprach ein. Das Forschungsteam von Meta Intelligence kann Sie auf dem gesamten Weg von der Modelldiagnose bis zum Produktions-Deployment begleiten.