
Fine-tuning LoRA là gì?
Fine-tuning LoRA (Low-Rank Adaptation) là kỹ thuật tinh chỉnh mô hình ngôn ngữ lớn (LLM) hiệu quả nhất hiện nay, cho phép huấn luyện lại mô hình với chi phí phần cứng và thời gian nhỏ hơn đáng kể so với full fine-tuning. Thay vì cập nhật toàn bộ trọng số mô hình (có thể lên tới hàng trăm tỷ tham số), LoRA chỉ huấn luyện một tập hợp ma trận rang thấp nhỏ được chèn vào các layer attention, giảm tham số cần train xuống còn 0.1-1% so với gốc.

Tại sao LoRA thắng full fine-tuning?
- VRAM giảm 3-10x: Chỉ lưu gradient cho ma trận LoRA (thường 4-32 rank) thay vì toàn bộ model. Llama-3-8B full fine-tuning cần ~80GB VRAM (8x A100 80GB), LoRA rank 16 chỉ cần ~16-24GB (1-2x A100 40GB).
- Checkpoint nhỏ: File adapter LoRA chỉ 10-100MB so với 15-30GB full model, dễ chia sẻ, version control, deploy.
- Không catastrophic forgetting: Trọng số gốc không đổi, kiến thức pretrain được bảo toàn. Có thể merge nhiều adapter LoRA cho nhiều task khác nhau (multi-adapter).
- Training nhanh hơn: Ít tham số hơn = step nhanh hơn, ít communication overhead khi multi-GPU.
Quy trình fine-tuning LoRA thực tế
1. Chuẩn bị dữ liệu
Dữ liệu chất lượng quan trọng hơn số lượng. Cần 500-5000 mẫu high-quality cho domain-specific, 1000-10000 cho instruction following. Format chuẩn: JSONL với fields instruction, input (optional), output. Loại bỏ duplicate, PII, toxic content. Data cleaning là 60% thành công.
2. Chọn hyperparameters quan trọng
| Tham số | Giá trị khuyến nghị | Lưu ý |
|---|---|---|
| Rank (r) | 8, 16, 32, 64 | Rank cao = capacity cao nhưng VRAM nhiều hơn. 16 đủ cho hầu hết task |
| Alpha | 16, 32 (thường = 2x rank) | Scaling factor: alpha/rank. Giữ ratio ổn định |
| Dropout | 0.05 – 0.1 | Ngăn overfitting trên dataset nhỏ |
| Target modules | q_proj, v_proj, k_proj, o_proj, gate_proj, up_proj, down_proj | Attention + MLP. Full target = hiệu quả nhất |
| Learning rate | 1e-4 – 5e-4 | LoRA cho LR cao hơn full fine-tuning (1e-5) |
| Batch size | 4-16 per GPU | Tăng dần với gradient accumulation |
| Epochs | 3-5 | Dừng sớm khi eval loss không giảm |

3. Tools & Framework phổ biến
- Unsloth: Tối ưu memory + speed 2-5x so với HF Trainer. Hỗ trợ 4-bit QLoRA native. GitHub
- Axolotl: Config-driven, hỗ trợ multi-GPU FSDP/DeepSpeed, YAML config đơn giản. GitHub
- LLaMA-Factory: Web UI + CLI, hỗ trợ LoRA/QLoRA/Full FT, DPO, PPO. GitHub
- Hugging Face PEFT + Trainer: Low-level, linh hoạt nhất cho research.
4. QLoRA: Fine-tuning trên GPU consumer
QLoRA (Quantized LoRA) lượng tử hóa base model xuống 4-bit (NF4) + double quantization, giảm VRAM thêm 4x. Llama-3-8B QLoRA rank 16 chạy được trên 1x RTX 3090/4090 24GB. Trade-off: quality nhẹ giảm so LoRA 16-bit, nhưng acceptable cho hầu hết use case. Dùng bitsandbytes + PEFT.
Chi phí thực tế (2024 pricing)
| Setup | Cloud (RunPod/Lambda/AWS) | Local (RTX 4090 24GB) |
|---|---|---|
| Llama-3-8B LoRA r=16 (3 epochs, 5k samples) | $8-15 (1x A100 40GB, ~2-3h) | Free (điện ~$0.50), ~3-4h |
| Llama-3-70B QLoRA r=32 (3 epochs, 5k samples) | $40-80 (2-4x A100 80GB, ~4-6h) | Không chạy được (cần 48GB+ VRAM) |
| Llama-3.1-405B QLoRA | $200-500 (8x H100, ~8-12h) | Không thể |
Lưu ý: Giá cloud biến động. Spot instance giảm 60-70% nhưng có risk preempt.
Merge & Deploy adapter
Sau training, merge LoRA weights vào base model để inference không cần PEFT library:
python -m llava.merge_lora
--base_model meta-llama/Meta-Llama-3-8B
--adapter_path ./lora-output
--output_path ./merged-model
Merged model chạy bằng vLLM, Ollama, llama.cpp bình thường. Không merge nếu cần switch adapter động (multi-tenant serving).
Cạm bẫy thường gặp
- Overfitting: Dataset nhỏ, rank cao, epochs nhiều. Fix: tăng dropout, giảm rank, early stopping, data augmentation.
- Catastrophic forgetting vẫn xảy ra: Nếu LR quá cao hoặc train quá lâu trên domain hẹp. Monitor eval loss trên held-out set.
- Tokenizer mismatch: Base model và fine-tune dùng tokenizer khác. Luôn dùng tokenizer của base model.
- Chat template sai: Instruction format phải khớp chat template của model (Llama-3, ChatML, Gemma, v.v.).
Khi nào KHÔNG nên dùng LoRA?
- Cần thay đổi kiến thức cốt lõi (facts, reasoning) — full fine-tuning hoặc RAG tốt hơn.
- Domain shift quá lớn (code → tiếng Việt y tế, law) — pretrain tiếp (continued pretrain) hiệu quả hơn.
- Cần output format cực kỳ chặt chẽ (JSON schema strict) — structured output / constrained decoding hoặc DPO/RLHF.
