list_altİçindekilerexpand_more
- 01Full fine-tuning sorunu
- 02PEFT neden ortaya çıktı?
- 03LoRA: düşük kerteli adaptasyon
- 04Matematiksel temel
- 05Hangi katmanlar adaptörlenir?
- 06Rank ve alpha hiperparametreleri
- 07QLoRA: LoRA artı kuantizasyon
- 08DoRA ve güncel varyantlar
- 09Adapter katmanları
- 10Prefix ve prompt tuning
- 11Yöntem karşılaştırması
- 12HuggingFace PEFT kütüphanesi
- 13Hangi yöntemi seçmeli?
LLM’leri kendi verilerinize uyarlamak istediğinizde, tam ince ayar (full fine-tuning) teknik olarak mümkün ama pratikte ulaşılması güç bir seçenek. 7B parametreli bir model için bile onlarca GB VRAM ve saatler süren eğitim gerekli. Peki modelin tüm ağırlıklarını güncellemeniz zorunlu mu? PEFT bu soruya hayır diyor.
Full fine-tuning sorunu
GPT-4 ölçeğinde bir modelin tam ince ayarını düşünelim: ağırlıkların kopyası, gradyanlar, optimizasyon durumu (Adam momentum) birlikte hesaba katıldığında tek bir geçiş için birkaç terabayt bellek gerekir. Finansal boyuta baktığınızda günlük binlerce dolar A100 kiralama maliyeti çıkıyor.
Daha mütevazı 7B parametreli bir model de sorun çıkarıyor. BF16 formatında yalnızca ağırlıklar 14 GB tutuyor. Buna gradyanları (14 GB), Adam optimizer durumunu (28 GB) ekleyin: eğitim için yaklaşık 56 GB VRAM. 24 GB’lık tüketici grafik kartı bu yükü kaldıramıyor.
Çok görevli sistemlerde her görev için ayrı model kopyası tutmak depolama ve servis maliyetlerini katlar. Yavaş ağ ortamlarında modelin tam kopyasını her seferinde aktarmak da gerçekçi değil.
PEFT’in temel iddiası şu: büyük dil modellerinin yeni görevlere uyum kapasitesi düşük boyutlu bir alt uzayda yoğunlaşıyor. Tüm milyarlarca parametreyi güncellemek yerine bu küçük alt uzayı hedeflemek, benzer doğruluk oranlarını çok daha az kaynakla elde etmek için yeterli.
PEFT neden ortaya çıktı?
Parametre-verimli ince ayar fikri 2019’da Adapter katmanlarıyla hayat buldu. Houlsby ve arkadaşları, transformer bloklarının içine küçük bottleneck modüller ekledi ve yalnızca bu modülleri eğitti. Orijinal model dondurulmuş kalıyordu; adaptör görev-özgü bilgiyi depoluyordu.
2021’de Li ve Liang, Prefix Tuning’i önerdi. Yaklaşım farklıydı: transformer’ın girişine eğitilebilir “önek” vektörler ekleniyor, model ağırlıkları hiç güncellenmiyor. Aynı yıl Lester ve arkadaşları benzer fikri yalnızca girişe uygulayan Prompt Tuning’i geliştirdi.
2022’de LoRA (Low-Rank Adaptation) yayımlandı ve bu alanın merkezine oturdu. Microsoft Research’ten Hu ve ekibi sağlam bir teorik temel oluşturdu: büyük pre-trained modellerin ağırlık matrislerindeki güncellemeler düşük bir “intrinsic rank”a sahip. Tam bir W matrisini güncellemek yerine W = W₀ + BA çarpımıyla çok daha küçük iki matris yeterli.
LoRA: düşük kerteli adaptasyon
LoRA, transformer’ın attention projeksiyonlarını dondurur ve bunların yanına küçük bir matris çifti ekler.
Matematiksel temel
Standart bir lineer katman h = W₀x işlemi yapıyor. LoRA bunu şöyle genişletiyor:
h = W₀x + BAx
W₀ orijinal dondurulmuş matris (d×d), A d×r, B ise r×d boyutunda eğitilebilir matrisler. Kritik nokta: r << d. d=4096, r=8 seçildiğinde eğitilen parametre sayısı 4096² = 16.7M yerine 2 × 4096 × 8 = 65.5K oluyor, yaklaşık 255 kat azalma.
Eğitim bittikten sonra B ve A’yı W₀’a entegre etmek mümkün (W' = W₀ + BA), böylece inference sırasında ekstra gecikme yaşanmıyor.
Hangi katmanlar adaptörlenir?
Orijinal LoRA makalesi yalnızca query (q_proj) ve value (v_proj) projeksiyonlarına adaptör uyguladı. Sonraki araştırmalar tüm attention projeksiyonlarını (q, k, v, o) hedeflemenin genellikle daha iyi sonuç verdiğini gösterdi. Bazı çalışmalar MLP katmanlarına da LoRA ekliyor, ancak bu getiri/maliyet oranını her zaman iyileştirmiyor.
Dil görevleri için attention’a yoğunlaşmak çoğu zaman yeterli; multimodal veya kod görevleri için MLP’leri dahil etmek düşünülebilir.
Rank ve alpha hiperparametreleri
r (rank), LoRA’nın en kritik hiperparametresi. Küçük r az parametre ama potansiyel bilgi kaybı; büyük r daha fazla esneklik ama artan maliyet.
| Rank | Eğitilebilir parametre (7B model) | Senaryo |
|---|---|---|
| r=4 | ~1.3M | Hızlı prototip, az veri |
| r=8 | ~2.6M | Genel amaçlı görevler |
| r=16 | ~5.2M | Karmaşık domain adaptation |
| r=64 | ~20.8M | Doğruluk öncelikli |
lora_alpha ölçekleme faktörü: güncellemeler (alpha/r) katsayısıyla uygulanır. Yaygın pratik alpha = 2r. Alpha/r oranını 1 civarında tutmak stabil eğitim veriyor.
QLoRA: LoRA artı kuantizasyon
Tim Dettmers ve ekibinin 2023’te yayımladığı QLoRA makalesi “tüketici donanımında 65B model eğitmek mümkün mü?” sorusunu sordu. Cevap evet oldu.
QLoRA üç yenilik getiriyor. Birincisi NF4 Kuantizasyonu: model ağırlıkları 16 bit yerine 4 bite sıkıştırılıyor. Rastgele kuantizasyon değil; parametrelerin normal dağılım gösterdiği varsayımından yola çıkılarak bilgi kaybını minimuma indiren NF4 formatı kullanılıyor. İkincisi Double Quantization: kuantizasyon sabitleri de ikinci bir kuantizasyon işlemine tabi tutularak model başına ek 0.37 bit tasarrufu elde ediliyor. Üçüncüsü Sayfalı Optimizer: bellek yetersiz kaldığında optimizer durumu CPU RAM’e taşınıyor, anlık bellek patlamalarından kaynaklanan OOM hataları bu yolla önleniyor.
Pratik sonuç: 65B modelin eğitimi 48 GB VRAM’e sıkışıyor. Doğruluk kaybı ise yayınlanan benchmark’larda tam 16-bit LoRA ile karşılaştırıldığında ihmal edilebilir seviyede kalıyor.
Kuantizasyon kavramını daha derinlemesine anlamak istiyorsanız model kuantizasyonu, INT4, GPTQ ve GGUF üzerine hazırladığımız rehbere bakabilirsiniz.
DoRA ve güncel varyantlar
LoRA’nın bir sınırlılığı var: ağırlık güncellemelerini büyüklük ve yön açısından aynı anda optimize etmesi zor. DoRA (Weight-Decomposed Low-Rank Adaptation) bu sorunu decomposition ile çözüyor.
DoRA ağırlık matrisini iki bileşene ayırıyor: büyüklük vektörü (m) ve yön matrisi (V). Formül: W = m · (V / ‖V‖). Büyüklük bileşeni tam parametre olarak güncellenir, yön bileşeni LoRA adaptörüyle güncellenir. Az parametre artışıyla ölçülebilir doğruluk kazanımı elde ediliyor.
LoftQ ise QLoRA’nın kuantizasyon hatasını azaltmaya odaklanan bir yaklaşım. Başlangıç noktası olarak kuantize edilmiş ağırlıklara en yakın düşük kerteli yaklaşımı kullanıyor; bu başlangıç iyileştirmesi özellikle agresif kuantizasyon (2-bit) senaryolarında fark yaratıyor.
Adapter katmanları
Houlsby ve arkadaşlarının 2019’daki çalışması PEFT’in öncüsü sayılıyor. Her transformer bloğunun içine iki bottleneck modül yerleştiriliyor: biri self-attention sonrasında, diğeri feed-forward sonrasında.
Yapı şöyle işliyor: giriş boyutu d’den r’ye düşük boyutlu bir projeksiyon, ardından aktivasyon fonksiyonu (ReLU veya GELU), ardından r’den d’ye çıkış projeksiyonu. Orijinal giriş ile modül çıkışı residual bağlantıyla toplanıyor.
Dezavantajı açık: modül transformer bloklarının içine seri olarak ekleniyor. Bu seri bağlantı sekans uzunluğu arttıkça inference gecikmesini olumsuz etkiliyor. LoRA ağırlıkları birleştirerek inference’ta sıfır gecikme ekliyor; bu yüzden production ortamlarında LoRA tercih ediliyor.
Prefix ve prompt tuning
Bu iki yaklaşım model mimarisini hiç değiştirmiyor: eğitilebilir gömme vektörleri model girişine ekleniyor.
Prefix Tuning’de her transformer katmanının key-value belleklerine eğitilebilir “önek” tensörler ekleniyor. Bu önek vektörler geri yayılım sırasında güncellenir, model ağırlıkları dondurulmuş kalır. Farklı görevler için farklı önek vektörleri yeterli; model kopyası birden fazla göreve aynı anda hizmet edebilir.
Prompt Tuning’de ise yalnızca girişe soft prompt embedding ekleniyor; transformer içlerine müdahale yok. Model büyüdükçe yaklaşımın performansı artıyor: 11B üzeri modellerde tam ince ayarla rekabet edebiliyor.
Her iki yöntem de küçük modellerde LoRA’nın gerisinde kalıyor. Büyük ölçek, çok sayıda görev, tek model kopyası kısıtı olan ortamlarda işe yarıyorlar.
Yöntem karşılaştırması
| Yöntem | Ek parametre | VRAM etkisi | Inference gecikme | En iyi senaryo |
|---|---|---|---|---|
| LoRA | ~0.1-1% | Düşük | Sıfır (birleştirme sonrası) | Genel amaçlı fine-tuning |
| QLoRA | ~0.1-1% + 4-bit quantize | Çok düşük | Minimal | Kısıtlı GPU, büyük model |
| DoRA | LoRA + büyüklük vektörü | Düşük | Sıfır | Yüksek doğruluk hedefi |
| Adapter | ~0.5-8% | Orta | Artar (seri bağlantı) | Çok görevli server |
| Prefix Tuning | Çok düşük | Neredeyse sıfır | Artar (uzun sekans) | Büyük model, çok görev |
| Prompt Tuning | Minimum | Neredeyse sıfır | Minimal | 11B+ model, çok görev |
Tablo kaba bir rehber; gerçek farklar model mimarisi, görev tipi ve veri miktarına göre değişiyor.
HuggingFace PEFT kütüphanesi
HuggingFace’in PEFT kütüphanesi tüm bu yöntemleri tek çatı altında topluyor. Kurulum:
pip install peft transformers accelerate bitsandbytes
LoRA için temel kullanım:
from peft import LoraConfig, get_peft_model
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("mistralai/Mistral-7B-v0.1")
config = LoraConfig(
r=16,
lora_alpha=32,
target_modules=["q_proj", "v_proj", "k_proj", "o_proj"],
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM"
)
model = get_peft_model(model, config)
model.print_trainable_parameters()
# trainable params: 20,971,520 || all params: 7,262,437,376 || trainable%: 0.29
Eğitim bittikten sonra adaptörü birleştirmek için:
model = model.merge_and_unload()
model.save_pretrained("./mistral-7b-finetuned")
merge_and_unload() adaptör ağırlıklarını orijinal ağırlıklara dahil eder ve inference için temiz bir model üretir. Adaptörleri ayrı dosya olarak kaydetmek istiyorsanız model.save_pretrained("./lora-adapter") yeterli; bu yaklaşık 100 MB’lık küçük dosyayı paylaşabilir, herhangi biri orijinal modelin üzerine yükleyebilir.
QLoRA için temel kurulum:
from transformers import BitsAndBytesConfig
import torch
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16,
bnb_4bit_use_double_quant=True,
)
model = AutoModelForCausalLM.from_pretrained(
"mistralai/Mistral-7B-v0.1",
quantization_config=bnb_config,
device_map="auto"
)
Kütüphane üzerine pratik örnekler için LoRA ve Unsloth ile Türkçe LLM ince ayarı rehberimize bakabilirsiniz.
Hangi yöntemi seçmeli?
Karar büyük ölçüde GPU bütçesine ve inference kısıtlarına bağlı.
GPU belleği 24 GB veya altındaysa QLoRA iyi bir başlangıç noktası. 7B modeli tek 24 GB GPU’da, 13B modeli iki GPU’da eğitebilirsiniz.
Production’da inference gecikmesi kritikse LoRA veya DoRA. Adaptörleri birleştirerek orijinal model hızını koruyan tek yaklaşımlar bunlar.
Doğruluk öncelikli ve VRAM bolsa DoRA veya yüksek rank LoRA. DoRA özellikle LoRA ile kapanmayan doğruluk açıklarında fark yaratıyor.
Tek model üzerinde onlarca görevi koşacaksanız Prefix Tuning veya Adapter. Her görev için küçük bir adaptör dosyası yeterli; model kopyası çoğaltmak gerekmiyor.
Az eğitim verisiyle çalışıyorsanız düşük rank LoRA (r=4-8) aşırı öğrenme riskini düşürüyor.
70B üzeri modellerde full fine-tuning zaten gerçekçi bir seçenek değil; QLoRA veya LoftQ tek pratik yol.
PEFT yöntemleri bir modeli tüm görev yelpazesine adapte etmek için tam ince ayarın tam yerini tutmuyor; ancak belirli bir etki alanına yönlendirmede pratikte eşdeğer sonuçlar üretebiliyor. Knowledge distillation ile model damıtma ve PEFT birbirini tamamlayan teknikler olarak düşünülebilir: önce büyük modeli küçültün, ardından PEFT ile hedefe yöneltin.
SFT + PEFT kombinasyonunu bir RLHF pipeline’ının ilk adımı olarak görmek de mümkün. Modeli önce PEFT ile spesifik bir formata alıştırıp ardından insan geri bildirimiyle iyileştirmek, hem maliyet hem veri verimliliği açısından avantajlı bir hat oluşturuyor.



