
LoRA và QLoRA: Fine-tuning LLM hiệu quả trên GPU hạn chế
Trong thời đại của mô hình ngôn ngữ lớn (LLM), việc fine-tuning (tuning lại) mô hình để phù hợp với nhiệm vụ cụ thể trở nên thiết yếu. Tuy nhiên, các mô hình như Llama 2 (7B-70B tham số) hoặc Mistral đòi hỏi bộ nhớ GPU khổng lồ, thường không khả dụng cho các nhà phát triển cá nhân hoặc startup. LoRA (Low-Rank Adaptation) và phiên bản cải tiến QLoRA cung cấp giải pháp hiệu quả để giảm đáng kể tài nguyên cần thiết để fine-tuning LLM.
LoRA là gì?
LoRA (Low-Rank Adaptation) là kỹ thuật fine-tuning tham số hiệu quả được đề xuất bởi Microsoft vào năm 2021. Thay vì cập nhật toàn bộ ma trận trọng lượng của mô hình được huấn luyện trước, LoRA thêm các ma trận trọng lượng có hạng thấp (low-rank) vào từng lớp và chỉ huấn luyện các ma trận này, trong khi giữ nguyên trọng lượng ban đầu.
Giả sử một lớp trong mô hình có trọng lượng W ∈ Rd×k. Thay vì học ΔW, LoRA giả định ΔW = BA, trong đó B ∈ Rd×r và A ∈ Rr×k với r ≪ min(d,k). Do đó, thay vì học d×k tham số, chúng ta chỉ cần học d×r + r×k tham số, giảm đáng kể kích thước của gradient cần lưu trữ và tính toán.
Cách thức hoạt động của LoRA
Trong quá trình huấn luyện:
- Trọng lượng pretrained W được đóng băng (frozen) và không được cập nhật
- Hai ma trận B và A được khởi tạo ngẫu nhiên (B với Gaussian, A với 0)
- Trong quá trình forward pass, tính toán h = Wx + BAx
- Chỉ ma trận B và A được cập nhật qua gradient descent
Kết quả: trọng lượng hiệu quả là W + BA, trong đó W chứa kiến thức pretrained, BA chứa sự điều chỉnh đặc thù cho nhiệm vụ.

Ưu điểm của LoRA
- Hiệu quả về bộ nhớ: Chỉ cần lưu trữ gradient cho B và A thay vì toàn bộ W
- Tốc độ nhanh: Kích thước gradient nhỏ hơn, giảm thời gian tính toán
- Dễ dàng triển khai: Chỉ cần thêm các lớp adapter vào mô hình
- Không suy giảm chất lượng: Giữ được hiệu quả gần như full fine-tuning trên nhiều benchmark
- Có thể hợp nhất: Sau huấn luyện, BA có thể được cộng vào W để tạo mô hình fine-tuned chuẩn
QLoRA: LoRA kết hợp với quantization
QLoRA (Quantized LoRA) là sự phát triển của LoRA, được đề xuất bởi Tim Dettchers et al. vào năm 2023, kết hợp LoRA với quantization 4-bit (NF4 – NormalFloat 4) để giảm thiểu thêm bộ nhớ GPU.
Trong QLoRA:
- Các trọng lượng pretrained được lưu trữ ở định dạng 4-bit (thay vì 16-bit hoặc 32-bit)
- LoRA adapters vẫn được huấn luyện ở độ chính xác bình thường (bfloat16 hoặc float32)
- Trong quá trình forward pass, các trọng lượng 4-bit được dequantize tạm thời để tính toán
Kết quả: QLoRA giảm bộ nhớ GPU cần thiết xuống tới 1/3 so với LoRA thông thường, cho phép fine-tuning mô hình 65B tham số trên một GPU 24GB như RTX 4090.

