LLM Fine-Tuning

Önceden eğitilmiş büyük dil modellerini, özel görevleriniz ve verileriniz için nasıl ince ayarlayacağınızı öğrenin. LoRA, Hugging Face, Prompt Tuning ve daha fazlası.

trainer.train() # Fine-Tuning Başlasın!

Fine-Tuning Nedir?

Fine-Tuning (İnce Ayar), önceden büyük bir veri seti üzerinde eğitilmiş bir makine öğrenimi modelini (genellikle bir LLM), daha küçük ve spesifik bir veri seti üzerinde yeniden eğiterek belirli bir göreve uyarlamak için kullanılan bir tekniktir.

Örneğin, genel bir dil modeli olan Llama 3 veya Mistral, tıbbi metinler üzerinde fine-tuning yapılarak bir "tıbbi danışman" modeline dönüştürülebilir. Bu, sıfırdan eğitimden çok daha az maliyetli ve hızlıdır.

💡 Pro İpucu: Fine-tuning, modelin mevcut bilgisini korumayı ve sadece yeni görevle ilgili bilgiyi öğrenmeyi hedefler. Bu nedenle öğrenme oranı (learning rate) genellikle sıfırdan eğitimdekinden çok daha düşüktür.
Fine-Tuning Türleri:
  • • Tam Fine-Tuning: Modelin tüm parametreleri güncellenir. En güçlü ama en maliyetli yöntem.
  • • Parametre Verimli Fine-Tuning (PEFT): Sadece küçük bir parametre alt kümesi güncellenir (LoRA, Adapter, Prompt Tuning).
  • • Katman Bazlı Fine-Tuning: Sadece son birkaç katman güncellenir.
Tarihçe
Transfer öğrenme kavramı uzun süredir var olsa da, LLM'lerin popülerliğiyle birlikte fine-tuning teknikleri (özellikle PEFT) 2020'lerin başından itibaren patlama yaşadı.

Fine-tuning, modelinizi spesifik bir domain (tıp, hukuk, finans) veya spesifik bir görev (özetleme, soru-cevaplama, sınıflandırma) için optimize etmenin en etkili yoludur.

Neden Fine-Tuning?

Neden sıfırdan model eğitmek yerine fine-tuning tercih edilir? Cevap basit: Verimlilik.

# Karşılaştırma: Sıfırdan Eğitim vs Fine-Tuning
# Sıfırdan Eğitim
# - Veri: 1TB+
# - GPU: 1000+ A100
# - Zaman: Aylar
# - Maliyet: Milyonlarca $
# Fine-Tuning
# - Veri: 1000-10000 örnek
# - GPU: 1-8 A100
# - Zaman: Saatler-Günler
# - Maliyet: Yüzlerce-Dolar
💡 Pro İpucu: Eğer özel göreviniz için 1000'den az kaliteli eğitim örneğiniz varsa, Prompt Engineering veya In-Context Learning fine-tuning'den daha iyi sonuç verebilir.

Fine-Tuning'in Avantajları:

  • Maliyet Etkin: Sıfırdan eğitime göre çok daha ucuz.
  • Zaman Tasarrufu: Günler veya haftalar yerine saatler içinde sonuç alınabilir.
  • Yüksek Performans: Spesifik görevde genel modellerden çok daha iyi performans gösterir.
  • Domain Uzmanlığı: Model, belirli bir alandaki terminoloji ve tarzı öğrenir.
Gerçek Dünya Örneği
Müşteri Hizmetleri Chatbot'u: Genel bir LLM, müşteri şikayetlerini doğru sınıflandıramayabilir. Fine-tuning ile, şirketin geçmiş müşteri etkileşimleri üzerinde eğitilerek mükemmel bir müşteri hizmetleri asistanı haline getirilebilir.
Dikkat: Fine-tuning, modelin genel bilgisini "unutturabilir" (catastrophic forgetting). Bu nedenle, yeni görevle ilgisi olmayan eski bilgileri korumak için dikkatli bir yaklaşım gerekir.

Veri Hazırlığı: Anahtar

Fine-tuning başarısının %80'i, kaliteli ve uygun biçimde hazırlanmış veriye bağlıdır. İyi hazırlanmamış veri, en iyi algoritmayı bile başarısızlığa uğratır.

# JSONL formatında eğitim verisi örneği (soru-cevaplama)
{"instruction": "Ankara'nın nüfusu kaçtır?", "input": "", "output": "Ankara'nın 2023 tahmini nüfusu 5.7 milyondur."}
{"instruction": "Türkiye'nin başkenti neresidir?", "input": "", "output": "Türkiye'nin başkenti Ankara'dır."}
# Alpaca formatı
💡 Pro İpucu: Eğitim verinizin formatı, seçtiğiniz modelin orijinal eğitim verisi formatıyla uyumlu olmalıdır. Örneğin, Llama 2, "### Instruction: ... ### Response: ..." formatında eğitilmiştir.

