- 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).
| Eigenschaft | PTQ (Post-Training Quantization) | QAT (Quantization-Aware Training) |
|---|---|---|
| Neutraining erforderlich? | Nein (nur Kalibrierung) | Ja (vollstandiges oder teilweises Training) |
| Zeitaufwand | Minuten bis Stunden | Tage bis Wochen |
| Genauigkeit (8-Bit) | Nahezu verlustfrei | Nahezu verlustfrei |
| Genauigkeit (4-Bit) | Leichter Ruckgang (mit GPTQ/AWQ kontrollierbar) | Besser (aber hohere Kosten) |
| Genauigkeit (2-Bit) | Deutlicher Ruckgang | Akzeptabel (erfordert spezielles Design) |
| Einsatzbereich | LLM-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:
- 4-Bit NormalFloat (NF4): Ein speziell fur normalverteilte Gewichte entwickeltes Quantisierungsformat, das eine bessere Informationserhaltung bietet als Standard-INT4
- Double Quantization: Selbst die Quantisierungsparameter werden quantisiert, was weiteren Speicher einspart
- Paged Optimizers: CPU-Speicher wird genutzt, um GPU-Speicheruberlaufe abzufangen
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:
- 2,71x schnellere Inferenz
- 3,55x weniger Speicherverbrauch
- 71,4 % geringerer Energieverbrauch (Matrixmultiplikation)
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
| Modell | Technik | Bitzahl | Speichereinsparung | Genauigkeitseinfluss | Quelle |
|---|---|---|---|---|---|
| OPT-175B | LLM.int8() | INT8 | ~50 % | Keine Verschlechterung | Dettmers et al., 2022 |
| OPT-175B / BLOOM-176B | GPTQ | 3-4 Bit | 75-81 % | PPL nahezu unverandert | Frantar et al., 2022 |
| LLaMA-Serie | AWQ | 4 Bit | ~75 % | Nahezu verlustfrei; 3x+ Beschleunigung | Lin et al., 2024 |
| LLaMA-65B | QLoRA (NF4) | 4 Bit + LoRA | ~75 % (feinabstimmbar) | Vergleichbar mit FP16-Feinabstimmung | Dettmers et al., 2023 |
| LLaMA-Serie | SqueezeLLM | 3 Bit | ~81 % | Verlustfrei (Dense+Sparse) | Kim et al., 2024 |
| LLaMA-2-70B | AQLM | 2 Bit | ~87 % | 2-Bit Pareto-Optimum | Egiazarian et al., 2024 |
| 3B-Skala | BitNet b1.58 | 1,58 Bit | 3,55x Reduktion | Vergleichbar mit FP16-LLaMA | Ma et al., 2024 |
| FLUX.1-dev (12B) | SVDQuant | W4A4 | 3,5x Reduktion | Nahezu verlustfrei | Li 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:
| Dimension | Originalmodell (FP16/BF16) | Quantisiertes Modell (INT4/INT8) |
|---|---|---|
| Speicherbedarf | 2 Bytes pro Parameter (z. B. LLaMA-70B: 140 GB) | 0,5 Bytes pro Parameter (INT4: 35 GB) bis 1 Byte (INT8: 70 GB) |
| Inferenzgeschwindigkeit | Basisgeschwindigkeit | INT8: 1,5-2x Beschleunigung; INT4-AWQ: 3x+ Beschleunigung |
| Genauigkeit | Volle Prazision | INT8 nahezu verlustfrei; INT4 Verlust <1 %; 2-Bit erfordert spezielle Methoden |
| Einfuhrungskosten | — | Sehr gering (PTQ benotigt nur Minuten bis Stunden, kein Neutraining) |
| Feinabstimmungsfahigkeit | Vollstandige Feinabstimmung | QLoRA unterstutzt Feinabstimmung im quantisierten Zustand |
| Hardwareanforderungen | Mehrere High-End-GPUs | Eine einzelne Consumer-GPU fur Inferenz; CPU mittels GGUF-Format moglich |
Strategische Vorteile
- Niedrigste Einfuhrungshurde: PTQ erfordert kein Neutraining und kann mit einer Zeile Code durchgefuhrt werden. bitsandbytes ist in HuggingFace integriert,
load_in_4bit=Truegenugt zum Starten - Sofortige Wirkung: INT4-Quantisierung reduziert den Speicherbedarf direkt um 75 % und verwandelt LLaMA-70B von „benotigt 4 A100" zu „eine RTX 4090 genugt"
- Perfekte Kombination mit Pruning und Destillation: NVIDIA Minitron wendet zuerst Pruning + Destillation an, dann Quantisierung; Pruna AIs
smash()kombiniert automatisch mehrere Komprimierungstechniken - Ausgereiftes Okosystem: GPTQ, AWQ und GGUF -- drei grosse Formate mit jeweils vollstandigen Toolchains und Community-Unterstutzung; auf HuggingFace stehen Tausende vorquantisierter Modelle bereit
Risiken, die gemanagt werden mussen
- Ausreisser-Empfindlichkeit: Die Ausreisser-Features grosser Transformer fuhren dazu, dass naive Quantisierung (direktes Abschneiden auf INT8) zusammenbricht. Es mussen spezialisierte Methoden zur Ausreisserbehandlung wie LLM.int8() oder AWQ verwendet werden
- Prazisionsklippe bei niedrigen Bitzahlen: Oberhalb von 4 Bit ist die Quantisierung in der Regel sicher, aber unter 3 Bit ist der Genauigkeitsverlust nichtlinear. Der „Sweet Spot" ist fur jedes Modell unterschiedlich und muss experimentell ermittelt werden
- Einfluss der Kalibrierungsdaten: Die Qualitat von PTQ hangt von der Representativitat der Kalibrierungsdaten ab. Wenn die Kalibrierungsdaten stark vom tatsachlichen Einsatzszenario abweichen, kann die Genauigkeit nach der Quantisierung unter den Erwartungen liegen
- Formatfragmentierung: GPTQ, AWQ, GGUF und bitsandbytes haben jeweils unterschiedliche Formate und Toolchains. Die Wahl des falschen Formats kann zu Inkompatibilitaten mit der Inferenz-Engine fuhren
- Quantisierung ist nicht gleich komprimierte Speicherung: Die Speicherreduktion durch INT4 bezieht sich auf den GPU-Speicher. Die tatsachliche Verkleinerung der Modelldatei hangt vom Speicherformat ab (GGUF unterstutzt eine echte Dateiverkleinerung)
Quantisierung vs. Pruning vs. Destillation: Wann welche Methode?
| Szenario | Empfohlene Technik | Grund |
|---|---|---|
| Schnelle Reduktion des Inferenzspeichers | Quantisierung (AWQ / GPTQ / GGUF) | Kein Neutraining, in Minuten abgeschlossen |
| Modellarchitektur muss geandert werden | Destillation | Das Schulermodell kann eine andere Architektur verwenden |
| Redundante Strukturen entfernen | Pruning | Strukturiertes Pruning verkleinert das Modell tatsachlich |
| Maximale Komprimierung anstreben | Pruning + Destillation + Quantisierung | Die Kombination aller drei kann 35-49x erreichen |
| Edge-Gerate / CPU-Deployment | Quantisierung (GGUF) + Pruning | GGUF unterstutzt nativ CPU-Inferenz |
| Feinabstimmung grosser Modelle mit kleinem Budget | QLoRA (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:
- 3,5x weniger Speicherbedarf
- 3,0x Geschwindigkeitssteigerung
- Visuelle Qualitat nahezu verlustfrei
# 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.
| Methode | Konferenz | Geeignete Modelle | Bitzahl | Ergebnis |
|---|---|---|---|---|
| Q-Diffusion | ICCV 2023 | SD-Serie | W4 | Erste PTQ fur Diffusionsmodelle |
| SVDQuant + Nunchaku | ICLR 2025 | FLUX / SD3 | W4A4 | 3,5x Speicherreduktion, 3x Beschleunigung |
| GGUF (sd.cpp) | Community | SD / SDXL / FLUX | Q4-Q8 | CPU-Inferenz, ComfyUI-Integration |
| TensorRT FP8 | NVIDIA | SD / FLUX | FP8 | 2-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
- bitsandbytes[13] (GitHub):
load_in_4bit=Truegenugt zum Aktivieren. Unterstutzt INT8 / NF4, Grundlage fur QLoRA. Offiziell von HuggingFace empfohlen - HuggingFace Quantization Guide[17] (Dokumentation): Einheitliche Schnittstelle mit Unterstutzung fur bitsandbytes, GPTQ, AWQ, Quanto und weitere Backends
LLM-Quantisierungsformate
- GPTQ — GPTQModel (GitHub): Moderne Implementierung des GPTQ-Formats (Nachfolger von AutoGPTQ), unterstutzt CUDA / ROCm / XPU / CPU, Integration mit vLLM und SGLang
- AWQ — AutoAWQ (GitHub): AWQ-Format-Quantisierungswerkzeug, 2x Inferenzbeschleunigung
- GGUF — llama.cpp[14] (GitHub): Reine C/C++ LLM-Inferenz, GGUF-Format mit Unterstutzung fur 1,5-Bit bis 8-Bit, 70k+ Stars
Enterprise-Plattformen
- NVIDIA TensorRT-LLM (GitHub): FP8/FP4/INT4-AWQ/INT8-SmoothQuant, KV-Cache-Quantisierung, Unterstutzung fur Hopper- und Blackwell-GPUs
- Intel Neural Compressor (GitHub): Einheitliche Pipeline fur Quantisierung + Pruning + Destillation, inklusive AutoRound-Algorithmus
- TorchAO[18] (GitHub): Offizielle PyTorch-Bibliothek fur Quantisierung / Sparsity / Optimierung, integriert SpinQuant, INT4/INT8 und FP8
Speziell fur Diffusionsmodelle
- Nunchaku (GitHub): Inferenz-Engine von SVDQuant, 4-Bit FLUX auf Consumer-GPUs ausfuhrbar
- stable-diffusion.cpp (GitHub): GGUF-Format-Diffusionsmodell-Inferenz, unterstutzt SD / SDXL / FLUX / Wan2.x
- ComfyUI-GGUF (GitHub): GGUF-Quantisierungs-Plugin fur ComfyUI, sodass auch Nicht-Entwickler quantisierte Modelle nutzen konnen
IX. Von technischen Metriken zur Geschaftswirkung
Die Auswirkungen der Quantisierung auf das KI-Deployment von Unternehmen sind direkt und quantifizierbar (Wortspiel beabsichtigt):
- GPU-Kosten sinken um 75 %: INT4-Quantisierung verwandelt LLaMA-70B von einem Modell, das 4 A100 benotigt (monatliche Miete ~$10.000), zu einem, das auf einer einzelnen RTX 4090 (einmalig ~$1.600) lauft. Fur inferenzintensive Anwendungen ist das ein Kostenunterschied um Grossenordnungen
- Latenz halbiert: Speicherbandbreite ist der Engpass bei der LLM-Inferenz. Quantisierung reduziert die Menge der aus dem Speicher zu lesenden Daten und fuhrt direkt zu einer Inferenzbeschleunigung
- LLMs auch auf der CPU: Das GGUF-Format ermoglicht die Ausfuhrung von 7B-Modellen auf Laptops mit akzeptabler Geschwindigkeit, ohne GPU. Damit kann KI auf nahezu jedem Gerat bereitgestellt werden
- Massive Senkung der Feinabstimmungskosten: QLoRA ermoglicht die Feinabstimmung eines 65B-Modells auf einer einzelnen GPU und senkt die Hardwareanforderungen fur individuelle Unternehmens-LLMs von „benotigt einen KI-Cluster" auf „eine Grafikkarte"
- Demokratisierung der Bildgenerierung: SVDQuant ermoglicht FLUX.1 auf der RTX 4090, stable-diffusion.cpp ermoglicht SD auf der CPU. Professionelle Bildgenerierung erfordert keine Enterprise-Hardware mehr
- Nachhaltige KI: Geringere Prazision = weniger Berechnung = niedrigerer Energieverbrauch. Die Harvard Business Review[1] weist darauf hin, dass Modelloptimierung das direkteste Mittel zur Kontrolle des CO2-Fussabdrucks von KI ist
X. Implementierungspfad: Dreistufige Umsetzungsstrategie
- 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
- 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 - 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.



