Upload README.md with huggingface_hub
Browse files
README.md
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Cross-Model LoRA Adapter Prediction
|
| 2 |
+
|
| 3 |
+
Zero-shot prediction of a LoRA adapter for **Model Y on a held-out task D**, using only:
|
| 4 |
+
- 4 LoRAs trained on Model **X** (X_A, X_B, X_C, X_D)
|
| 5 |
+
- 3 LoRAs trained on Model **Y** (Y_A, Y_B, Y_C — Y_D never trained for the prediction)
|
| 6 |
+
|
| 7 |
+
A small mapping `f` is learned from the 3 paired anchor adapters
|
| 8 |
+
`(X_A↔Y_A, X_B↔Y_B, X_C↔Y_C)` and applied to `X_D` to predict `Ŷ_D = f(X_D)`.
|
| 9 |
+
|
| 10 |
+
Inspired by Sakana AI's **Text-to-LoRA** hypernetwork (arXiv 2506.06105) and related cross-base-model
|
| 11 |
+
adapter transfer work (Trans-LoRA, arXiv 2405.17258). T2L uses a *text*-conditioned hypernetwork to
|
| 12 |
+
generate LoRA weights; here we replace the text condition with the *paired adapter on another model*
|
| 13 |
+
and use a closed-form anchor-basis ridge regression instead of a neural hypernetwork (because we only
|
| 14 |
+
have 3 anchor pairs).
|
| 15 |
+
|
| 16 |
+
## Setup
|
| 17 |
+
|
| 18 |
+
| | |
|
| 19 |
+
|---|---|
|
| 20 |
+
| Model X | `Qwen/Qwen2.5-0.5B-Instruct` (hidden=896, 24 layers) |
|
| 21 |
+
| Model Y | `meta-llama/Llama-3.2-1B-Instruct` (hidden=2048, 16 layers) |
|
| 22 |
+
| LoRA | r=8, α=16, target modules = q_proj, v_proj |
|
| 23 |
+
| Tasks | A=SST-2, B=AG News, C=SetFit/subj, D=dair-ai/emotion (held out for Y in the prediction setup; Y_D is also trained as an oracle for comparison only) |
|
| 24 |
+
| Train per task | 1500 SFT examples, 1 epoch, bs=8, lr=2e-4, bf16 |
|
| 25 |
+
| Eval | 400 examples, greedy generation, label-prefix matching |
|
| 26 |
+
|
| 27 |
+
## Mapping function `f`
|
| 28 |
+
|
| 29 |
+
Adapters are flattened to vectors. We have only **3 paired samples**, so a full per-parameter linear
|
| 30 |
+
map (`Y_dim × X_dim` ≈ 460M params) is hopelessly under-determined. Instead we use the closed-form
|
| 31 |
+
**anchor-basis ridge mapping**:
|
| 32 |
+
|
| 33 |
+
1. Center: `X_c[i] = X_i − mean(X)`, `Y_c[i] = Y_i − mean(Y)` for `i ∈ {A,B,C}`.
|
| 34 |
+
2. Solve `(X_cᵀX_c + λI) α = X_cᵀ (X_D − mean(X))` → 3-dim coefficients α (3×3 system).
|
| 35 |
+
3. Predict `Ŷ_D = mean(Y) + α · Y_c`.
|
| 36 |
+
|
| 37 |
+
This expresses the predicted Y-adapter as `mean(Y) + linear combination of Y-side anchor offsets`,
|
| 38 |
+
where the combination weights are picked to best reproduce `X_D − mean(X)` from the X-side anchor
|
| 39 |
+
offsets. Equivalent to fitting a linear map restricted to the 3-dim subspace spanned by the centred
|
| 40 |
+
X-anchors. Ridge λ = 1e-3.
|
| 41 |
+
|
| 42 |
+
## Results — Accuracy on task D (Emotion, 400 eval examples)
|
| 43 |
+
|
| 44 |
+
| Setting | Accuracy |
|
| 45 |
+
|---|---:|
|
| 46 |
+
| base Model Y (no adapter) | 0.308 |
|
| 47 |
+
| Y + Y_A (wrong-task adapter) | 0.510 |
|
| 48 |
+
| Y + Y_B (wrong-task adapter) | 0.538 |
|
| 49 |
+
| Y + Y_C (wrong-task adapter) | 0.470 |
|
| 50 |
+
| Y + **mean(Y_A,Y_B,Y_C)** baseline | 0.505 |
|
| 51 |
+
| Y + **Ŷ_D = f(X_D)** ← predicted, never trained on D for Y | **0.520** |
|
| 52 |
+
| Y + Y_D (oracle, actually trained on D) | 0.665 |
|
| 53 |
+
| base Model X (no adapter) | 0.285 |
|
| 54 |
+
| X + X_D (oracle on Model X) | 0.608 |
|
| 55 |
+
|
| 56 |
+
**Cosine similarity of full adapter vectors to the oracle Y_D:**
|
| 57 |
+
|
| 58 |
+
| | cos to Y_D |
|
| 59 |
+
|---|---:|
|
| 60 |
+
| Y_A | 0.947 |
|
| 61 |
+
| Y_B | 0.927 |
|
| 62 |
+
| Y_C | 0.942 |
|
| 63 |
+
| mean(Y_A,Y_B,Y_C) | 0.957 |
|
| 64 |
+
| **Ŷ_D = f(X_D)** | **0.951** |
|
| 65 |
+
|
| 66 |
+
α coefficients on (A,B,C): `[-0.429, -0.009, 0.119]` (so the prediction is dominated by `mean(Y)`
|
| 67 |
+
plus a small negative pull away from the SST-2 anchor).
|
| 68 |
+
|
| 69 |
+
## Verdict
|
| 70 |
+
|
| 71 |
+
The predicted adapter:
|
| 72 |
+
- **Works**: jumps from 0.308 (no adapter) to 0.520 (predicted), recovering ~59% of the gap to the
|
| 73 |
+
fully-trained oracle (0.665).
|
| 74 |
+
- **Marginally beats** the naive "mean of known Y-adapters" baseline (0.520 vs 0.505, +1.5 pts).
|
| 75 |
+
- Is essentially a near-mean of the anchors in adapter space (cos≈0.95), which is what one should
|
| 76 |
+
expect with only 3 anchor pairs and a hugely over-parameterised target. Ridge regularization
|
| 77 |
+
collapses most of the prediction toward the anchor mean.
|
| 78 |
+
|
| 79 |
+
**Implication.** Your zero-shot cross-model adapter prediction idea is *directionally validated*:
|
| 80 |
+
information from `X_D` is being transferred and improves over the mean baseline. To make the
|
| 81 |
+
prediction substantially better than "average your known Y adapters", you need either (a) many more
|
| 82 |
+
paired anchors so a real hypernetwork (à la T2L) can learn the X→Y map, or (b) structural priors
|
| 83 |
+
exploiting the LoRA factorisation per layer (e.g. Procrustes per matrix, or shared low-rank basis
|
| 84 |
+
across tasks).
|
| 85 |
+
|
| 86 |
+
## Files in this repo
|
| 87 |
+
|
| 88 |
+
```
|
| 89 |
+
X/X_A,X_B,X_C,X_D/ # PEFT LoRA adapters trained on Qwen2.5-0.5B-Instruct
|
| 90 |
+
Y/Y_A,Y_B,Y_C,Y_D/ # PEFT LoRA adapters trained on Llama-3.2-1B-Instruct
|
| 91 |
+
Y/Y_pred_D/ # PREDICTED adapter Ŷ_D = f(X_D), drop-in PEFT adapter for Y
|
| 92 |
+
Y/Y_mean_ABC/ # Mean-of-anchors baseline adapter
|
| 93 |
+
results.json # Final accuracies
|
| 94 |
+
mapping_diagnostics.json # alpha coefficients, cosine sims, dims
|
| 95 |
+
pipeline.py # End-to-end training/mapping/eval script
|
| 96 |
+
run.log # Full training log
|
| 97 |
+
```
|
| 98 |
+
|
| 99 |
+
## Reproduce
|
| 100 |
+
|
| 101 |
+
```bash
|
| 102 |
+
pip install torch transformers==4.46.3 peft==0.13.2 trl==0.12.1 datasets==3.1.0 accelerate==1.1.1
|
| 103 |
+
python pipeline.py --stage all # ~10 min on a single A10G
|
| 104 |
+
```
|
| 105 |
+
|
| 106 |
+
## Use the predicted adapter
|
| 107 |
+
|
| 108 |
+
```python
|
| 109 |
+
from transformers import AutoModelForCausalLM, AutoTokenizer
|
| 110 |
+
from peft import PeftModel
|
| 111 |
+
import torch
|
| 112 |
+
base = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.2-1B-Instruct", torch_dtype=torch.bfloat16)
|
| 113 |
+
tok = AutoTokenizer.from_pretrained("meta-llama/Llama-3.2-1B-Instruct")
|
| 114 |
+
model = PeftModel.from_pretrained(base, "Samarth0710/cross-model-lora-prediction", subfolder="Y/Y_pred_D")
|
| 115 |
+
```
|
| 116 |
+
|
| 117 |
+
## References
|
| 118 |
+
- Sakana AI, *Text-to-LoRA: Instant Transformer Adaptation* — arXiv 2506.06105
|
| 119 |
+
- *Trans-LoRA: Towards Data-Free Transferable Parameter-Efficient Finetuning* — arXiv 2405.17258
|