Module FT09 — DoRA, rsLoRA, and Modern PEFT

DoRA, rsLoRA, and Modern PEFT

What grew on the LoRA trunk in 2024, and which branches you actually use in 2026. DoRA's magnitude/direction decomposition closes ~half the gap between LoRA and full FT at ~5–10% more VRAM; rsLoRA's α/√r scaling unlocks high rank; PiSSA is a drop-in SVD initialization; GaLore is the bridge to full-parameter FT. The practical sweet spot is two flags: use_dora=True and use_rslora=True.

60
minutes
8
artifacts
8
sub-sections
FT08 taught LoRA and QLoRA — the trunk of the PEFT tree. FT09 shows what grew on that trunk. The DoRA authors (NVIDIA, ICML 2024 Oral) asked a structural question: how does a LoRA update differ in GEOMETRY from a full fine-tuning update? Their weight-decomposition analysis found that full FT updates a weight's magnitude and direction independently, while LoRA updates them proportionally — locked in a fixed ratio. That is roughly half of what full FT does, and the half LoRA cannot express at any rank. DoRA splits magnitude from direction and adapts each independently, closing about half the gap to full FT at ~5–10% more VRAM and zero inference overhead after merge. rsLoRA fixes a different, orthogonal problem: vanilla LoRA's α/r scaling collapses toward zero as rank grows, making high-rank adapters numerically present but functionally inert. The α/√r fix (one flag, use_rslora=True) restores stability at r ≥ 64. The two methods STACK — DoRA's decomposition plus rsLoRA's scaling is the 2026 default. PiSSA offers a faster-converging SVD-based initialization for NLU-heavy tasks. GaLore, categorically different, projects the gradient into a low-rank subspace so the optimizer state (the ~56 GB Adam buffers for a 7B) is compressed — enabling true full-parameter FT on a 24 GB consumer card; it is the bridge when the FT10 decision says 'full FT' but the GPU says 'no'. VeRA, AdaLoRA, and MiSS are placed honestly on the niche/research axis: do not adopt them in production without a controlled A/B on your own held-out eval. The module's central discipline: never adopt a PEFT method on a paper's benchmark alone — measure it on your data.
Key Claims
Load-Bearing Claims

DoRA (Weight-Decomposed Low-Rank Adaptation, NVIDIA, arXiv:2402.09353, ICML 2024 Oral) fixes a structural deficit of LoRA: LoRA couples magnitude and direction updates proportionally (when the low-rank product B·A shifts a column, both its magnitude and its direction move together in a fixed ratio), whereas full fine-tuning updates them independently. LoRA cannot rotate a direction without rescaling its magnitude, and vice versa — roughly half of what full FT does, and the half LoRA cannot express at any rank. DoRA decomposes the weight into a per-column magnitude vector m and a unit-normalized direction, applies a LoRA-style adapter ONLY to the direction, and adapts the magnitude via the tiny vector m. It closes ~half the gap between LoRA and full FT at ~5–10% more VRAM, and after merge the magnitude and direction fold back into a single weight tensor that is shape-identical to the base — ZERO inference overhead, no serving-stack changes.

rsLoRA (rank-stabilized LoRA, arXiv:2312.03732) fixes the high-rank paradox: vanilla LoRA's α/r scaling collapses toward zero as rank grows (at r=64, α=16 the scale is 0.25; at r=128 it is 0.125), making the adapter numerically present but functionally inert and training unstable. rsLoRA changes one character — α/r becomes α/√r — keeping forward-pass magnitudes stable as rank climbs (at r=64, α=16 the scale becomes 2.0). Rule of thumb: above r=32, use rsLoRA; below that it does no harm but offers little. rsLoRA STACKS with DoRA, it does not compete: DoRA edits the magnitude/direction decomposition on top of the frozen base; rsLoRA edits the scaling factor inside the direction-side LoRA adapter. They are orthogonal knobs — the combination beats either alone, especially at high rank. Enabling both is two flags: use_dora=True and use_rslora=True in LoraConfig.

PiSSA (Principal Singular values and Singular Vectors Adaptation, arXiv:2404.02948, NeurIPS 2024) is a drop-in INITIALIZATION alternative: instead of LoRA's random-A/zero-B start, it runs a fast SVD on the frozen W₀, splits into principal and residual components, and seeds the adapter from the principal part while freezing the residual as the new base. Faster convergence and stronger NLU quality at the same parameter count; initialization takes seconds. Tradeoff: it reshuffles frozen vs trained, so merge-back must go into the residual base. GaLore (Gradient Low-Rank Projection, arXiv:2403.03507, ICML 2024) is categorically different — NOT an adapter. It trains ALL parameters (full-parameter FT) but projects the gradient into a low-rank subspace before the optimizer sees it, so the dominant memory cost (the optimizer state — Adam's ~56 GB first/second-moment buffers for a 7B) is compressed. GaLore fit a 7B full-param run on a single 24 GB RTX 4090. Use case: 'I want full-FT quality on a memory-limited node' — the bridge when the FT10 decision says full FT but the GPU says no.

