Startseite / Artikel / LoRA und QLoRA erklärt: Ein 7B-Modell feintunen ohne 100 GB VRAM

LoRA und QLoRA erklärt: Ein 7B-Modell feintunen ohne 100 GB VRAM

Warum vollständiges Fine-Tuning 80 bis 100 GB braucht, wie Low-Rank-Adapter die trainierbaren Gewichte auf 1,6 % senken, wie man Rang und Ziel-Layer wählt und was QLoRA hinzufügt.

1064 Wörter

LoRA ergibt erst Sinn, wenn man sieht, wo es zwischen Pre-Training und Fine-Tuning steht, also fangen wir dort an.

Pre-Training und Fine-Tuning

Pre-Training findet statt, wenn ein Modell zum ersten Mal gebaut wird. Es lernt selbstständig aus Textfolgen, ganz ohne Labels: Der Trainingstext liefert sowohl die Eingaben als auch die Ziele, und heraus kommt ein universelles Basismodell.

Dieses Basismodell hat reichlich Wissen, folgt aber keinem bestimmten Format, Muster oder keiner Anweisung. Oft setzt es einfach fort, was Sie eingegeben haben, und hängt weitere Wörter an. Das behebt das Fine-Tuning. Sie trainieren das Modell mit gelabelten Beispielen aus Anweisung, Eingabe und gewünschter Antwort, damit es lernt, wie gute Antworten aussehen.

Angenommen, Sie brauchen ein Modell für juristische Anfragen. Sie würden nicht bei null anfangen, wenn es schon ein vortrainiertes Modell mit viel Fachwissen gibt. Sie feintunen es, damit es effizient antwortet.

Warum vollständiges Fine-Tuning so mühsam ist

Jeden Parameter zu aktualisieren frisst Speicher. Nehmen wir ein 7B-Llama-Modell mit diesem Setup:

Model size: 7 billion parameters
Training dtype: BF16 / FP16
Optimizer: AdamW
Sequence length: 2048

Allein das Laden des Basismodells kostet 14 GB. Beim vollständigen Fine-Tuning ist jeder Parameter trainierbar, also braucht jeder einen Gradienten, und werden die Gradienten in BF16 oder FP16 gespeichert, sind das weitere 14 GB. Der Optimierer AdamW verlangt dann rund 56 GB zusätzlich und hält womöglich eine FP32-Kopie der Parameter, was noch einmal etwa 28 GB ausmacht. Auch die Aktivierungen brauchen etwas. Zusammen landen Sie bei 80 bis 100 GB, viel zu viel für eine eng umrissene Spezialaufgabe, die nicht einmal besonders kompliziert ist.

Was LoRA macht

LoRA steht für Low-Rank Adaptation. Es feintunt ein Modell, ohne jedes Gewicht einzeln zu aktualisieren. Alle ursprünglichen Gewichte bleiben eingefroren, und ein Paar kleiner Matrizen übernimmt das Lernen.

Wie können kleine Matrizen ein großes Modell lenken? Überlegen Sie, was ein vortrainiertes Modell schon kann: Englisch, Grammatik, Denkmuster, Programmierung, Fakten. Soll es nun juristische Fragen in einem bestimmten Stil beantworten, muss es die Sprache nicht neu lernen. Sie müssen nur lenken, was schon da ist. LoRA setzt darauf, dass sich eine solche Änderung meist in einer Struktur mit weniger Dimensionen erfassen lässt:

ΔW = AB

Die Milliarden Gewichte, die das Modell gelernt hat, bleiben also unangetastet. LoRA lässt W in Ruhe und legt eine Korrektur darüber:

W_new = W + ΔW

Die Zahlen durchgerechnet

Stellen Sie sich einen Transformer mit einem einzigen linearen Layer vor:

X -> W -> Output

W habe die Form 1000 mal 1000. Dann enthält sie:

1000 x 1000 = 1,000,000 parameters

Vollständiges Fine-Tuning trainiert jeden einzelnen davon, und echte LLMs haben solche Matrizen überall, deshalb sind bei einem 7B-Modell etwa 7 Milliarden Parameter zu trainieren.

