| name | scaling-dora-factored-norms |
| title | Scaling DoRA: Efficient Training of Adapters with Factored Norm Computation |
| version | 0.0.3 |
| engine | skillxiv-v0.0.3-claude-opus-4.6 |
| license | MIT |
| url | https://arxiv.org/abs/2603.22276 |
| keywords | ["DoRA","Adapter Scaling","Factored Norms","Fused Kernels","Memory Efficiency"] |
| description | Optimize adapter parameter efficiency at scale by decomposing row-wise norm computation into base/cross/BA components (15× memory reduction) and fusing kernel operations. Achieves 1.5–2.0× inference speedup with 77 GB peak VRAM reduction across 8–32B vision-language models; applies when training adapter-based models with strict memory budgets across hundreds of modules. |
Component ID
DoRA norm computation and fusion pipeline for parameter-efficient fine-tuning.
Motivation
Standard DoRA implementations materialize dense rank-wise products consuming ~512 MB transient memory per module at typical scales (d_in=8192, r=384). With hundreds of adapted modules and gradient checkpointing, this memory requirement becomes prohibitive on production hardware.
The Modification
Factored Norm Decomposition
The row-wise squared norm decomposes algebraically into three evaluable terms without materializing the full BA product:
def factored_norm_forward(base, lora_a, lora_b, d_out, r):
"""
Three components: base magnitude, cross-terms, and lora contribution.
Reduces rank-dependent persistent memory from O(d_in² + d_out·d_in) to O(d_out·r + r²).
"""
base_squared = (base ** 2).sum(dim=1, keepdim=True)
lora_product = lora_a @ lora_b
cross = 2 * (base * lora_product).sum(dim=1, keepdim=True)
lora_squared = (lora_product ** 2).sum(dim=1, keepdim=True)
return base_squared + cross + lora_squared
This achieves up to 15× theoretical memory reduction for the norm operation.
Fused Triton Kernels
Four sequential CUDA operations collapse into single-pass execution with numerical stability guarantees:
def fused_compose_kernel(base, lora, g, s, eps=):
base_norm_sq = (base ** ).() + eps
base_norm = base_norm_sq.sqrt()
composition = ( - g) * base + g * s * lora
composition / base_norm