Veri Hazırlama Adımları:

  1. Toplama: Görevinize uygun verileri toplayın (web, mevcut veritabanı, el ile etiketleme).
  2. Temizleme: Dublikatları, hatalı veya tutarsız verileri çıkarın.
  3. Biçimlendirme: Seçtiğiniz modelin istediği formata getirin (JSONL, CSV, txt).
  4. Bölme: Eğitim (train), doğrulama (validation) ve test (test) setlerine ayırın (örneğin, 80%-10%-10%).
  5. Tokenizasyon: Metni token'lara dönüştürün (genellikle modelin tokenizer'ı kullanılır).
Veri Miktarı
• Küçük Görevler: 100-1000 örnek
• Orta Boy Görevler: 1000-10.000 örnek
• Büyük Görevler/Domains: 10.000-100.000+ örnek
Kalite, miktardan her zaman daha önemlidir!
Önemli: Eğitim veriniz, modelin karşılaşacağı gerçek dünya verilerini temsil etmelidir. Aksi takdirde, model testte iyi performans gösterse bile üretimde başarısız olur.

Hugging Face ile Fine-Tuning

Hugging Face, doğal dil işleme (NLP) ve makine öğrenimi için en popüler açık kaynak platformudur. Transformers kütüphanesi sayesinde, binlerce önceden eğitilmiş modeli birkaç satır kodla fine-tuning yapabilirsiniz.

💡 Kurulum: pip install transformers datasets accelerate peft
from transformers import AutoTokenizer, AutoModelForCausalLM, TrainingArguments, Trainer
from datasets import load_dataset
# 1. Model ve Tokenizer'ı yükle
model_name = "meta-llama/Meta-Llama-3-8B"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
# 2. Veri setini yükle
dataset = load_dataset("json", data_files="train_data.jsonl")
# 3. Tokenizasyon fonksiyonu
def tokenize_function(examples):
    return tokenizer(examples["text"], truncation=True, padding="max_length", max_length=512)
tokenized_datasets = dataset.map(tokenize_function, batched=True)
Eğitim Ayarları
TrainingArguments sınıfı ile öğrenme oranı, batch boyutu, epoch sayısı gibi tüm hiperparametreleri ayarlayabilirsiniz. Trainer sınıfı ise eğitim döngüsünü otomatik olarak yönetir.
# 4. Eğitim argümanlarını tanımla
training_args = TrainingArguments(
    output_dir="./results",
    num_train_epochs=3,
    per_device_train_batch_size=4,
    per_device_eval_batch_size=4,
    warmup_steps=500,
    weight_decay=0.01,
    logging_dir='./logs',
    logging_steps=100,
    save_strategy="epoch",
    evaluation_strategy="epoch",
    learning_rate=2e-5, # Fine-tuning için düşük LR
)
# 5. Trainer'ı oluştur ve eğitimi başlat
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=tokenized_datasets["train"],
    eval_dataset=tokenized_datasets["validation"],
)
trainer.train()
Not: Gerçek bir Llama 3 modelini eğitmek için Hugging Face'ten bir erişim token'ı almanız ve modelin lisans şartlarını kabul etmeniz gerekir.

LoRA ve PEFT: Devrim

LoRA (Low-Rank Adaptation), büyük modelleri fine-tuning yaparken bellek ve hesaplama maliyetini devasa ölçüde azaltan bir devrimdir. Fikir basit: Modelin orijinal ağırlıklarını dondur ve sadece küçük, düşük mertebeli (low-rank) matrisler ekleyerek modeli uyarla.

💡 Pro İpucu: LoRA ile, 7B parametreli bir modeli tek bir 24GB GPU'da (örneğin, RTX 4090) fine-tuning yapabilirsiniz. Tam fine-tuning bunun 3-4 katı bellek gerektirir.
from peft import LoraConfig, get_peft_model
# LoRA konfigürasyonu
lora_config = LoraConfig(
    r=8,                   # Rank
    lora_alpha=32,           # Scaling factor
    target_modules=["q_proj", "v_proj"], # Hangi katmanlara uygulanacak
    lora_dropout=0.1,
    bias="none",
    task_type="CAUSAL_LM"
)
# Modeli PEFT ile sar
model = get_peft_model(model, lora_config)
model.print_trainable_parameters() # Sadece %0.1 parametre eğitilebilir!
trainable params: 2,097,152 || all params: 6,738,485,248 || trainable%: 0.0311

