QLoRA
Kunna finjustera en kvantiserad basmodell med LoRA-adaptrar på begränsad GPU och jämföra med full LoRA.
Förkunskaper
- FKvantiseringkrävs
- FLoRA — Low-Rank Adaptationkrävs
Intuition
QLoRA = frys basmodellen i 4 bitar och träna LoRA-adaptrar i bf16 ovanpå. Gradienterna backpropageras genom den kvantiserade basen, men bara adaptrarna uppdateras.
Resultat: en 7B-modell finjusteras på ~6 GB, en 65B på ett enda 48 GB-kort.
Tre tekniska bitar som gör det möjligt:
- NF4 (4-bit NormalFloat) — ett kvantiseringsformat vars nivåer är informationsteoretiskt optimala för normalfördelade vikter, vilket neuronnätsvikter ungefär är.
- Dubbelkvantisering — kvantiseringskonstanterna kvantiseras också. Sparar ~0,4 bit per parameter.
- Paged optimizers — optimizer-tillstånd flyttas till CPU-minne vid toppar, så träningen inte kraschar på tillfälliga minnesspikar.
Pappret visar att QLoRA matchar 16-bitars full finjustering på deras uppgifter.
Kod
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training
bnb = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4", # NF4, inte vanlig int4
bnb_4bit_use_double_quant=True, # dubbelkvantisering
bnb_4bit_compute_dtype=torch.bfloat16, # beräkningar i bf16
)
m = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-7B", quantization_config=bnb, device_map="auto")
m = prepare_model_for_kbit_training(m, use_gradient_checkpointing=True)
m = get_peft_model(m, LoraConfig(r=16, lora_alpha=32, lora_dropout=0.05, task_type="CAUSAL_LM",
target_modules=["q_proj","k_proj","v_proj","o_proj","gate_proj","up_proj","down_proj"]))
opt = torch.optim.AdamW(m.parameters(), lr=2e-4) # högre lr än full finjustering
Minnesjämförelse för 7B:
| Metod | Bas | Gradienter + optimizer | Totalt (ca) |
|---|---|---|---|
| Full bf16 | 14 GB | 70 GB | 84 GB |
| LoRA bf16 | 14 GB | 0,5 GB | 15 GB |
| QLoRA nf4 | 3,5 GB | 0,5 GB | 6 GB |
Priset: träningen blir 20–40 % långsammare per steg (av- och återkvantisering vid varje framåtpass), och adaptern hör till den kvantiserade basen — slår du ihop den med en fp16-bas får du en liten kvalitetsförlust. Kör utvärderingen i samma precision som du tänker servera i.
Behärskning innebär
- Finjusterar en 4-bit-kvantiserad basmodell med LoRA
- Förklarar NF4, dubbelkvantisering och paged optimizers
- Jämför QLoRA med LoRA i minne och kvalitet
Logga in för att göra övningarna och bygga upp din behärskning.
Källor
- arXiv — QLoRA: Efficient Finetuning of Quantized LLMs — arXiv (öppen åtkomst; licens per artikel)
- bitsandbytes (MIT) — MIT