The 2026 practical sweet spot is DoRA + rsLoRA at appropriate rank (r=32–64, α≈√r) — the default for new work, configured with two flags. On memory-constrained consumer hardware, QDoRA (DoRA on a 4-bit quantized base, the DoRA analogue of QLoRA) is the leading quality/cost point: full-FT-adjacent quality from a setup that fits a 7B-class model on a single consumer card, with negligible memory overhead on top of QLoRA and the same DoRA-over-LoRA quality lift. When true full-parameter FT is required (large domain shift adapters cannot capture, per FT10), GaLore replaces vanilla full FT. VeRA (~10× fewer params via shared frozen random matrices; niche — storage-bottleneck multi-adapter only), AdaLoRA (adaptive rank allocation; largely superseded by DoRA), and MiSS (claims SOTA; not widely reproduced) are placed on the niche/research axis — do not adopt in production without a controlled A/B on your own held-out eval. The cardinal anti-pattern is chasing novelty without measuring: adopt a method only after a controlled same-base/same-data/same-eval A/B; DoRA earned default status through consistent gains reproduced by independent teams, a single-paper claim does not.

After This Module
01
Explain what DoRA fixes about LoRA — the coupling of magnitude and direction updates — and defend the claim that DoRA closes roughly half the gap between LoRA and full fine-tuning at only ~5–10% more VRAM and zero inference overhead after merge.
02
State why rsLoRA changes the scaling factor from α/r to α/√r, why this matters only at high rank (r ≥ 64), and why rsLoRA STACKS with DoRA rather than competing with it (they edit orthogonal parts of the adapter update).
03
Distinguish the modern PEFT family on a standard-vs-niche axis: DoRA + rsLoRA as the 2026 practical sweet spot, PiSSA as a drop-in initialization alternative (strong on NLU, faster convergence), GaLore as the bridge to full-parameter FT, and VeRA / AdaLoRA / MiSS as niche or experimental.
04
Configure DoRA + rsLoRA in Hugging Face PEFT (use_dora=True, use_rslora=True) and position QDoRA (quantized DoRA) as the leading quality/cost point for memory-constrained consumer hardware.
05
Avoid the three PEFT anti-patterns: chasing novelty without measuring, ignoring the rank-stability issue at high rank (the 'I set r=128 and it didn't help' failure mode), and reaching for full fine-tuning where DoRA would suffice.
Artifacts
01
Teaching Document
~3,200 words; 7 sub-sections — the structural deficit DoRA names (LoRA couples magnitude/direction; full FT updates them independently), the DoRA decomposition (magnitude vector m + LoRA on direction, ~half the gap closed at ~5–10% more VRAM, zero inference overhead), rsLoRA's α/√r fix for high-rank instability (r ≥ 64), PiSSA's SVD-based initialization (faster convergence, NLU-strong), GaLore as the full-FT bridge (gradient low-rank projection compresses optimizer state), the standard-vs-niche axis (VeRA/AdaLoRA/MiSS as niche), the 2026 sweet spot (DoRA+rsLoRA two flags; QDoRA for consumer cards), the three anti-patterns.
READ
02
Diagrams
5 Mermaid diagrams (dark #14141f/#5eead4) — DoRA magnitude/direction decomposition vs LoRA's coupled update; the modern PEFT family tree (LoRA → DoRA/rsLoRA defaults, PiSSA alt-init, GaLore full-FT bridge, VeRA/AdaLoRA/MiSS niche); the quality/cost positioning (DoRA closes half the gap; QDoRA at QLoRA cost); the stack diagram (DoRA+rsLoRA are orthogonal — stack them); the PEFT decision flow (DoRA+rsLoRA default → QDoRA on memory pressure → GaLore when DoRA measured-insufficient).
READ
03
Slide Deck
12-slide reveal.js deck (exact FT07 head/style template: :root vars, .reveal rules, .callout/.grid2/table/.label/.footer-meta). Title 'Module FT09 — DoRA, rsLoRA, and Modern PEFT', footer 'Course 3 — LLM Fine-Tuning Masterclass · FT09 · Pillar 2'. Covers the structural deficit, the DoRA fix, rsLoRA's scaling table, the stack, PiSSA+GaLore, the standard-vs-niche axis, the two-flag config, anti-patterns, the lab, and learning outcomes.
READ
04
Teaching Script
~2,100-word verbatim teaching script, [SLIDE N] cues, ~40 min at 140 wpm. Same senior voice as FT00/FT07. 12 slide cues matching the deck.
READ
05
Flashcards
26 flashcards (c3::ft09::*), TSV with header row. Mix of recall/application/analysis tags covering every claim: DoRA decomposition, the structural deficit, rsLoRA scaling math, the stack rationale, PiSSA/GaLore/VeRA/AdaLoRA/MiSS placement, the two-flag config, QDoRA, the three anti-patterns, and the controlled-A/B discipline.
TEST
06
Exam
15-question exam JSON, exact Bloom distribution 3 recall / 6 application / 6 analysis. Schema matches prior modules (module/course/version/duration_minutes/total_questions/bloom_distribution/passing_score_percent/questions). Covers the magnitude/direction deficit, the α/√r math, the two-flag config, QDoRA/GaLore/PiSSA use cases, the standard-vs-niche distinction, and the controlled-A/B discipline.
TEST
07
Lab Spec
1 lab — 'LoRA vs DoRA': controlled A/B fine-tuning of the same base (SmolLM2-135M-Instruct) on the same data (smoltalk slice) with vanilla LoRA vs DoRA+rsLoRA, same rank/epochs/batch/LR. Shared eval harness (exact-match + ROUGE-L on a 200-row held-out set). Deliverables include the two configs, param counts, eval table, sample generations, verdict, and a reflection on why controlled A/B is the only valid adoption basis. Stretch goals: rank sweep, 2×2 DoRA×rsLoRA isolation, QDoRA on a 1.5B model, PiSSA init. Consumer-GPU friendly (QDoRA-capable); ~60–90 min.
DO
08
Module Web Page
Single-file HTML hub
HERE