QLoRA — Quantize 4-bit + LoRA = fine-tune 65B trên 1 GPU consumer
QLoRA giải phóng fine-tune LLM 65B từ cluster xuống laptop bằng cách nén base model xuống 4-bit trong khi giữ gradient 16-bit cho adapter. Không cần đổi hardware, chỉ cần đổi cách nhìn về memory.
Một model LLaMA 65B ở định dạng FP16 nặng khoảng 130GB. Nếu bạn muốn fine-tune nó theo cách truyền thống, bạn cần thêm gradients và optimizer states (Adam giữ 2 bản sao của weights), tổng cộng vượt quá 1TB VRAM — con số chỉ có trong data center. Nhưng năm 2023, một kỹ thuật mang tên QLoRA đã phá vỡ quy tắc này: nó cho phép bạn fine-tune model đó trên một chiếc RTX 4090 48GB, hoặc thậm chí RTX 3090 24GB với model nhỏ hơn. Bí mật không nằm ở phép toán mới, mà ở việc nhận ra rằng: nếu bạn không sửa đổi một thứ, bạn không cần lưu nó ở độ phân giải cao.
Vấn đề
Vấn đề của fine-tuning LLM lớn không chỉ là tính toán — nó là bức tường bộ nhớ (memory wall).
Công thức đơn giản: để fine-tune một model với Adam optimizer, bạn cần:
- Weights: 2 bytes/param (FP16)
- Gradients: 2 bytes/param
- Optimizer states: 8 bytes/param (Adam giữ 2 bản sao FP32 cho mỗi param)
Với model 65B parameters, chỉ optimizer states đã ngốn 520GB. Kể cả khi dùng LoRA để giảm số lượng parameters cần cập nhật xuống còn 0.1%, bạn vẫn phải giữ base model ở FP16 trong VRAM để tính forward và backward. Điều này tạo ra "ngưỡng cứng" (hard floor): dù bạn có khéo léo đến đâu, bạn vẫn cần ít nhất 130GB cho model gốc cộng thêm bộ nhớ cho adapter và activation.
Hậu quả là fine-tuning model lớn trở thành đặc quyền của các lab có cluster GPU, trong khi developer cá nhân bị giới hạn ở model 7B-13B.
Ý tưởng cốt lõi
QLoRA (Quantized LoRA) dựa trên một insight đơn giản nhưng phản trực giác: trong quá trình fine-tuning, base model là bất biến (frozen), vậy tại sao phải lưu nó ở độ chính xác cao?
Nếu bạn không thay đổi base weights, bạn chỉ cần chúng để "đọc" (forward pass) và truyền gradient về (backward pass). Các trọng số này có thể được nén mạnh — giống như bạn đọc một cuốn sách scan từ PDF thấp chất lượng vẫn hiểu nội dung, dù không thể sửa chữa từng chữ trong đó.
Đây là cách QLoRA thực hiện điều đó:
1. 4-bit NormalFloat (NF4) — Nén thông minh
Trọng số neural network tuân theo phân phối chuẩn (Gaussian), tập trung quanh 0 với đuôi dài. Quantization thông thường (INT4) chia đều 16 giá trị (bins) trên toàn dải — lãng phí bins vào vùng tail ít dữ liệu và thiếu độ phân giải ở vùng center đông đúc.
NF4 làm ngược lại: nó đặt nhiều bins hơn gần 0 và ít hơn ở xa. Điều này tối ưu information-theoretically — với 4-bit (16 bins), NF4 bảo toàn ~99.9% thông tin của trọng số. Hãy tưởng tượng bạn dùng thước đo có vạch đặc ở giữa và thưa ở hai đầu để đo vật thể phân bố theo hình chuông — đó chính là NF4.
2. Double Quantization — Nén cả "từ điển"
Để giải nén 4-bit trở lại FP16, bạn cần các hằng số scale và zero-point (thường là FP32). Với model 65B, chỉ các hằng số này đã chiếm ~5GB. QLoRA áp dụng quantization đệ quy: nén các scale xuống 8-bit. Đây là "double quantization" — nén cả dữ liệu và metadata, giải phóng thêm ~0.5GB.
3. Paged Optimizers — Bộ nhớ ảo cho GPU
Khi batch size đột ngột tăng hoặc sequence dài, optimizer states có thể tràn VRAM. QLoRA dùng NVIDIA unified memory để tự động "page out" optimizer states sang RAM của CPU khi GPU hết bộ nhớ, rồi page-in khi cần. Điều này ngăn crash do OOM (Out of Memory) trong quá trình training.
4. Dequantization on-the-fly
Trong forward/backward pass, weights được giải nén từ 4-bit lên 16-bit chỉ trong thời gian tính toán trên từng layer, rồi ngay lập tức bị discard. Không bao giờ có toàn bộ model 16-bit trong bộ nhớ cùng lúc — chỉ có "cửa sổ trượt" (sliding window) của các layer đang tính.
5. LoRA adapters ở độ chính xác đầy đủ
Trong khi base model bị nén 4-bit, các adapter matrices và (của LoRA) được lưu ở FP16 và nhận gradients bình thường. Gradient backpropagate qua base model đã nén để cập nhật adapter — một mạng lưới "cầu nối" nhỏ gọn giữa trời và đất.
Kết quả: Bạn có thể fine-tune LLaMA 65B trên 48GB VRAM với chất lượng chỉ kém bản full-precision ~0.1% trên MMLU.
Tại sao nó hoạt động
Điều khiến QLoRA hoạt động không phải là "ma thuật nén dữ liệu", mà là tính dư thừa của neural networks.
Neural networks quá tham số (over-parameterized) — chúng có nhiều "độ tự do" hơn mức cần thiết để biểu diễn hàm số. Khi fine-tune, ta không cần di chuyển trong toàn bộ không gian tham số, chỉ cần điều chỉnh nhẹ theo hướng gradient. LoRA khai thác điều này bằng cách giả định rằng điều chỉnh cần thiết nằm trong một không gian con (subspace) nhỏ — hạng thấp (low-rank).
QLoRA đi xa hơn: vì base weights không thay đổi, chúng có thể được biểu diễn bằng "bản đồ thô" (4-bit) thay vì "bản đồ chi tiết" (16-bit). Lỗi quantization (nhiễu) được "làm tròn" (rounded) bởi chính quá trình fine-tuning của LoRA — adapter học cách bù đắp cho nhiễu trong base model, giống như bạn học lái xe trên đường gồ ghề bằng cách điều chỉnh vô-lăng (adapter) thay vì sửa đường (base model).
Về mặt toán học, backpropagation qua weights đã nén vẫn hoạt động vì gradient được tính xấp xỉ: . Sai số này nhỏ đến mức không ảnh hưởng đến hội tụ, đặc biệt khi learning rate của adapter được điều chỉnh phù hợp (thường cao hơn full fine-tuning một chút để bù đắp quantization noise).
Ý nghĩa thực tế
Sự dân chủ hóa fine-tuning: Trước QLoRA, fine-tune model 70B đòi hỏi cluster GPU trị giá hàng trăm nghìn đô. Sau QLoRA, một chiếc laptop gaming cao cấp (RTX 4090) có thể train model đó trong 24 giờ. Điều này thay đổi cục diện RAG (Retrieval-Augmented Generation) và domain adaptation — doanh nghiệp không cần thuê cloud instance A100 để fine-tune, họ có thể chạy local trên workstation.
Trade-offs thực tế:
- Chất lượng: Guanaco 65B (fine-tuned bằng QLoRA) đạt 99.3% hiệu suất của ChatGPT trên benchmark Vicuna, và được người dùng đánh giá cao hơn GPT-4 trong một số trường hợp (theo Elo ratings). Tuy nhiên, đây là fine-tune chất lượng cao; với dữ liệu kém hoặc rank thấp, mô hình có thể underperform.
- Inference: QLoRA không tăng tốc inference. Khi deploy, bạn vẫn cần dequantize weights hoặc merge adapter vào base model (có thể gây lỗi nhỏ). GPTQ hoặc AWQ thường được ưu tiên cho serving inference thuần túy.
- Giới hạn: QLoRA không giảm FLOPs, chỉ giảm memory. Nếu bạn cần train nhanh hơn (throughput), vẫn cần nhiều GPU với tensor parallelism hoặc pipeline parallelism.
Khi nào dùng: QLoRA lý tưởng cho:
- Fine-tune domain-specific (y tế, pháp lý) trên hardware consumer
- Experiments nhanh với model lớn để chọn hyperparameters trước khi chạy full training trên cluster
- Transfer learning với dataset nhỏ (vì LoRA ít overfit hơn full fine-tune)
Đào sâu hơn
Paper gốc: QLoRA: Efficient Finetuning of Quantized LLMs (Dettmers et al., NeurIPS 2023) — trình bày NF4, double quantization, và benchmark Guanaco.
Cùng cụm (Training Efficiency):
- PEFT Overview — Hiểu sâu về LoRA, prefix tuning và adapters — nền tảng để hiểu QLoRA
- Gradient Accumulation — Kết hợp với QLoRA để giả lập batch size lớn trên VRAM nhỏ
- DPO — Sau khi có QLoRA để train model lớn, dùng DPO để alignment mà không cần reward model riêng
Đọc tiếp:
- Training at Scale — Hiểu về ZeRO và sharding để so sánh với approach nén của QLoRA
- AWQ — Quantization cho inference (khác biệt giữa quantize để train vs quantize để chạy)
- Alignment Frontier — Các phương pháp alignment nâng cao áp dụng được trên model đã fine-tune bằng QLoRA
PEFT — Fine-tune LLM khổng lồ chỉ với 0.01% parameters: LoRA, Adapters, Prefix Tuning
Không cần 1TB VRAM để fine-tune LLM 100B parameters. PEFT cho phép bạn điều chỉnh mô hình khổng lồ chỉ bằng cách cập nhật 0.01% trọng số qua LoRA, Adapters hay Prefix Tuning — giảm memory từ terabyte xuống gigabyte mà vẫn giữ 99.9% hiệu suất.
DPO — RLHF không cần reward model, không cần RL loop
Direct Preference Optimization biến alignment thành bài toán phân loại nhị phân đơn giản, loại bỏ hoàn toàn vòng lặp PPO phức tạp và giảm 50% memory footprint