LoRA và QLoRA: Fine-tuning LLM hiệu quả trên GPU hạn chế

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:

  1. Trọng lượng pretrained W được đóng băng (frozen) và không được cập nhật
  2. Hai ma trận B và A được khởi tạo ngẫu nhiên (B với Gaussian, A với 0)
  3. Trong quá trình forward pass, tính toán h = Wx + BAx
  4. 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ụ.

Sơ đồ kiến trúc Transformer Attention Head module - nơi LoRA chèn các ma trận low-rank vào lớp attention

Ư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.

Kiến trúc GPU máy tính - nền tảng phần cứng cho fine-tuning LLM với QLoRA

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

  1. Chọn mô hình pretrained: Llama 2, Mistral, Phi-2, etc.
  2. Chuẩn bị dataset: Định dạng prompt-completion hoặc instruction following
  3. Cấu hình LoRA: Thiết lập r, alpha, dropout, target modules
  4. Huấn luyện: Sử dụng trainer như HuggingFace TRL hoặc Axolotl
  5. 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

Sơ đồ kiến trúc Transformer đầy đủ - mô hình mà LoRA và QLoRA được áp dụng để fine-tuning

Ứ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.

Nguồn tham khảo

Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.

Bài viết liên quan

LLM Observability: LangSmith vs Arize AI vs HoneyHive

LLM Observability: LangSmith vs Arize AI vs HoneyHive Trong thời đại các mô hình LLM (Large Language Model) được triển khai rộng rãi trong các ứng dụng AI, việc giám…

Xem thêm

Multi-Query Attention: cách giảm 70% memory cho LLM lớn

Multi-Query Attention: cách giảm 70% memory cho LLM lớn Multi-Query Attention (MQA) là một kỹ thuật tối ưu kiến trúc Transformer giúp giảm đáng kể lượng bộ nhớ và thời…

Xem thêm

Vector database cho AI agents: ChromaDB vs Pinecone vs Weaviate

Vector database cho AI agents: ChromaDB vs Pinecone vs Weaviate Trong thời đại AI explosion, việc lưu trữ và truy vấn vector embeddings một cách hiệu quả đã trở thành…

Xem thêm
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất