Files
wehub-resource-sync caf324b09d
Build documentation / build (push) Failing after 0s
Deploy "method_comparison" Gradio to Spaces / deploy (push) Has been cancelled
Deploy "PEFT shop" Gradio app to Spaces / deploy (push) Has been cancelled
tests on transformers main / tests (push) Has been cancelled
tests / check_code_quality (push) Has been cancelled
tests / tests (ubuntu-latest, 3.10) (push) Has been cancelled
tests / tests (ubuntu-latest, 3.11) (push) Has been cancelled
tests / tests (ubuntu-latest, 3.12) (push) Has been cancelled
tests / tests (ubuntu-latest, 3.13) (push) Has been cancelled
tests / tests (windows-latest, 3.10) (push) Has been cancelled
tests / tests (windows-latest, 3.11) (push) Has been cancelled
tests / tests (windows-latest, 3.12) (push) Has been cancelled
tests / tests (windows-latest, 3.13) (push) Has been cancelled
Secret Leaks / trufflehog (push) Has been cancelled
CI security linting / zizmor latest via Cargo (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:24:42 +08:00

204 lines
6.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AdaMSS Fine-tuning
## Introduction
AdaMSS (Adaptive Matrix Decomposition with Subspace Selection) is a parameter-efficient fine-tuning method that decomposes weight matrices using SVD into low-rank subspaces. It uses only **~0.07%** of original trainable parameters (e.g., 59K for ViT-Base vs 86M full fine-tuning) while maintaining competitive performance.
The method optionally supports **ASA** (Adaptive Subspace Allocation) for dynamic subspace selection during training, further improving efficiency and performance.
See the [paper](https://neurips.cc/virtual/2025/poster/119606) for more details.
## Installation & Quick Test
Install from local source:
```bash
cd peft-main && pip install -e .
pip install transformers datasets torch torchvision evaluate accelerate scikit-learn
```
Verify installation:
```bash
python -c "from peft import AdamssConfig; print('AdaMSS ready')"
```
## Detailed Code Explanation
**Core AdaMSS Configuration:**
```python
from peft import AdamssConfig, get_peft_model
# Configure AdaMSS with ASA
config = AdamssConfig(
r=100, # SVD rank (full decomposition rank)
num_subspaces=10, # Number of subspaces (K) - initial capacity
subspace_rank=3, # Rank per subspace (ri) - use 1 for NLU, 3 for Vision
target_modules=["query", "value"], # Target attention layers
use_asa=True, # Enable Adaptive Subspace Allocation
asa_target_subspaces=5, # Target active subspaces (ASA reduces K→5)
init_warmup=50, # Start ASA after 50 steps
final_warmup=1000, # Complete masking by step 1000
mask_interval=100, # Update mask every 100 steps
modules_to_save=["classifier"], # Modules to train without decomposition
)
peft_model = get_peft_model(model, config)
```
**Option A With HuggingFace Trainer (callback):**
```python
from peft.tuners.adamss.asa_callback import AdamssAsaCallback
# The callback is a thin wrapper around model.update_and_allocate()
trainer = Trainer(
model=peft_model,
callbacks=[AdamssAsaCallback()],
# ... other arguments
)
trainer.train()
```
**Option B Custom training loop (no Trainer needed):**
```python
for step, batch in enumerate(dataloader):
loss = peft_model(**batch).loss
loss.backward()
optimizer.step()
peft_model.base_model.update_and_allocate(step) # ← all ASA logic in one call
optimizer.zero_grad()
```
**Key Points:**
- **Parameterization**: Total params = `r × (d_in + d_out)`, split into K subspaces of rank `ri` each
- **ASA Mechanism**: Dynamically selects `asa_target_subspaces` most important subspaces from initial `num_subspaces`
- **Warmup Schedule**: ASA gradually increases masking strength from `init_warmup` to `final_warmup`
- **Vision vs NLU**: Use `subspace_rank=3` for vision, `subspace_rank=1` for NLU tasks
## Use the training example scripts
### Vision Tasks (Image Classification)
Run the provided script with your configuration:
```bash
python examples/adamss_finetuning/image_classification_adamss_asa.py \
--model_name_or_path google/vit-base-patch16-224-in21k \
--dataset_name cifar10 \
--adamss_r 100 \
--adamss_k 10 \
--adamss_ri 3 \
--use_asa \
--asa_target_subspaces 5 \
--output_dir ./output
```
### NLU Tasks (GLUE Benchmark)
Run GLUE tasks (e.g., CoLA) with ASA:
```bash
python examples/adamss_finetuning/glue_adamss_asa_example.py \
--dataset_name cola \
--adamss_r 100 \
--adamss_k 10 \
--adamss_ri 1 \
--use_asa \
--asa_target_subspaces 5 \
--num_epochs 100 \
--batch_size 32 \
--output_dir ./output_cola_asa
```
Without ASA (fixed K=10):
```bash
python examples/adamss_finetuning/glue_adamss_asa_example.py \
--dataset_name cola \
--adamss_r 100 \
--adamss_k 10 \
--adamss_ri 1 \
--num_epochs 100 \
--batch_size 32 \
--output_dir ./output_cola_no_asa
```
### AdamssConfig Parameters
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `r` | int | 100 | SVD decomposition rank |
| `num_subspaces` | int | 10 | Number of subspaces (K) |
| `subspace_rank` | int | 3 | Rank per subspace (ri) |
| `target_modules` | list | - | Modules to apply AdaMSS (e.g., ["query", "value"]) |
| `use_asa` | bool | False | Enable Adaptive Subspace Allocation |
| `asa_target_subspaces` | int | None | Target active subspaces when ASA enabled |
| `modules_to_save` | list | None | Modules to train without decomposition |
### AdamssAsaCallback
The ASA callback reads all parameters from `AdamssConfig`. Import it directly:
```python
from peft.tuners.adamss.asa_callback import AdamssAsaCallback
```
ASA-related config parameters:
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `init_warmup` | int | 50 | Steps before starting masking |
| `final_warmup` | int | 1000 | Steps to reach target active subspaces |
| `mask_interval` | int | 100 | Steps between subspace selection updates |
| `asa_importance_beta` | float | 0.85 | EMA decay for importance tracking |
| `asa_uncertainty_beta` | float | 0.85 | EMA decay for uncertainty tracking |
| `asa_schedule_exponent` | float | 3.0 | Exponent for masking schedule |
## Experimental Results
### NLU Tasks (GLUE Benchmark)
Results with AdaMSS + ASA (100 epochs, seed=0):
| Task | Model | AdaMSS Params | Metric | Score |
|------|-------|---------------|--------|-------|
| CoLA | RoBERTa-base | 27.0K (ASA K→5) | Matthews | **0.6466** |
| CoLA | RoBERTa-large | 64.8K (ASA K→5) | Matthews | **0.7093** |
| MRPC | RoBERTa-base | 27.2K (ASA K→5) | Accuracy | **0.8824** |
| MRPC | RoBERTa-large | 66.7K (ASA K→5) | Accuracy | **0.9044** |
**Notes:**
- Configuration: r=100, K=10→5 (ASA), ri=1
- AdaMSS active params with ASA (5 out of 10 subspaces selected)
- Full AdaMSS capacity: 97K (large) / 42K (base)
- Training: 100 epochs, batch_size=32, warmup_ratio=0.06
### Vision Tasks (Image Classification)
Results with AdaMSS on Stanford Cars (10 epochs, seed=0):
| Model | Method | AdaMSS Params | Test Accuracy |
|-------|--------|---------------|---------------|
| ViT-Base | AdaMSS (no ASA) | 121K (K=10) | **82.15%** |
| ViT-Base | AdaMSS + ASA | 75.0K (K→5) | **80.45%** |
**Notes:**
- Configuration: r=100, K=10, ri=3, 10 epochs, batch_size=32
- ASA dynamically selects 5 out of 10 subspaces (75K active from 121K total)
## Citation
If you use AdaMSS in your research, please cite:
```bibtex
@inproceedings{zheng2025adamss,
title={AdaMSS: Adaptive Multi-Subspace Approach for Parameter-Efficient Fine-Tuning},
author={Zheng, Jingjing and Lu, Wanglong and Dong, Yiming and Ji, Chaojie and Cao, Yankai and Lin, Zhouchen},
booktitle={The Thirty-ninth Annual Conference on Neural Information Processing Systems},
year={2025},
}
```
## Reference
- [AdaMSS Paper](https://neurips.cc/virtual/2025/loc/san-diego/poster/119606)
- [PEFT Documentation](https://huggingface.co/docs/peft)