Các thành phần kỹ thuật
Rank (r)
Tham số rank quyết định số lượng tham số trainable được thêm vào. Giá trị r thường trong khoảng 8-64. Càng r lớn, khả năng biểu đạt cao hơn nhưng cũng tiêu tốn nhiều tài nguyên hơn.
Alpha (α)
Tham số scale LoRA, thường được thiết lập là 2×r hoặc một giá trị hằng số như 16, 32, 64. Alpha điều chỉnh mức độ đóng góp của adapters vào đầu ra.
Dropout
Để tránh overfitting, thường thêm dropout vào các lớp LoRA, với giá trị thường 0.05-0.1.
Các framework hỗ trợ LoRA/QLoRA
PEFT (Parameter-Efficient Fine-Tuning) của HuggingFace
Thư viện PEFT cung cấp giao diện thống nhất để triển khai các kỹ thuật fine-tuning hiệu quả bao gồm LoRA, QLoRA, AdaLoRA, và các biến thể khác.
Ví dụ cơ bản sử dụng PEFT:
from peft import LoraConfig, get_peft_model
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf")
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf")
lora_config = LoraConfig(
r=64,
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()
# Output: trainable params: 1,234,567 || all params: 7,000,000,000 || trainable%: 0.0176%
Quy trình fine-tuning với LoRA/QLoRA
- Chọn mô hình pretrained: Llama 2, Mistral, Phi-2, etc.
- Chuẩn bị dataset: Định dạng prompt-completion hoặc instruction following
- Cấu hình LoRA: Thiết lập r, alpha, dropout, target modules
- Huấn luyện: Sử dụng trainer như HuggingFace TRL hoặc Axolotl
- Lưu và hợp nhất: Lưu adapters hoặc hợp nhất vào mô hình base để triển khai

Ứng dụng thực tế
- Chatbot cá nhân: Fine-tuning Llama 2 7B trên bộ tin nhắn cá nhân để tạo trợ lý AI
- Mô hình chuyên ngành: Tạo mô hình y tế, pháp lý dựa trên LLM chung
- Agent AI: Fine-tuning để cải thiện khả năng planning và tool use
- Nhân bản phong cách: Tạo mô hình viết văn phong cách nhất định
So sánh với các kỹ thuật khác
| Kỹ thuật | Bộ nhớ GPU | Khả năng triển khai | Chất lượng |
|---|---|---|---|
| Full fine-tuning | Cao (100%) | Khó (cần nhiều GPU) | Tốt nhất |
| LoRA | Thấp (0.1-1%) | Dễ (1 GPU) | Gần bằng full</td |
| QLoRA | Rất thấp (0.01-0.1%) | Rất dễ (GPU tiêu thụ) | Gần bằng LoRA |
| AdaLoRA | Thấp (0.1-1%) | Trung bình | Tốt (tự động điều chỉnh rank) |
Thách thức và hướng phát triển
Mặc dù hiệu quả, LoRA/QLoRA vẫn có một số hạn chế:
- Expressiveness limitation: Rank thấp có thể không bắt được tất cả sự thay đổi cần thiết
- Merge complexity: Việc hợp nhất adapters có thể gây ra lỗi làm tròn số
- Inference latency: Thêm bước tính toán BAx trong mỗi lớp
Các hướng phát triển bao gồm: AdaLoRA (tự động điều dégradten rank), LoRA+ (kết hợp với các kỹ thuật khác), và các phương pháp hybrid kết hợp LoRA với selective parameter updates.
Kết luận
LoRA và QLoRA đã cách mạng hoá việc fine-tuning LLM bằng cách giảm thiểu đáng kể yêu cầu về phần cứng, đồng thời giữ lại hiệu suất cao. Với những kỹ thuật này, các nhà nghiên cứu, nhà phát triển và nawet những người đam mê có thể tùy chỉnh các mô hình ngôn ngữ lớn mà không cần đầu tư vào hệ thống GPU đắt tiền. Khi các mô hình LLM tiếp tục phát triển kích thước, các kỹ thuật parameter-efficient như LoRA/QLoRA sẽ đóng vai trò then chốt trong việc democratize quyền truy cập vào AI tiên tiến.
