📚 সমস্ত অধ্যায় দেখুন
অধ্যায়/ফেজ 6 · Phase 6 · GenAI Advanced
6.5৩০ মিনিট পড়া41 / 68

Fine-tuning — LoRA, QLoRA

Fine-tuning

Custom domain এ LLM adapt করানো।

Hook — Custom Domain এ LLM

Prompt দিয়ে অনেক কিছু হয়, কিন্তু নিজের domain (medical, legal, কোম্পানির tone) শেখাতে fine-tuning দরকার। পুরো model retrain করার বদলে আজ LoRA/QLoRA দিয়ে gaming laptop এও সম্ভব।

Fine-tuning Approaches

  • Full Fine-tuning — সব weight update, বিশাল GPU দরকার।
  • PEFT (Parameter Efficient) — কেবল কিছু parameter update।
  • LoRA — low-rank matrix যোগ করে adapt।
  • QLoRA — 4-bit quantized base + LoRA — single GPU তে 7-13B model।
  • Adapter, Prefix Tuning — অন্যান্য PEFT।
  • RLHF / DPO — preference data দিয়ে align।

LoRA — গণিতে

Original weight W (d×d) freeze, পাশে দুটো ছোট matrix A (d×r), B (r×d) train। Effective update: W + B·A। r=8/16/32 সাধারণ — মূল parameter এর ~০.১% মাত্র train হয়।

h = W·x + (B·A)·x · (α/r)

Dataset Format

instruction.jsonl
{"instruction":"Bangla তে gradient descent ব্যাখ্যা করো","input":"","output":"Gradient Descent হলো..."}
{"instruction":"Translate","input":"I love ML","output":"আমি ML ভালোবাসি"}

সাধারণত ৫০০-৫০০০ high-quality example যথেষ্ট। Quality > Quantity।

Code — QLoRA দিয়ে Fine-tune

qlora_train.py
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training
from trl import SFTTrainer, SFTConfig
from datasets import load_dataset

name = "meta-llama/Llama-3.2-3B"
bnb = BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_quant_type="nf4",
                         bnb_4bit_compute_dtype="bfloat16")

tok = AutoTokenizer.from_pretrained(name)
model = AutoModelForCausalLM.from_pretrained(name, quantization_config=bnb, device_map="auto")
model = prepare_model_for_kbit_training(model)

lora = LoraConfig(r=16, lora_alpha=32, lora_dropout=0.05, bias="none",
                  target_modules=["q_proj","k_proj","v_proj","o_proj"], task_type="CAUSAL_LM")
model = get_peft_model(model, lora)

ds = load_dataset("json", data_files="instruction.jsonl", split="train")

trainer = SFTTrainer(
    model=model, tokenizer=tok, train_dataset=ds,
    args=SFTConfig(output_dir="out", per_device_train_batch_size=4,
                   gradient_accumulation_steps=4, num_train_epochs=3,
                   learning_rate=2e-4, bf16=True, logging_steps=10),
)
trainer.train()
model.save_pretrained("lora-adapter")

Inference with Adapter

infer.py
from peft import PeftModel
base = AutoModelForCausalLM.from_pretrained(name, device_map="auto")
model = PeftModel.from_pretrained(base, "lora-adapter")

DPO — RLHF এর Simple বিকল্প

Direct Preference Optimization — reward model ছাড়াই preference pair (chosen vs rejected) থেকে directly fine-tune। আজ open model alignment এ default।

Best Practices

  • Base model নির্বাচন: instruct vs base — instruct এ further SFT সহজ।
  • Eval set আলাদা রাখো, overfit check করো।
  • Learning rate ২e-৪ থেকে শুরু (LoRA)।
  • Catastrophic forgetting এড়াতে original capability test।
  • vLLM/Unsloth দিয়ে faster serving/training।

Summary

এক নজরে

Fine-tuning = LoRA/QLoRA দিয়ে cheap adapt + DPO দিয়ে align। Quality data + ছোট r + careful eval = production-ready custom LLM।