PEFT'in Diğer Yöntemleri:

  • Adapter: Transformer katmanlarına küçük FFN katmanları ekler.
  • Prompt Tuning: Girdiye "yazılabilir prompt token'lar" ekler.
  • Prefix Tuning: Her katmanın başına prefix vektörleri ekler.
  • QLoRA: 4-bit nicemleme + LoRA, bellek kullanımını daha da azaltır.
QLoRA ile Ultra Düşük Bellek
bitsandbytes kütüphanesi ile modeli 4-bit'e sıkıştırıp LoRA uygulayabilirsiniz. Bu sayede 7B bir modeli sadece 6-8GB RAM ile eğitebilirsiniz!
Dikkat: LoRA, modelin tam fine-tuning kadar güçlü olmayabilir. Ancak, maliyet-etkinlik oranı muazzamdır ve çoğu görev için yeterlidir.

Prompt Tuning ve Instruction Tuning

Prompt Tuning, modelin ağırlıklarını hiç değiştirmeden, girdiye özel "prompt token'lar" ekleyerek modeli yönlendirme yöntemidir. Instruction Tuning ise, modeli "talimat-tabanlı" görevlerde daha iyi performans göstermesi için eğitmektir.

# Prompt Tuning: Öğrenilebilir prompt token'lar
import torch
# [Prompt] [Task Input] formatında
learnable_prompt = torch.nn.Parameter(torch.randn(10, 768)) # 10 token, 768 boyut
# Instruction Tuning: Veri formatı
instruction_data = [
    {
        "text": "### Instruction: Bu metni özetle. ### Input: Uzun metin... ### Response: Kısa özet..."
    },
    {
        "text": "### Instruction: Bu soruyu cevapla. ### Input: Başkent neresi? ### Response: Ankara."
    }
]
💡 Pro İpucu: Alpaca ve FLAN gibi veri setleri, instruction tuning için mükemmel kaynaklardır. Bu veri setleriyle eğitilmiş modeller, "sıfır atış" (zero-shot) görevlerde çok daha iyi performans gösterir.

Prompt Tuning Türleri:

  • Soft Prompt Tuning: Prompt token'ların gömmeleri (embeddings) öğrenilir, metin değildir.
  • Hard Prompt Tuning: En iyi performans veren metinsel prompt'ları elle veya otomatik olarak aramak.
  • Instruction Tuning: Modeli "talimat + girdi -> çıktı" formatında eğitmek.
Prompt vs Fine-Tuning
Prompt Engineering: Model ağırlıkları sabit, sadece girdi değiştirilir. Hızlı ve ucuz.
Fine-Tuning: Model ağırlıkları değişir. Daha güçlü ama maliyetli.
Prompt Tuning: Yalnızca prompt token'ların ağırlıkları değişir. İkisinin ortası.
Uyarı: Prompt tuning, tam fine-tuning kadar güçlü değildir. Karmaşık görevler için genellikle yetersiz kalır.

Eğitim Süreci ve İzleme

Fine-tuning sürecini başlatmak için trainer.train() komutunu çalıştırdıktan sonra, eğitim sürecini izlemek ve hiperparametreleri ayarlamak çok önemlidir.

# Eğitim ilerlemesini izlemek için
from transformers import TrainerCallback
class CustomCallback(TrainerCallback):
    def on_log(self, args, state, control, logs=None, **kwargs):
        print(f"Adım {state.global_step}: Kayıp = {logs['loss']:.4f}")
trainer.add_callback(CustomCallback())
# Weights & Biases (W&B) ile gelişmiş izleme
import wandb
wandb.init(project="my-finetuning-project")
training_args = TrainingArguments(
    ...,
    report_to="wandb", # W&B entegrasyonu
)
💡 Pro İpucu: Eğitim sırasında aşırı öğrenmeyi (overfitting) önlemek için evaluation_strategy="epoch" ve load_best_model_at_end=True ayarlarını kullanın. Bu, en iyi performans gösteren modeli otomatik olarak yükler.

Kritik Hiperparametreler:

  • learning_rate: Genellikle 1e-5 ile 5e-5 arasında. Tam fine-tuning'ten daha düşük.
  • num_train_epochs: 1-10 arasında. Veri seti ne kadar küçükse, epoch sayısı o kadar fazla olabilir.
  • per_device_train_batch_size: GPU belleğinize göre ayarlayın. LoRA ile daha büyük batch size kullanılabilir.
  • gradient_accumulation_steps: Bellek yetersizse, gradyanları birkaç adımda bir biriktirin.
  • warmup_steps: Öğrenme oranını lineer olarak artırır, stabil eğitim için.
