LoRASpace: A Pool-Wide Shared Substrate for Static and Dynamic Multi-LoRA Composition
Organizations: University of Moratuwa, Sri Lanka · University of Michigan, USA
Abstract
Low-rank adaptation (LoRA) attaches small low-rank matrices to a frozen backbone, and public repositories host many LoRAs per backbone, each for a different concept or task. Combining several LoRAs in one generation forces a trade-off. Merging their weights into one update needs a single forward pass, but LoRAs trained for different concepts interfere and quality drops. Running each LoRA in its own forward pass (composite) preserves quality, but inference time grows linearly with the number of active LoRAs. We study a property of LoRA pools overlooked by prior multi-LoRA work. In real LoRA pools, the stacked low-rank factors need far fewer directions than their summed ranks. Using singular value decomposition, we find the minimal subspace that keeps 99% of the factor energy. On three diffusion pools, only 46% to 57% of the summed LoRA ranks is needed, and the subspace grows sub-linearly with pool size. A 48-LoRA sub-pool of LoRA-Hub on FLAN-T5 tasks shows comparable overlap (62%), while the diversity-curated LoRA-Retriever benchmark sits near the no-overlap baseline (96%), so pool composition rather than modality predicts where compression is large. We build on this overlap with LoRASpace, a training-free method that computes the subspace once per pool and reuses it in two inference modes, a static mode at merge cost and a dynamic mode for input-dependent routing. On the diffusion pools, static LoRASpace matches composite quality at merge cost, and dynamic LoRASpace is more than 6x faster than composite with six active LoRAs on a 17-LoRA pool, mainly because it runs one backbone pass instead of six. In an ablation, static variants at the same rank match LoRASpace, so the quality gain does not depend on the pool-wide basis. On the near-orthogonal LoRA-Retriever benchmark, compression is small and gains come from coupling with external retrieval.
Figures & tables
| Method family (representative work) | Pool-wide basis | Active per step | Mode | Per-image cost |
|---|---|---|---|---|
| Static merge (Task Arith. ( Ilharco et al., 2023 ) , TIES ( Yadav et al., 2023 ) , DARE ( Yu et al., 2024 ) ) | X | static | ||
| Shared-basis merge (Knots ( Stoica et al., 2025 ) , Core-Space ( Panariello et al., 2025 ) ) | per merge | static | ||
| Composite & step/mask routing | X | dynamic | ||
| (ComposLoRA ( Zhong et al., 2024 ) , CMLoRA ( Zou et al., 2025 ) , FreeFuse ( Liu et al., 2025 ) , MultLFG ( Roy et al., 2025 ) ) | ||||
| Per-input router-bound composition | X | to | dynamic | |
| (SpectR ( Fleshman and Van Durme, 2025 ) , K-LoRA ( Ouyang et al., 2025 ) , FreeLoRA ( Zheng et al., 2025 ) , LoRAHub ( Huang et al., 2024 ) , LoRA-Retriever ( Zhao et al., 2024 ) ) |
| Pool | (mean) | ||||
|---|---|---|---|---|---|
| Pool A (SD 1.5) | 11 | 784 | 446 | 0.57 | 0.43 |
| Pool B (SD 1.5) | 17 | 1112 | 521 | 0.47 | 0.49 |
| Pool C (SDXL) | 17 | 1792 | 819 | 0.46 | 0.55 |
| LoRA-Hub (FLAN-T5-Large) | 48 | 768 | 474 | 0.62 | 0.88 |
| LoRA-Retriever (LLaMA-2-7B) | 48 | 384 | 368 | 0.96 | 0.94 |
| Method | CLIP-T | ImageReward | GPT-4o Total | GPT-4o Win% |
|---|---|---|---|---|
| merge | 14.32 | 21.9 | ||
| composite | 15.24 | 29.5 | ||
| LoRASpace (uniform) | 15.61 | 48.6 |
Appendix figures & tables26 assets
Supplementary material from the paper’s appendix.
Appendix
| Method | Per-step compute | Peak GPU memory | Scaling in |
|---|---|---|---|
| merge | |||
| switch | compute , mem | ||
| composite | both | ||
| cmlora | both | ||
| knots | |||
| LoRASpace | , | GPU CPU | linear in inside subspace; caps with |
| (mean) | CLIP-T | ImageReward | |||
|---|---|---|---|---|---|
| 224 | 356 | 568 | 35.76 | 1.071 | |
| 248 | 392 | 611 | 35.81 | 1.072 | |
| 283 | 446 | 663 | 35.77 | 1.064 | |
| 314 | 508 | 741 | 35.80 | 1.067 |
| (mean) | (mean std) | ||
|---|---|---|---|
| 2 | 224 | 0.95 | |
| 4 | 304 | 0.91 | |
| 6 | 456 | 0.77 | |
| 8 | 584 | 0.68 | |
| 11 | 784 | 0.57 |
| Pool | ||||
|---|---|---|---|---|
| Pool C (SDXL, ) | 0.46 | 0.84 | 0.55 | 0.98 |
| Six stylized SDXL LoRAs ( ) | 0.97 | 1.00 | 0.97 | 1.00 |
| Community SDXL, uncurated ( ) | 0.87 | 0.99 | 0.88 | 1.00 |
| Pool C + community union ( ) | 0.43 | 0.89 | 0.48 | 0.99 |
| LoRA-Hub (FLAN-T5, ) | 0.60 | 1.00 | 0.60 | 0.70 |
| Wild FLAN-T5 LoRAs, uncurated ( ) | 0.84 | 1.00 | 0.85 | 0.92 |
| Per-LoRA error | Composed error ( ) | ||||
|---|---|---|---|---|---|
| Setting | marginal | joint | marginal | joint | |
| Full pool, , 24 layers | 822 | 0.88% | 0.35% | 0.84% | 0.43% |
| Small pool, , 24 layers | 374 | 0.52% | 0.22% | 0.56% | 0.32% |
| Full pool, , all 722 layers | per layer | 1.01% | 0.43% | 0.95% | 0.53% |
| mean | CLIP-T | ImageReward | DINO | |
|---|---|---|---|---|
| 0.99 | 785 | 25.33 | 1.137 | 1.000 |
| 0.70 | 107 | 25.67 | 1.158 | 0.981 |
| 0.50 | 49 | 25.61 | 1.148 | 0.967 |
| 0.30 | 22 | 25.27 | 1.117 | 0.949 |
| Pool | ||||
|---|---|---|---|---|
| Pool C (control) | 17 | 1792 | 819 | 0.46 |
| Six stylized LoRAs alone | 6 | 192 | 186 | 0.97 |
| Pool C + six stylized | 23 | 1984 | 848 | 0.43 |
| Community LoRAs, uncurated | 20 | 673 | 580 | 0.87 |
| Pool C + community | 37 | 2337 | 921 | 0.43 |
| Update path | Captured energy | Extra directions per layer |
|---|---|---|
| Projection, unchanged bases | 0.30 | 0 |
| Extension, | 0.92 | 4 |
| Extension, | 0.96 | 8 |
| Extension, | 0.98 | 16 |
| Extension, | 1.00 | 32 |
| Requirement | CtS | KnOTS | Core-Space | Composite | Per-combo truncated merge | LoRASpace |
|---|---|---|---|---|---|---|
| Serve any active subset, static or routed, from one precompute | no | no | no | n/a | no | yes |
| Context-dependent weights without backbone passes | no | no | no | no | no | yes |
| Predict before deployment whether a pool compresses | partial ∗ | no | no | no | no | yes ( ) |
| Admit a newly published adapter without recomputing the pool | no | no | no | n/a | no | yes (extension) |
| Method | Composition (native) | Composition ( compact ) | composition | image |
|---|---|---|---|---|
| spatial- LoRASpace | 4.15 | 4.27 | ||
| temporal- LoRASpace | 3.82 | 4.38 | ||
| semantic- LoRASpace | 3.78 | 4.20 | ||
| Mean | 3.92 | 4.28 |
| Method | CLIP-T | ImgReward | DINO (vs. comp.) | CLIP-T | ImgReward | DINO (vs. comp.) |
|---|---|---|---|---|---|---|
| merge | 32.16 | 0.06 | 0.508 | 32.49 | 0.01 | 0.434 |
| switch | 36.43 | 1.23 | 0.689 | 36.10 | 1.10 | 0.650 |
| composite | 35.65 | 0.61 | n/a | 34.47 | 0.39 | n/a |
| cmlora | 34.59 | 0.60 | 0.833 | 34.60 | 0.38 | 0.809 |
| spatial- LoRASpace | 34.79 | 0.70 | 0.512 | 34.03 | 0.59 | 0.399 |
| Router | CLIP-T | ImageReward |
|---|---|---|
| uniform | ||
| spatial | ||
| temporal | ||
| semantic |
| truncated-merge | subspace-merge | |||
| CLIP-T | ImgRew | CLIP-T | ImgRew | |
| 2 | 34.57 | 1.053 | 34.45 | 1.022 |
| 3 | 35.31 | 1.037 | 35.39 | 1.028 |
| 4 | 36.13 | 1.078 | 36.11 | 1.081 |
| 5 | 37.00 | 1.126 | 37.10 | 1.115 |
| Mean | 35.75 | 1.073 | 35.76 | 1.062 |
| merge | composite | LoRASpace (uniform) | ||||
|---|---|---|---|---|---|---|
| CLIP-T | ImgRew | CLIP-T | ImgRew | CLIP-T | ImgRew | |
| 2 | 29.33 | 1.300 | 31.50 | 1.292 | 31.67 | 1.289 |
| 3 | 31.32 | 0.894 | 32.95 | 1.108 | 33.60 | 1.089 |
| 4 | 28.82 | 0.799 | 31.79 | 1.058 | 32.95 | 1.106 |
| 5 | 28.53 | 0.426 | 30.48 | 0.829 | 32.01 | 1.028 |
| 6 | 29.06 | 0.184 | 32.85 | 0.577 | 34.22 | 0.691 |
| Method | Time @ (s) | Time @ (s) | Peak VRAM | Load VRAM |
|---|---|---|---|---|
| merge | 23.0 | 43.5 † | 22.34 GB | 18.19 GB |
| switch | 23.3 | 23.4 | 22.83 GB | 19.68 GB |
| composite | 76.3 | 262.2 | 22.83 GB | 19.69 GB |
| cmlora | 77.1 | 261.5 | 22.83 GB | 19.69 GB |
| spatial- LoRASpace | 34.6 | 48.0 | 15.60 to 16.80 GB | 6.46 GB |
| temporal- LoRASpace | 32.9 | 42.7 | 15.60 to 16.80 GB | 6.46 GB |
| Method | Time @ (s) | Time @ (s) | Peak VRAM | Load VRAM |
|---|---|---|---|---|
| merge | 18.9 | 32.7 | 3.49 GB | 2.88 GB |
| switch | 17.5 | 22.0 | 3.49 GB | 2.88 GB |
| composite | 68.2 | 142.6 | 3.49 GB | 2.89 GB |
| cmlora | 59.5 | 138.5 | 3.49 GB | 2.89 GB |
| spatial- LoRASpace | 37.6 | 30.7 | 4.09 GB | 2.88 GB |
| temporal- LoRASpace | 28.7 | 44.3 | 4.09 GB | 2.88 GB |
| Condition | Backbone passes | Adapter path | Median s/image |
|---|---|---|---|
| composite | none (per-pass guidance) | ||
| Ambient single-pass | thin factor pairs | ||
| LoRASpace | shared subspace (Eq. ( 5 )) |
| Pool | Setting | CLIP-T | ImageReward | DINO (vs. comp.) |
|---|---|---|---|---|
| Pool A SD 1.5 | mean to , 240 combos | 35.81 | 1.14 | 0.73 |
| Pool C SDXL | mean to , 200 combos | 32.10 | 1.15 | 0.79 |
| Pool B SD 1.5 | , 48 combos | 36.43 | 1.23 | 0.69 |
| Pool B SD 1.5 | , 48 combos | 36.10 | 1.10 | 0.65 |
| LoRA-Retriever | Macro Task / samp.s -1 | Macro Task at samp.s -1 | ||
| Method | Macro Task | Macro Domain | samp/s |
|---|---|---|---|
| base (no LoRA) | 4.24 | 4.17 | 0.60 |
| oracle (task-matched) | 57.54 | 59.55 | 1.91 |
| merge (Task Arithmetic) | 45.72 | 46.96 | 2.18 |
| ties | 48.71 | 51.39 | 1.93 |
| dare | 40.86 | 41.22 | 2.04 |
| knots | 45.44 | 47.01 | 0.31 |
| ID | Name | Trigger words |
| character | ||
| character_1 | Real-person likeness LoRA | identity trigger and appearance descriptors (omitted) |
| character_2 | Real-person likeness LoRA | identity trigger and appearance descriptors (omitted) |
| character_3 | Real-person likeness LoRA | identity trigger and appearance descriptors (omitted) |
| clothing | ||
| clothing_1 | Thai University Uniform | mahalaiuniform, white shirt short sleeves, black pencil skirt |
| ID | Name | Trigger words |
| detail (quality enhancers, no explicit trigger) | ||
| detail_1 | Detail Tweaker | (none) |
| detail_2 | Add More Details | (none) |
| pose | ||
| pose_1 | Shirt Tug Pose | shirt tug |
| pose_2 | Covering Eyes Pose | covering eyes |
| ID | Name | Trigger words |
| character | ||
| character_1 | SL Nobodies CamelliaXL | CamelliaXL, a young woman, detailed face |
| character_2 | SL Nobodies HelenaXL | HelenaXL, a young woman, detailed face |
| character_3 | SL Nobodies VioletXL | VioletXL, a young woman, detailed face |
| background | ||
| background_1 | Polyhedron Catwalk | catwalk, runway, fashion show |
| Domain (count) | Tasks |
|---|---|
| closed-book QA (4) | arc_challenge , arc_easy , natural_questions , trivia_qa |
| commonsense (4) | copa , hellaswag , piqa , story_cloze |
| coreference (2) | definite_pronoun_resolution , wsc |
| NLI (10) | anli_r1 , anli_r2 , anli_r3 , cb , mnli_matched , mnli_mismatched , qnli , rte , snli , wnli |
| paraphrase (4) | glue_mrpc , glue_qqp , paws_wiki , stsb |
| RC w/ commonsense (2) | cosmos_qa , record |
Low-Rank Adaptation
Low-rank adaptation (LoRA) fine-tunes pretrained models with compact weight updates, reducing trainable parameters and deployment costs.
See all 538 papers