Mit LoRA bauen Sie zwei schmale Matrizen, A und B, und wählen einen Rang, zum Beispiel r = 8:

A = [1000 x 8]
b = [8 x 1000]

Ihr Produkt hat dieselbe Form wie W, die Summe ist also gültig:

W_new = W + AB

[1000×1000] + [1000×1000]

Die Ersparnis ergibt sich daraus, wie wenige Parameter die beiden schmalen Matrizen enthalten:

A: 1000 × 8 = 8,000
B: 8 × 1000 = 8,000

Total = 16,000 parameters

Vergleichen Sie beide Ansätze:

Full fine-tuning:
1,000,000 parameters

LoRA:
16,000 parameters

Für diesen Layer sind das gerade einmal 1,6 % der trainierbaren Parameter.

Was der Rang bedeutet

Der Rang ist einer der wichtigsten Hyperparameter von LoRA und bestimmt, wie viel Kapazität der Adapter hat. Ein niedriger Rang wie 4 oder 8 ergibt einen kleineren Adapter, der weniger Speicher braucht, aber weniger flexibel ist. Komplexe Aufgaben benötigen eventuell 32, 64 oder 128. Ein höherer Rang kostet mehr Speicher und bedeutet nicht automatisch bessere Qualität, da er Rauschen einbringen kann. Probieren Sie mehrere Ränge aus und behalten Sie den, der am besten funktioniert.

Wohin die Adapter kommen

LoRA hängt kleine trainierbare Matrizen an einen eingefrorenen Transformer, doch ein Transformer enthält viele Matrizen. Ein vereinfachter Decoder-only-Block hat mehrere davon, und ein Modell kann diesen Block 32, 40, 80 oder mehr Mal stapeln. Die Frage bei LoRA lautet, welche dieser W-Matrizen eine trainierbare BA-Korrektur verdienen. Drei gängige Strategien:

Strategie 1: nur q_proj und v_proj. Ein Adapter auf q_proj kann verändern, wie Repräsentationen Queries nach relevantem Kontext bilden, während einer auf v_proj die Information verändert, die von den beachteten Tokens weitergegeben wird.

Strategie 2: alle Attention-Projektionen. Setzen Sie Adapter auf q_proj, k_proj, v_proj und o_proj, dann kann LoRA alle wichtigen gelernten linearen Transformationen der Attention verändern. Sie gewinnen Anpassungsfähigkeit und bekommen mehr trainierbare Parameter.

Strategie 3: Attention-Projektionen plus MLP-Layer. Das ist das größere, starke Allzweck-Setup:

ATTENTION

q_proj       ✅
k_proj       ✅
v_proj       ✅
o_proj       ✅


MLP

gate_proj    ✅
up_proj      ✅
down_proj    ✅

Transformer bestehen nicht nur aus Attention. Das MLP leistet einen enormen Teil der gelernten Merkmalstransformation, und wenn Sie es einbeziehen, bekommt das Fine-Tuning spürbar mehr Spielraum.

Hat LoRA das Speicherproblem gelöst?

Nein, nicht ganz. Es senkt die Zahl der trainierbaren Parameter um rund 99 %, aber der GPU-Speicher fällt nicht um 99 %, denn das Basismodell muss weiterhin geladen werden und der Forward Pass läuft weiterhin, sogar mit etwas zusätzlicher Rechenarbeit. Der eigentliche Gewinn liegt bei Gradienten und Optimiererzuständen. Sie müssen keine Gradienten für 7 Milliarden Parameter mehr vorhalten.

QLoRA

QLoRA steht für quantisierte Low-Rank Adaptation und treibt die Idee einen Schritt weiter. Da die Basisgewichte ohnehin eingefroren sind, lassen sie sich auf 4 Bit quantisieren. Ein 7B-Modell, das in BF16 14 GB braucht, schrumpft auf etwa 3,5 bis 5 GB. Deshalb lässt sich ein 7B-Modell mit QLoRA auf einer einzigen Gaming-Grafikkarte tunen, eine Aufgabe, die klassisches vollständiges Fine-Tuning auf mehrere GPUs mit viel Speicher verteilen würde.