60 minutes · the second module of Pillar 2 — what grew on the LoRA trunk in 2024, and which branches you use in 2026
Pillar 2 — Parameter-Efficient Fine-Tuning
DoRA's weight-decomposition analysis (NVIDIA, arXiv:2402.09353): full FT and LoRA update weights in structurally different geometry.
| Method | Magnitude update | Direction update |
|---|---|---|
| Full FT | independent | independent — decoupled |
| LoRA | ∝ coupled | ∝ coupled — locked ratio |
| DoRA | vector m | LoRA on direction — decoupled |
Rewrite the update as magnitude × direction, with LoRA applied only to the direction:
W = m ⊙ (W₀ / ‖W₀‖) + ΔW_direction
↑ ↑ ↑
per-column unit- LoRA adapter
magnitude normalized (B·A), direction only
vector m frozen base
DoRA's advantage is not uniform across tasks. Two regimes where it is largest:
The paradox: turning rank UP in vanilla LoRA often makes it worse. Cause = the scaling factor.
| Rank, α=16 | Vanilla LoRA α/r | rsLoRA α/√r |
|---|---|---|
| r = 8 | 16/8 = 2.0 | 16/√8 = 5.66 |
| r = 64 | 16/64 = 0.25 ← inert | 16/√64 = 2.0 |
| r = 128 | 16/128 = 0.125 ← inert | 16/√128 = 1.41 |
use_rslora=True. Rule of thumb: above r=32, use rsLoRA.
DoRA edits
The magnitude/direction split on top of the frozen base. Adds the decoupling full FT has.
rsLoRA edits
The scaling factor inside the direction-side LoRA adapter. α/r → α/√r.
This is why the PEFT menu is not single-choice. DoRA + rsLoRA is the stack; PiSSA is an init layer you add on top.
PiSSA (arXiv:2404.02948, NeurIPS '24)
Drop-in initialization alternative. Seeds adapter B,A from the principal singular vectors of W₀ (fast SVD) instead of random/zero. Faster convergence, strong on NLU. Same param count.
Tradeoff: reshuffles frozen vs trained → merge into the residual base, not the original.
GaLore (arXiv:2403.03507, MLSys '24)
NOT an adapter. Full-parameter FT with the gradient projected into a low-rank subspace — so the optimizer state (the ~56 GB Adam buffers for a 7B) is compressed.
7B full-param training on a single 24 GB RTX 4090. Use case: "I want full-FT quality on a memory-limited node."
Most PEFT papers do not graduate to default. Place them honestly:
| Method | One-line | Verdict |
|---|---|---|
| DoRA | magnitude/direction decomposition | 2026 default |
| rsLoRA | α/√r scaling | default at r ≥ 64 |
| PiSSA | SVD-based init | strong alt init |
| GaLore | gradient low-rank projection | the full-FT bridge |
| VeRA | shared random matrices, ~10× fewer params | niche — storage bottleneck only |
| AdaLoRA | adaptive rank allocation | superseded by DoRA |
| MiSS | claims SOTA | experimental, not reproduced |
Real GPU (16–24 GB, bf16)
DoRA + rsLoRA, r=32–64, α≈√r. The default.
Consumer card (<12 GB, 4-bit)
QDoRA — DoRA on a quantized base. Leading quality/cost.
Decision says full FT (FT10)
GaLore — not vanilla full FT.
The config
config = LoraConfig(
r=64,
lora_alpha=64,
use_dora=True, # ← the
use_rslora=True, # ← upgrade
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM",
target_modules=["q_proj","k_proj",
"v_proj","o_proj",
"gate_proj","up_proj",
"down_proj"],
)
use_dora=True and use_rslora=True — are the entire upgrade from FT08's vanilla LoRA config. No new training loop, optimizer, or export pipeline.
use_rslora=True. Above r=32 without rsLoRA = wasting your rank budget.
Fine-tune the same base on the same data with vanilla LoRA and with DoRA + rsLoRA. Eval both on a held-out set. Observe the delta.
Expect DoRA ahead — especially at low rank (r=16) where the decoupling buys the most headroom. The gap is typically a few ROUGE-L points, not a blowout. The direction is the finding. If your task is close to the base distribution, the gap may be small — itself a result.
use_dora=True, use_rslora=True) and position QDoRA as the leading quality/cost point.Next: FT10 — Full FT vs PEFT: The Decision
Where DoRA sits on the decision tree, and when you escalate from DoRA to GaLore full FT.