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।