Grafiklerle İzleme
TensorBoard: tensorboard --logdir=./logs
Weights & Biases: İnteraktif panolar, model ağırlık dağılımları, gradyanlar.
MLflow: Deneyleri yönetme ve karşılaştırma.
Dur! Eğitim kaybı azalırken, doğrulama kaybı artıyorsa bu aşırı öğrenme (overfitting) işaretidir. Eğitim hemen durdurulmalı veya düzenlileştirme (regularization) artırılmalıdır.

Model Değerlendirme ve Test

Eğitim bittikten sonra, modelinizin performansını ölçmek için test seti üzerinde değerlendirmeniz gerekir. Eğitim setinde iyi performans gösteren bir model, gerçek dünya verilerinde başarısız olabilir.

from transformers import pipeline
# Eğitilmiş modeli yükle
model = AutoModelForCausalLM.from_pretrained("./results/checkpoint-500")
tokenizer = AutoTokenizer.from_pretrained("./results/checkpoint-500")
# Pipeline oluştur
pipe = pipeline("text-generation", model=model, tokenizer=tokenizer)
# Test örneği
result = pipe("### Instruction: Türkiye'nin başkenti neresidir? ### Response:", max_new_tokens=50)
print(result[0]['generated_text'])
💡 Pro İpucu: Otomatik metrikler (BLEU, ROUGE) yanıltıcı olabilir. İnsan değerlendirmesi en güvenilir yöntemdir. Görevinize özel bir değerlendirme protokolü oluşturun.

Değerlendirme Metrikleri:

  • Doğruluk (Accuracy): Sınıflandırma görevleri için.
  • Perplexity: Dil modellemenin temel metriği, ne kadar "şaşırmış" olduğunu ölçer.
  • BLEU, ROUGE: Makine çevirisi ve özetleme için.
  • F1-Skoru: Dengesiz veri setlerinde doğruluktan daha anlamlı.
  • İnsan Değerlendirmesi: En güvenilir, en pahalı yöntem.
A/B Testi
Fine-tuning yapılmış modeliniz ile orijinal modeli gerçek kullanıcılar üzerinde A/B testine tabi tutun. Kullanıcı memnuniyeti, dönüşüm oranı gibi iş metrikleri en önemli göstergelerdir.
Önyargı Kontrolü: Modelinizin eğitildiği veri setinde önyargılar varsa, bu önyargılar fine-tuning sonrası da devam eder veya artar. Model çıktılarını dikkatlice denetleyin.

Model Dağıtımı ve Kullanım

Fine-tuning işlemi tamamlandıktan sonra, modelinizi bir API olarak sunabilir veya doğrudan uygulamanıza entegre edebilirsiniz.

# FastAPI ile basit bir API sunucusu
from fastapi import FastAPI
from pydantic import BaseModel
from transformers import pipeline
app = FastAPI()
# Modeli yükle (sunucu başlangıcında)
pipe = pipeline("text-generation", model="./fine_tuned_model")
class RequestModel(BaseModel):
    prompt: str
    max_tokens: int = 100
@app.post("/generate")
async def generate(request: RequestModel):
    result = pipe(request.prompt, max_new_tokens=request.max_tokens)
    return {"response": result[0]['generated_text']}
💡 Pro İpucu: Üretim ortamında modeli nicemleme (quantization) ile daha hafif ve hızlı hale getirebilirsiniz. bitsandbytes veya GGUF formatı kullanabilirsiniz.

Dağıtım Seçenekleri:

  • Hugging Face Spaces: Ücretsiz veya ücretli, kolay web arayüzü.
  • AWS SageMaker / GCP Vertex AI: Bulut tabanlı, ölçeklenebilir.
  • Docker + FastAPI: Kendi sunucunuzda, tam kontrol.
  • ONNX Runtime: Daha hızlı çıkarım (inference) için modeli ONNX formatına çevirin.
Modeli Kaydetme ve Paylaşma
model.save_pretrained("./my_model")
tokenizer.save_pretrained("./my_model")
Eğitilmiş modelinizi Hugging Face Hub'a yükleyerek toplulukla paylaşabilirsiniz: model.push_to_hub("my-username/my-model")
Gizlilik: Fine-tuning için kullandığınız veriler gizliyse, modelinizi herkese açık bir platformda paylaşmayın. Model, eğitim verilerini ezberleyebilir.

Yolculuğun Başlıyor!

Son Tavsiyeler
Küçükten Başlayın: 7B parametreli bir modelle başlayın, 70B değil.
Veri Kalitesi: 1000 mükemmel örnek, 10000 kötü örnekten iyidir.
Topluluk: Hugging Face forumları, Reddit, Discord'a katılın.
Deneyin: Farklı PEFT yöntemlerini ve veri formatlarını deneyin.

print("Happy Fine-Tuning! 🚀")