Skip to content

Zoom-in: Quantization

Karify98·
Cover Image for Zoom-in: Quantization

Một mô hình ngôn ngữ lớn như Llama-3 với 70 tỷ parameter thường yêu cầu hệ thống máy chủ chuyên dụng với nhiều GPU cao cấp để vận hành. Tuy nhiên, hiện nay bạn hoàn toàn có thể chạy mượt mà mô hình này ngay trên một chiếc laptop cá nhân.

Bí thuật đằng sau phép màu này là Quantization (lượng tử hóa) – nghệ thuật "ép cân" mô hình bằng cách rút gọn độ chính xác toán học của các weight (trọng số).

Hãy phóng to vào cấu trúc lưu trữ của mô hình ngôn ngữ lớn.


Layer 1 — Vấn đề: Trọng lượng khổng lồ của các tham số

Bên trong mô hình, các weight quyết định tri thức của hệ thống được lưu dưới dạng số thực dấu phẩy động. Theo mặc định, các mô hình thường được huấn luyện ở độ chính xác 16-bit (Float16) hoặc 32-bit (Float32).

  • Ở độ chính xác Float16, mỗi weight tiêu tốn 2 byte bộ nhớ.
  • Với mô hình 70 tỷ parameter (70B), dung lượng VRAM tối thiểu để tải mô hình là: $$70 \times 10^9 \times 2 \text{ bytes} \approx 140\text{GB}$$

Con số này vượt xa dung lượng phần cứng của mọi máy tính cá nhân thông thường. Để chạy được mô hình tại nhà, bắt buộc chúng ta phải tìm cách giảm dung lượng của các con số này.


Layer 2 — Giải pháp: Ánh xạ từ liên tục sang rời rạc

Quantization là quá trình chuyển đổi biểu diễn weight từ kiểu số thực có độ chính xác cao (như Float16 - 16 bit) sang kiểu số nguyên có độ chính xác thấp hơn (như INT8 - 8 bit, hoặc INT4 - 4 bit).

Hãy tưởng tượng bạn có một cây thước đo dài 1 mét và có khả năng đo chính xác đến từng phần triệu mét. Bây giờ, bạn được yêu cầu làm tròn và chỉ sử dụng 256 vạch chia cố định (tương đương kiểu số nguyên 8-bit với $2^8 = 256$ trạng thái).

Dãy số thực Float16:   [-3.1415,  -1.2045,  0.0000,  1.8902,  2.7182]
                             │         │       │        │        │
                             ▼         ▼       ▼        ▼        ▼
Dãy số nguyên INT4:    [-8,       -3,      0,       5,       7]

Để thực hiện việc này, chúng ta sử dụng một hệ số tỷ lệ (scale) và một điểm gốc không (zero-point) để ánh xạ dải số thực liên tục vào các vạch chia số nguyên rời rạc: $$\text{Quantized Weight} = \text{round}\left( \frac{\text{Raw Weight}}{\text{Scale}} \right) + \text{Zero-point}$$

Nhờ việc chuyển đổi này, mỗi weight từ chỗ tốn 2 byte (Float16) nay chỉ còn tốn 1 byte (INT8) hoặc 0.5 byte (INT4). Mô hình 70B từ 140GB VRAM được thu gọn chỉ còn khoảng 35GB ở phiên bản 4-bit, giúp nó vừa vặn với các máy tính cá nhân cấu hình tầm trung.

Quantization giúp giảm dung lượng mô hình từ 3 đến 4 lần mà hầu như không cần nâng cấp phần cứng.

Layer 3 — Sự đánh đổi: Perplexity và các định dạng phổ biến

Việc làm tròn số chắc chắn sẽ gây ra sai số. Trong AI, sai số này được đo lường bằng Perplexity (độ hỗn loạn) – chỉ số thể hiện mức độ bối rối của mô hình khi dự đoán từ tiếp theo. Chỉ số này tăng lên nghĩa là mô hình kém thông minh đi một chút.

Tuy nhiên, các nghiên cứu thực tế cho thấy, việc giảm xuống phiên bản 4-bit chỉ làm tăng Perplexity ở mức rất nhỏ (dưới 1%), trong khi hiệu quả giải phóng bộ nhớ lại cực kỳ lớn.

graph TD
    A[Mô hình gốc Float16: 140GB] -->|Quantization| B(INT8: 70GB - Giữ nguyên trí thông minh)
    A -->|Quantization| C(INT4: 35GB - Rất phổ biến cho máy cá nhân)
    A -->|Quantization| D(INT2: 17.5GB - Bắt đầu mất độ chính xác nghiêm trọng)
    style A fill:#1e293b,stroke:#475569,color:#cbd5e1
    style B fill:#1e293b,stroke:#475569,color:#cbd5e1
    style C fill:#1e293b,stroke:#475569,color:#cbd5e1
    style D fill:#1e293b,stroke:#475569,color:#cbd5e1

Hiện nay, có ba định dạng Quantization phổ biến nhất khi làm việc với mô hình chạy local (cục bộ):

  1. GGUF: Định dạng tối ưu nhất để chạy mô hình trên CPU hoặc Apple Silicon (Macbook). Định dạng này cho phép chạy lai (offload một phần tính toán từ GPU sang CPU).
  2. AWQ (Activation-aware Weight Quantization): Chỉ lượng tử hóa sâu các weight ít quan trọng, giữ lại độ chính xác cao cho các weight cốt lõi. AWQ chạy rất nhanh trên GPU chuyên dụng.
  3. GPTQ: Phương pháp Post-Training Quantization (PTQ - lượng tử hóa sau huấn luyện) tối ưu hóa ma trận lỗi, giúp đạt tốc độ suy luận cực cao trên GPU Nvidia.
Lời khuyên: Nếu chạy trên máy tính cá nhân không có card đồ họa khủng, hãy ưu tiên chọn định dạng GGUF bản 4-bit (ký hiệu Q4_K_M). Đây là tỷ lệ tối ưu nhất giữa tài nguyên và trí tuệ mô hình.

Full picture

graph TD
    FloatWeight[Trọng số thực: Float16 / Float32] -->|Quantization Process| Mapping[Ánh xạ tuyến tính: nhân Scale & cộng Zero-point]
    Mapping -->|Làm tròn sang số nguyên| IntWeight[Trọng số nguyên: INT8 / INT4]
    
    subgraph Kịch bản triển khai phần cứng
        IntWeight -->|Định dạng GGUF| CPU[CPU & Apple Silicon Macbook]
        IntWeight -->|Định dạng AWQ| GPU_AWQ[GPU chuyên dụng - Lượng tử hóa theo activation]
        IntWeight -->|Định dạng GPTQ| GPU_GPTQ[GPU Nvidia - Tối ưu hóa ma trận lỗi]
    end

Takeaway

Quantization là kỹ thuật tối ưu cốt lõi giúp đưa các mô hình ngôn ngữ lớn (LLM) khổng lồ vào vận hành trên các thiết bị cá nhân có tài nguyên hạn chế. Bằng cách làm tròn và lưu trữ các trọng số (weight) từ dạng số thực dấu phẩy động 16-bit (Float16) sang số nguyên 8-bit hoặc 4-bit (INT8/INT4), dung lượng mô hình được nén lại từ 3 đến 4 lần. Sai số làm tròn làm tăng nhẹ độ hỗn loạn (Perplexity) của mô hình nhưng không đáng kể so với hiệu quả giải phóng bộ nhớ đồ họa (VRAM), mở đường cho việc phổ cập hóa AI chạy cục bộ thông qua các định dạng như GGUF, AWQ và GPTQ.

Related Posts