QLoRA
QLoRA führt ein Fine-Tuning von LLMs durch, indem LoRA-Adapter auf einem eingefrorenen Basismodell trainiert werden, das im 4-Bit-NF4-Format gespeichert ist. Dadurch passt ein Modell mit 65 Milliarden Parametern auf eine einzelne 48-GB-GPU.
QLoRA (quantisierte Anpassung niedrigen Rangs) ist eine Feinabstimmungsmethode, bei der ein vortrainiertes großes Sprachmodell (LLM) mit 4-Bit-Genauigkeit eingefroren und mit kleinen LoRA-Adaptern ergänzt wird. Beim Backpropagation werden die quantisierten Gewichte durchlaufen und die Adapter angepasst. Dettmers et al. führten die Methode 2023 in der QLoRA-Arbeit ein. Sie senkte den für die Feinabstimmung eines Modells mit 65 Milliarden Parametern benötigten GPU-Speicher von mehr als 780 GB auf unter 48 GB – genug für eine einzelne GPU in einer Workstation. Gleichzeitig entsprach die Aufgabenleistung der einer Feinabstimmung mit 16 Bit. Die auf diese Weise feinabgestimmten Guanaco-Modelle der Arbeit erreichten nach 24 Stunden Training auf einer einzigen GPU 99,3 % des ChatGPT-Ergebnisses beim Vicuna-Benchmark.
So funktioniert QLoRA#
QLoRA kombiniert ein eingefrorenes, komprimiertes Basismodell mit drei speichersparenden Techniken:
- 4-Bit-NormalFloat (NF4): Jedes Gewicht wird als 4-Bit-Code gespeichert, der auf eine von 16 Stufen verweist. Diese Stufen liegen an den Quantilen einer Normalverteilung; pro Block mit 64 Gewichten wird ein absoluter Maximalwert als Skalierungsfaktor verwendet. Vortrainierte Modellgewichte sind ungefähr normalverteilt. Daher bieten Quantilstufen mehr Auflösung um null, wo die meisten Gewichte liegen.
- Doppelte Quantisierung: Die Skalierungsfaktoren für einzelne Blöcke werden selbst in Blöcken zu je 256 auf 8 Bit quantisiert. Dadurch sinkt ihr Speicheraufwand von 0,5 auf etwa 0,127 Bit pro Parameter – bei einem Modell mit 65 Milliarden Parametern entspricht das einer Einsparung von ungefähr 3 GB.
- Gepagte Optimierer: Die Zustände des Optimierers liegen im vereinheitlichten NVIDIA-Speicher und werden bei Speicherengpässen in den CPU-Arbeitsspeicher verschoben, etwa bei langen Sequenzen mit Gradienten-Checkpointing. So stürzt das Training nicht wegen unzureichenden Speichers ab.
Im Vorwärtsdurchlauf dequantisiert jede eingefrorene Schicht ihre NF4-Gewichte unmittelbar vor der Matrixmultiplikation zu bfloat16 und addiert die Ausgabe des LoRA-Pfads. Bei der Backpropagation werden die Gradienten anhand der dequantisierten Gewichte berechnet, aber nur die beiden niedrig-rangigen LoRA-Matrizen aktualisiert. Die Arbeit zeigte, dass Adapter auf jeder linearen Schicht des Transformer-Blocks erforderlich waren, um die Leistung einer vollständigen Feinabstimmung zu erreichen:
Der folgende Ausschnitt erstellt die NF4-Stufen wie die bitsandbytes-Bibliothek und vergleicht sie mit 16 gleichmäßig verteilten Stufen für Blöcke normalverteilter Gewichte:
import torch
torch.manual_seed(0)
normal = torch.distributions.Normal(0.0, 1.0)
# NF4: 16 levels at quantiles of a normal distribution, with an exact zero (as built in bitsandbytes)
positive = normal.icdf(torch.linspace(0.9677083, 0.5, 9)[:-1])
negative = -normal.icdf(torch.linspace(0.9677083, 0.5, 8)[:-1])
nf4 = torch.cat([negative, torch.zeros(1), positive]).sort().values
nf4 = nf4 / nf4.max()
int4 = torch.linspace(-1, 1, 16) # evenly spaced 4-bit levels for comparison
weights = torch.randn(4096, 64) * 0.02 # pretrained weights are roughly normal, in blocks of 64
absmax = weights.abs().amax(dim=1, keepdim=True) # one scale per block
for name, levels in (("NF4", nf4), ("INT4", int4)):
codes = ((weights / absmax)[..., None] - levels).abs().argmin(dim=-1) # 4-bit index per weight
restored = levels[codes] * absmax
print(f"{name} mean squared error: {(restored - weights).pow(2).mean():.3e}")Die Ausgabe zeigt einen mittleren quadratischen Fehler von 3,395e-06 für NF4 und 4,053e-06 für gleichmäßig verteilte Stufen. Bei denselben 16 Stufen und denselben Blockskalierungen verringert die Quantilabstufung von NF4 den Rekonstruktionsfehler bei normalverteilten Gewichten um etwa 16 %. In der Praxis lädt Hugging Face Transformers ein Modell mit bitsandbytes in NF4. Dazu dient ein BitsAndBytesConfig, das load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_use_double_quant=True und bnb_4bit_compute_dtype=torch.bfloat16 festlegt. Die PEFT-Bibliothek fügt die LoRA-Adapter hinzu.
QLoRA und verwandte Methoden#
- LoRA: Trainiert dieselbe Art von Adaptern auf einem Basismodell, dessen Gewichte mit 16 Bit gespeichert sind. Allein die 16-Bit-Gewichte eines Modells mit 65 Milliarden Parametern benötigen etwa 130 GB. In NF4 belegen sie ungefähr ein Viertel davon.
- Parametersparende Feinabstimmung (PEFT): Die Gruppe von Methoden, bei denen nur eine kleine Anzahl an Parametern trainiert wird. Dazu gehören LoRA, QLoRA, Adapter und Prompt-Tuning.
- Nachträgliche Modellquantisierung: Komprimiert ein fertiges Modell für die Inferenz. Ein mit QLoRA feinabgestimmtes Modell wird häufig mit 16-Bit-Gewichten zusammengeführt und anschließend für den Betrieb erneut quantisiert.
- Quantisierungsbewusstes Training (QAT): Simuliert Rundungen mit geringer Genauigkeit im Vorwärtsdurchlauf, während alle Gewichte trainiert werden. So behält das bereitgestellte Modell seine Genauigkeit auch bei geringer Präzision. Ultralytics YOLO26 führt INT8-QAT aus, wenn es mit
quantize=8trainiert wird. Dabei fügt NVIDIA ModelOpt eine simulierte Quantisierung in die Faltungs- und linearen Schichten ein, damit die trainierten Gewichte beim INT8-Export erhalten bleiben.
Kompromisse#
QLoRA tauscht Geschwindigkeit gegen Speicherplatz: Da bei jedem Vorwärts- und Rückwärtsdurchlauf alle eingefrorenen Gewichte dequantisiert werden, dauert ein Trainingsschritt länger als bei LoRA mit 16 Bit. Die Adapter lassen sich platzsparend speichern und je nach Aufgabe austauschen. Um sie jedoch mit dem Basismodell zusammenzuführen, muss dieses zunächst auf 16 Bit dequantisiert werden. Bei einem Modell mit 65 Milliarden Parametern benötigen die 4-Bit-Gewichte und die doppelt quantisierten Skalierungsfaktoren etwa 34 GB. Damit bleiben auf einer 48-GB-GPU genügend Speicher für Adapter, Aktivierungen und gepagte Optimiererzustände.










