1. 16:02 13/10/2026
Fine‑tuning toàn bộ tham số của một mô hình ngôn ngữ lớn (LLM) thường đòi hỏi hàng chục GB VRAM và thời gian huấn luyện lâu, điều mà hầu hết các nhà phát triển cá nhân hoặc nhóm nhỏ không thể đáp ứng. Giải pháp thực tế là sử dụng các phương pháp tinh chỉnh tham số hiệu quả (Parameter‑Efficient Fine‑Tuning – PEFT) như LoRA (Low‑Rank Adaptation) và phiên bản lượng tử hóa QLoRA. Dưới đây là quy trình từng bước có thể áp dụng ngay hôm nay.
**1. Hiểu rõ LoRA và QLoRA**
- LoRA chèn các ma trận hạng thấp (rank r) vào các lớp attention, chỉ huấn luyện các trọng số này trong khi đóng băng phần còn lại của mô hình.
- QLoRA kết hợp LoRA với lượng tử hóa 4‑bit (NF4) cho trọng số gốc, giảm VRAM xuống dưới 8 GB cho mô hình 7B tham số.
**2. Chuẩn bị môi trường**
- Cài đặt Python 3.10+, PyTorch 2.x, `transformers`, `peft`, `bitsandbytes`, `accelerate`.
- Kiểm tra GPU: `nvidia-smi` – đảm bảo driver hỗ trợ CUDA 12.x.
**3. Tải mô hình cơ sở (base model)**
```python
from transformers import AutoModelForCausalLM, AutoTokenizer
model_id = "meta-llama/Llama-2-7b-hf" # hoặc bất kỳ mô hình mở nào
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id,
load_in_4bit=True, # bật QLoRA
device_map="auto",
torch_dtype=torch.float16
)
```
**4. Cấu hình LoRA**
```python
from peft import LoraConfig, get_peft_model
lora_config = LoraConfig(
r=8, # rank thấp, có thể tăng lên 16/32 nếu VRAM cho phép
lora_alpha=16,
target_modules=["q_proj", "v_proj"],
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM"
)
model = get_peft_model(model, lora_config)
model.print_trainable_parameters() # kiểm tra % tham số trainable
```
**5. Chuẩn bị dữ liệu**
- Thu thập tập dữ liệu hướng dẫn (instruction‑tuning) dạng JSONL: `{ "prompt": "...", "completion": "..." }`.
- Sử dụng `datasets` để token hóa, cắt truncation tại 1024 token, padding động.
**6. Huấn luyện**
```python
from transformers import Trainer, TrainingArguments
training_args = TrainingArguments(
output_dir="lora-llama2-7b",
per_device_train_batch_size=2,
gradient_accumulation_steps=4,
learning_rate=2e-4,
num_train_epochs=3,
fp16=True,
logging_steps=10,
save_strategy="epoch",
report_to="none"
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_dataset,
tokenizer=tokenizer
)
trainer.train()
```
**7. Đánh giá và hợp nhất (merge) trọng số**
- Sau khi train xong, gọi `model.merge_and_unload()` để gộp LoRA vào mô hình gốc, sau đó lưu dưới dạng `save_pretrained` để triển khai inference thông thường.
**8. Mẹo tránh lỗi thường gặp**
- **OOM**: giảm `r`, batch size, hoặc bật `gradient_checkpointing=True`.
- **Loss không giảm**: kiểm tra learning rate, tăng `lora_alpha`, hoặc mở rộng `target_modules` (k, v, o, down_proj).
- **Tokenizer mismatch**: đảm bảo `pad_token` = `eos_token` cho mô hình causal.
**9. Triển khai nhanh**
- Sử dụng `vLLM` hoặc `text-generation-inference` để serve mô hình đã merge với throughput cao.
- Nếu chỉ cần inference trên CPU/edge, xuất sang ONNX với `optimum` và lượng tử hóa INT8.
**Tóm tắt**: LoRA/QLoRA cho phép fine‑tuning LLM 7‑13B trên một GPU 8‑12 GB VRAM chỉ trong vài giờ. Quy trình trên đã được kiểm chứng trên nhiều dự án thực tế (chatbot hỗ trợ khách hàng, tóm tắt tài liệu nội bộ, sinh code snippet). Hãy bắt đầu với rank thấp, tập dữ liệu nhỏ, sau đó mở rộng dần khi đã nắm rõ hành vi mô hình.