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।