Chapter 41

LLM ফাইন-টিউনিং

Fine-Tuning LLMs
🎬 আপনার নিজের LLM
Fine-tuning = pretrained LLM-কে নিজের ডোমেইন/স্টাইল/টাস্কে অভিযোজিত করা। Full fine-tune ব্যয়বহুল; আজকের যুগে LoRA/QLoRA দিয়ে consumer GPU-তেই 7B–13B model fine-tune সম্ভব।

কখন Fine-tune করবেন?

  • Prompt + few-shot দিয়ে চলছে না।
  • নির্দিষ্ট style/tone/format দরকার।
  • Domain-specific knowledge (medical, legal)।
  • Latency কমাতে ছোট মডেলে boost।
  • Cost কমাতে — long system prompt distill।

শুধু "নতুন knowledge" দরকার হলে fine-tune-এর চেয়ে RAG (পরের অধ্যায়) প্রায়শই ভালো।

Fine-tune Methods

Method
GPU Memory
কখন
Full FT
বিশাল (80GB+)
research, base model adapt
LoRA
মাঝারি
style/task fine-tune
QLoRA
ছোট (single 16GB GPU-তে 7B)
সবচেয়ে জনপ্রিয়
DPO/ORPO
LoRA-সম
preference alignment

LoRA — কীভাবে কাজ করে

Original weight W (d×d) freeze; এর পাশে দুটি ছোট matrix A (d×r) এবং B (r×d) যোগ। আপডেট: W' = W + BA। r=8/16 হলে শুধু ~0.1% parameter trainable — কিন্তু পারফরম্যান্স প্রায় full-FT।

Dataset Format (Instruction Tuning)

# JSONL — প্রতিটি লাইন
{"messages": [
  {"role": "system", "content": "তুমি একজন বাংলা টিচার।"},
  {"role": "user", "content": "Verb কী?"},
  {"role": "assistant", "content": "Verb হলো ক্রিয়া পদ — কাজ বোঝায়।"}
]}

QLoRA — Code

from transformers import (AutoTokenizer, AutoModelForCausalLM,
                          BitsAndBytesConfig, TrainingArguments)
from peft import LoraConfig, get_peft_model
from trl import SFTTrainer

bnb = BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_quant_type="nf4",
                         bnb_4bit_compute_dtype="bfloat16")

tok = AutoTokenizer.from_pretrained("meta-llama/Llama-3.2-3B-Instruct")
mdl = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-3.2-3B-Instruct", quantization_config=bnb,
    device_map="auto")

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

args = TrainingArguments(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=20,
                         save_steps=200)

trainer = SFTTrainer(model=mdl, tokenizer=tok, args=args,
                     train_dataset=ds, max_seq_length=2048)
trainer.train()
mdl.save_pretrained("lora-adapter")

DPO — Preference Alignment

# ডেটা: prompt + chosen + rejected
{"prompt":"...", "chosen":"...", "rejected":"..."}

from trl import DPOTrainer
DPOTrainer(model=mdl, ref_model=ref, args=args,
           beta=0.1, train_dataset=pref_ds).train()

Inference with LoRA Adapter

from peft import PeftModel
base = AutoModelForCausalLM.from_pretrained("Llama-3.2-3B-Instruct")
mdl = PeftModel.from_pretrained(base, "lora-adapter")
mdl = mdl.merge_and_unload()    # production-এ merge করে নিন

Common Pitfalls

⚠️ এড়িয়ে চলবেন
  • খুব ছোট/নিম্নমানের dataset — অসামঞ্জস্যতা শেখাবে।
  • Chat template ভুল ফরম্যাট — pad/EOS token শেখে না।
  • Overfit — ১-২ epoch প্রায়শই যথেষ্ট।
  • Eval set ছাড়া fine-tune — কীভাবে বুঝবেন উন্নতি হলো?

Eval Strategies

  • Hold-out validation set + perplexity।
  • Domain-specific accuracy / ROUGE / BLEU।
  • LLM-as-a-Judge (GPT-4 দিয়ে rubric scoring)।
  • Human spot-check ২০–৫০ sample।
🔑 ডেটা > পদ্ধতি
৫০০টি high-quality example প্রায়ই ৫০,০০০ মাঝারি example-এর চেয়ে ভালো। কোয়ালিটি curation-এ সময় দিন।

অনুশীলন

১. বাংলায় ২০০ instruction-response pair বানিয়ে LLaMA-3.2-1B QLoRA fine-tune।

২. Eval set-এ before/after compare করুন।

৩. DPO দিয়ে tone alignment চেষ্টা করুন।

সারসংক্ষেপ

✨ এই অধ্যায়ে যা শিখলাম
  • LoRA/QLoRA = সস্তায় effective fine-tune।
  • Knowledge → RAG; behavior → fine-tune।
  • Data quality + eval — দুটোই critical।