SKILL.md
SKILL.mdBrowse 3 files
3,417 tokens
11,997 bytes
Token encoding: o200k_base
Snapshot 24fd22b
1---2name: peft3description: Fine-tune large LLMs with LoRA on limited GPU memory.4version: 1.0.05author: Orchestra Research6license: MIT7dependencies: [peft>=0.13.0, transformers>=4.45.0, torch>=2.0.0, bitsandbytes>=0.43.0]8platforms: [linux, macos, windows]9metadata:10 hermes:11 tags: [Fine-Tuning, PEFT, LoRA, QLoRA, Parameter-Efficient, Adapters, Low-Rank, Memory Optimization, Multi-Adapter]12 13---14 15# PEFT (Parameter-Efficient Fine-Tuning)16 17Fine-tune LLMs by training <1% of parameters using LoRA, QLoRA, and 25+ adapter methods.18 19## When to use PEFT20 21**Use PEFT/LoRA when:**22- Fine-tuning 7B-70B models on consumer GPUs (RTX 4090, A100)23- Need to train <1% parameters (6MB adapters vs 14GB full model)24- Want fast iteration with multiple task-specific adapters25- Deploying multiple fine-tuned variants from one base model26 27**Use QLoRA (PEFT + quantization) when:**28- Fine-tuning 70B models on single 24GB GPU29- Memory is the primary constraint30- Can accept ~5% quality trade-off vs full fine-tuning31 32**Use full fine-tuning instead when:**33- Training small models (<1B parameters)34- Need maximum quality and have compute budget35- Significant domain shift requires updating all weights36 37## Quick start38 39### Installation40 41```bash42# Basic installation43pip install peft44 45# With quantization support (recommended)46pip install peft bitsandbytes47 48# Full stack49pip install peft transformers accelerate bitsandbytes datasets50```51 52### LoRA fine-tuning (standard)53 54```python55from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer56from peft import get_peft_model, LoraConfig, TaskType57from datasets import load_dataset58 59# Load base model60model_name = "meta-llama/Llama-3.1-8B"61model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype="auto", device_map="auto")62tokenizer = AutoTokenizer.from_pretrained(model_name)63tokenizer.pad_token = tokenizer.eos_token64 65# LoRA configuration66lora_config = LoraConfig(67 task_type=TaskType.CAUSAL_LM,68 r=16, # Rank (8-64, higher = more capacity)69 lora_alpha=32, # Scaling factor (typically 2*r)70 lora_dropout=0.05, # Dropout for regularization71 target_modules=["q_proj", "v_proj", "k_proj", "o_proj"], # Attention layers72 bias="none" # Don't train biases73)74 75# Apply LoRA76model = get_peft_model(model, lora_config)77model.print_trainable_parameters()78# Output: trainable params: 13,631,488 || all params: 8,043,307,008 || trainable%: 0.17%79 80# Prepare dataset81dataset = load_dataset("databricks/databricks-dolly-15k", split="train")82 83def tokenize(example):84 text = f"### Instruction:\n{example['instruction']}\n\n### Response:\n{example['response']}"85 return tokenizer(text, truncation=True, max_length=512, padding="max_length")86 87tokenized = dataset.map(tokenize, remove_columns=dataset.column_names)88 89# Training90training_args = TrainingArguments(91 output_dir="./lora-llama",92 num_train_epochs=3,93 per_device_train_batch_size=4,94 gradient_accumulation_steps=4,95 learning_rate=2e-4,96 fp16=True,97 logging_steps=10,98 save_strategy="epoch"99)100 101trainer = Trainer(102 model=model,103 args=training_args,104 train_dataset=tokenized,105 data_collator=lambda data: {"input_ids": torch.stack([f["input_ids"] for f in data]),106 "attention_mask": torch.stack([f["attention_mask"] for f in data]),107 "labels": torch.stack([f["input_ids"] for f in data])}108)109 110trainer.train()111 112# Save adapter only (6MB vs 16GB)113model.save_pretrained("./lora-llama-adapter")114```115 116### QLoRA fine-tuning (memory-efficient)117 118```python119from transformers import AutoModelForCausalLM, BitsAndBytesConfig120from peft import get_peft_model, LoraConfig, prepare_model_for_kbit_training121 122# 4-bit quantization config123bnb_config = BitsAndBytesConfig(124 load_in_4bit=True,125 bnb_4bit_quant_type="nf4", # NormalFloat4 (best for LLMs)126 bnb_4bit_compute_dtype="bfloat16", # Compute in bf16127 bnb_4bit_use_double_quant=True # Nested quantization128)129 130# Load quantized model131model = AutoModelForCausalLM.from_pretrained(132 "meta-llama/Llama-3.1-70B",133 quantization_config=bnb_config,134 device_map="auto"135)136 137# Prepare for training (enables gradient checkpointing)138model = prepare_model_for_kbit_training(model)139 140# LoRA config for QLoRA141lora_config = LoraConfig(142 r=64, # Higher rank for 70B143 lora_alpha=128,144 lora_dropout=0.1,145 target_modules=["q_proj", "v_proj", "k_proj", "o_proj", "gate_proj", "up_proj", "down_proj"],146 bias="none",147 task_type="CAUSAL_LM"148)149 150model = get_peft_model(model, lora_config)151# 70B model now fits on single 24GB GPU!152```153 154## LoRA parameter selection155 156### Rank (r) - capacity vs efficiency157 158| Rank | Trainable Params | Memory | Quality | Use Case |159|------|-----------------|--------|---------|----------|160| 4 | ~3M | Minimal | Lower | Simple tasks, prototyping |161| **8** | ~7M | Low | Good | **Recommended starting point** |162| **16** | ~14M | Medium | Better | **General fine-tuning** |163| 32 | ~27M | Higher | High | Complex tasks |164| 64 | ~54M | High | Highest | Domain adaptation, 70B models |165 166### Alpha (lora_alpha) - scaling factor167 168```python169# Rule of thumb: alpha = 2 * rank170LoraConfig(r=16, lora_alpha=32) # Standard171LoraConfig(r=16, lora_alpha=16) # Conservative (lower learning rate effect)172LoraConfig(r=16, lora_alpha=64) # Aggressive (higher learning rate effect)173```174 175### Target modules by architecture176 177```python178# Llama / Mistral / Qwen179target_modules = ["q_proj", "v_proj", "k_proj", "o_proj", "gate_proj", "up_proj", "down_proj"]180 181# GPT-2 / GPT-Neo182target_modules = ["c_attn", "c_proj", "c_fc"]183 184# Falcon185target_modules = ["query_key_value", "dense", "dense_h_to_4h", "dense_4h_to_h"]186 187# BLOOM188target_modules = ["query_key_value", "dense", "dense_h_to_4h", "dense_4h_to_h"]189 190# Auto-detect all linear layers191target_modules = "all-linear" # PEFT 0.6.0+192```193 194## Loading and merging adapters195 196### Load trained adapter197 198```python199from peft import PeftModel, AutoPeftModelForCausalLM200from transformers import AutoModelForCausalLM201 202# Option 1: Load with PeftModel203base_model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.1-8B")204model = PeftModel.from_pretrained(base_model, "./lora-llama-adapter")205 206# Option 2: Load directly (recommended)207model = AutoPeftModelForCausalLM.from_pretrained(208 "./lora-llama-adapter",209 device_map="auto"210)211```212 213### Merge adapter into base model214 215```python216# Merge for deployment (no adapter overhead)217merged_model = model.merge_and_unload()218 219# Save merged model220merged_model.save_pretrained("./llama-merged")221tokenizer.save_pretrained("./llama-merged")222 223# Push to Hub224merged_model.push_to_hub("username/llama-finetuned")225```226 227### Multi-adapter serving228 229```python230from peft import PeftModel231 232# Load base with first adapter233model = AutoPeftModelForCausalLM.from_pretrained("./adapter-task1")234 235# Load additional adapters236model.load_adapter("./adapter-task2", adapter_name="task2")237model.load_adapter("./adapter-task3", adapter_name="task3")238 239# Switch between adapters at runtime240model.set_adapter("task1") # Use task1 adapter241output1 = model.generate(**inputs)242 243model.set_adapter("task2") # Switch to task2244output2 = model.generate(**inputs)245 246# Disable adapters (use base model)247with model.disable_adapter():248 base_output = model.generate(**inputs)249```250 251## PEFT methods comparison252 253| Method | Trainable % | Memory | Speed | Best For |254|--------|------------|--------|-------|----------|255| **LoRA** | 0.1-1% | Low | Fast | General fine-tuning |256| **QLoRA** | 0.1-1% | Very Low | Medium | Memory-constrained |257| AdaLoRA | 0.1-1% | Low | Medium | Automatic rank selection |258| IA3 | 0.01% | Minimal | Fastest | Few-shot adaptation |259| Prefix Tuning | 0.1% | Low | Medium | Generation control |260| Prompt Tuning | 0.001% | Minimal | Fast | Simple task adaptation |261| P-Tuning v2 | 0.1% | Low | Medium | NLU tasks |262 263### IA3 (minimal parameters)264 265```python266from peft import IA3Config267 268ia3_config = IA3Config(269 target_modules=["q_proj", "v_proj", "k_proj", "down_proj"],270 feedforward_modules=["down_proj"]271)272model = get_peft_model(model, ia3_config)273# Trains only 0.01% of parameters!274```275 276### Prefix Tuning277 278```python279from peft import PrefixTuningConfig280 281prefix_config = PrefixTuningConfig(282 task_type="CAUSAL_LM",283 num_virtual_tokens=20, # Prepended tokens284 prefix_projection=True # Use MLP projection285)286model = get_peft_model(model, prefix_config)287```288 289## Integration patterns290 291### With TRL (SFTTrainer)292 293```python294from trl import SFTTrainer, SFTConfig295from peft import LoraConfig296 297lora_config = LoraConfig(r=16, lora_alpha=32, target_modules="all-linear")298 299trainer = SFTTrainer(300 model=model,301 args=SFTConfig(output_dir="./output", max_seq_length=512),302 train_dataset=dataset,303 peft_config=lora_config, # Pass LoRA config directly304)305trainer.train()306```307 308### With Axolotl (YAML config)309 310```yaml311# axolotl config.yaml312adapter: lora313lora_r: 16314lora_alpha: 32315lora_dropout: 0.05316lora_target_modules:317 - q_proj318 - v_proj319 - k_proj320 - o_proj321lora_target_linear: true # Target all linear layers322```323 324### With vLLM (inference)325 326```python327from vllm import LLM328from vllm.lora.request import LoRARequest329 330# Load base model with LoRA support331llm = LLM(model="meta-llama/Llama-3.1-8B", enable_lora=True)332 333# Serve with adapter334outputs = llm.generate(335 prompts,336 lora_request=LoRARequest("adapter1", 1, "./lora-adapter")337)338```339 340## Performance benchmarks341 342### Memory usage (Llama 3.1 8B)343 344| Method | GPU Memory | Trainable Params |345|--------|-----------|------------------|346| Full fine-tuning | 60+ GB | 8B (100%) |347| LoRA r=16 | 18 GB | 14M (0.17%) |348| QLoRA r=16 | 6 GB | 14M (0.17%) |349| IA3 | 16 GB | 800K (0.01%) |350 351### Training speed (A100 80GB)352 353| Method | Tokens/sec | vs Full FT |354|--------|-----------|------------|355| Full FT | 2,500 | 1x |356| LoRA | 3,200 | 1.3x |357| QLoRA | 2,100 | 0.84x |358 359### Quality (MMLU benchmark)360 361| Model | Full FT | LoRA | QLoRA |362|-------|---------|------|-------|363| Llama 2-7B | 45.3 | 44.8 | 44.1 |364| Llama 2-13B | 54.8 | 54.2 | 53.5 |365 366## Common issues367 368### CUDA OOM during training369 370```python371# Solution 1: Enable gradient checkpointing372model.gradient_checkpointing_enable()373 374# Solution 2: Reduce batch size + increase accumulation375TrainingArguments(376 per_device_train_batch_size=1,377 gradient_accumulation_steps=16378)379 380# Solution 3: Use QLoRA381from transformers import BitsAndBytesConfig382bnb_config = BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_quant_type="nf4")383```384 385### Adapter not applying386 387```python388# Verify adapter is active389print(model.active_adapters) # Should show adapter name390 391# Check trainable parameters392model.print_trainable_parameters()393 394# Ensure model in training mode395model.train()396```397 398### Quality degradation399 400```python401# Increase rank402LoraConfig(r=32, lora_alpha=64)403 404# Target more modules405target_modules = "all-linear"406 407# Use more training data and epochs408TrainingArguments(num_train_epochs=5)409 410# Lower learning rate411TrainingArguments(learning_rate=1e-4)412```413 414## Best practices415 4161. **Start with r=8-16**, increase if quality insufficient4172. **Use alpha = 2 * rank** as starting point4183. **Target attention + MLP layers** for best quality/efficiency4194. **Enable gradient checkpointing** for memory savings4205. **Save adapters frequently** (small files, easy rollback)4216. **Evaluate on held-out data** before merging4227. **Use QLoRA for 70B+ models** on consumer hardware423 424## References425 426- **[Advanced Usage](references/advanced-usage.md)** - DoRA, LoftQ, rank stabilization, custom modules427- **[Troubleshooting](references/troubleshooting.md)** - Common errors, debugging, optimization428 429## Resources430 431- **GitHub**: https://github.com/huggingface/peft432- **Docs**: https://huggingface.co/docs/peft433- **LoRA Paper**: arXiv:2106.09685434- **QLoRA Paper**: arXiv:2305.14314435- **Models**: https://huggingface.co/models?library=peft436 Discovery context
Discovered by repository scan. No exact path reference found in the snapshot’s root AGENTS.md.