← Quay lại Blog
Công nghệ thông tin

Quantization Trong AI: Giảm Kích Thước Model 10 Lần Mà Vẫn Giữ Chất Lượng

Quantization Trong AI: Giảm Kích Thước Model 10 Lần Mà Vẫn Giữ Chất Lượng

Quantization là kỹ thuật nén mô hình AI bằng cách giảm độ chính xác số học (từ 32-bit float xuống 8-bit hoặc 4-bit integer), giúp giảm kích thước model từ 10-20 lần và tăng tốc inference 2-4 lần, trong khi chỉ mất khoảng 1-5% độ chính xác. Đây là công nghệ then chốt giúp chạy các mô hình lớn trên thiết bị cá nhân và tiết kiệm chi phí cloud.

Khi mô hình ngôn ngữ lớn ngày càng phình to (GPT-4 khoảng 1.7 trillion tham số, Llama 3.1 có phiên bản 405B), việc triển khai chúng trên production hoặc thiết bị cá nhân trở thành thách thức lớn. Một model 70 tỷ tham số ở độ chính xác FP32 chiếm tới 280GB bộ nhớ — vượt quá khả năng của hầu hết GPU tiêu dùng. Quantization là giải pháp được cả Google, Meta, OpenAI áp dụng để đưa AI ra khỏi data center.

Quantization là gì và hoạt động thế nào?

Quantization (lượng tử hóa) trong AI là quá trình chuyển đổi các trọng số (weights) và activation của mô hình từ biểu diễn số thực dấu phẩy động độ chính xác cao (thường là FP32 - 32 bit) sang biểu diễn số nguyên độ chính xác thấp hơn (như INT8 - 8 bit hoặc INT4 - 4 bit).

Ví dụ thực tế: một trọng số 0.847291 (FP32) có thể được mapping thành giá trị 108 (INT8) thông qua một scale factor. Khi cần tính toán, giá trị này sẽ được de-quantize trở lại gần đúng giá trị ban đầu.

Hai loại quantization chính:

  • Post-Training Quantization (PTQ): Áp dụng sau khi model đã train xong. Nhanh, đơn giản, nhưng có thể mất nhiều độ chính xác hơn.
  • Quantization-Aware Training (QAT): Mô phỏng quantization ngay trong quá trình training, giúp model “học cách thích nghi” với độ chính xác thấp hơn. Cho kết quả tốt hơn nhưng tốn thời gian training.

Hầu hết các công cụ hiện đại (llama.cpp, GGML, bitsandbytes) đều sử dụng PTQ vì tính tiện lợi — bạn có thể quantize một model open-source đã train sẵn trong vài phút.

Tại sao quantization lại quan trọng năm 2026?

Ba lý do chính khiến quantization trở thành kỹ thuật bắt buộc:

1. Giảm kích thước model (10-20 lần)

Một model 7B params (Llama 2 7B, Mistral 7B) ở FP32 chiếm ~28GB. Sau khi quantize:

  • FP16: ~14GB (giảm 50%)
  • INT8: ~7GB (giảm 75%)
  • INT4: ~3.5GB (giảm 87.5%)

Điều này có nghĩa là model vốn chỉ chạy được trên server 4x A100 giờ có thể chạy trên laptop gaming RTX 4060 8GB.

2. Tăng tốc inference (2-4 lần)

Phép toán số nguyên (integer arithmetic) nhanh hơn phép toán dấu phẩy động trên hầu hết phần cứng. Benchmark thực tế với Llama 2 7B trên RTX 3090:

  • FP16: ~25 tokens/giây
  • INT8: ~45 tokens/giây
  • INT4: ~60 tokens/giây (với một số loss về chất lượng)

3. Tiết kiệm chi phí cloud (40-70%)

Với dịch vụ cloud AI, bạn trả tiền theo RAM và compute. Một deployment sử dụng INT8 thay vì FP16 có thể giảm instance size đáng kể (ví dụ từ 4x GPU xuống 1x GPU trên AWS, giá tham khảo thay đổi theo region) — tiết kiệm 40-70% chi phí.

Đó là lý do các API như Together AI, Groq, Fireworks đều mặc định serve quantized models cho phần lớn requests.

Các mức quantization phổ biến: FP32 → FP16 → INT8 → INT4

FP32 (32-bit floating point) — Baseline

Đây là độ chính xác “đầy đủ” mà model được train. Mọi trọng số lưu bằng 32 bit. Chất lượng cao nhất nhưng tốn bộ nhớ và chậm nhất. Ít được dùng cho inference (chỉ dùng khi nghiên cứu hoặc benchmark).

FP16 (16-bit floating point) — Chuẩn production

Giảm kích thước 50%, tăng tốc ~1.5-2 lần. Hầu như không mất độ chính xác (thường <0.5% perplexity tăng). Đây là format mặc định mà hầu hết API (OpenAI, Anthropic, Google) sử dụng để serve models.

Khi nào dùng: Luôn luôn, trừ khi bạn cần tối ưu cực đoan hoặc bị giới hạn bộ nhớ nghiêm trọng.

INT8 (8-bit integer) — Sweet spot cho edge devices

Giảm kích thước 75%, tăng tốc ~2-3 lần. Mất khoảng 1-3% độ chính xác (đo bằng perplexity hoặc accuracy trên benchmark).

Khi nào dùng:

  • Chạy model lớn (13B-70B) trên GPU tiêu dùng (RTX 3080/4090)
  • Serve API với budget giới hạn
  • Mobile apps cần balance giữa tốc độ và chất lượng

Các framework hỗ trợ: bitsandbytes (Hugging Face), llama.cpp (GGUF), TensorRT-LLM.

INT4 (4-bit integer) — Extreme compression

Giảm kích thước 87.5%, tăng tốc ~3-4 lần. Mất khoảng 3-7% độ chính xác. Chất lượng output vẫn “dùng được” cho hầu hết tác vụ thông thường (chat, summarization, translation) nhưng có thể kém hơn rõ ràng trên các tác vụ phức tạp (reasoning, math, coding).

Khi nào dùng:

  • Chạy model rất lớn (70B+) trên hardware hạn chế
  • Prototype nhanh
  • Use case không đòi hỏi độ chính xác cao tuyệt đối

Một số kỹ thuật như GPTQ (gradient-based) và AWQ (activation-aware) giúp INT4 giữ chất lượng tốt hơn đáng kể. Nếu muốn đẩy model xuống 4-bit, đừng dùng quantization đơn giản — chọn GPTQ hoặc AWQ.

So sánh tổng quan

FormatKích thước (7B model)Tốc độ (tokens/s)Perplexity lossUse case
FP3228GB~150%Research
FP1614GB~25<0.5%Production API
INT87GB~451-3%Edge deployment
INT43.5GB~603-7%Extreme edge / prototype

(Số liệu ước tính trên RTX 3090, thực tế phụ thuộc vào implementation)

Công cụ và framework quantization thực tế

llama.cpp (GGUF) — Phổ biến nhất cho local inference

Format GGUF (GPT-Generated Unified Format) từ llama.cpp hỗ trợ đa dạng quantization: Q4_0, Q4_K_M, Q5_K_S, Q8_0… Cộng đồng Hugging Face đã quantize hầu hết các model open-source phổ biến.

Cách dùng:

# Tải model đã quantize sẵn từ Hugging Face
huggingface-cli download TheBloke/Llama-2-7B-GGUF \
  llama-2-7b.Q4_K_M.gguf

# Chạy với llama.cpp
./main -m llama-2-7b.Q4_K_M.gguf -p "Explain quantization"

Ưu điểm: Chạy trên CPU (không cần GPU), hỗ trợ Mac M1/M2 rất tốt, community lớn.

bitsandbytes — Cho Hugging Face Transformers

Library của Tim Dettmers, tích hợp sẵn vào transformers. Hỗ trợ INT8 và INT4 (với kỹ thuật QLoRA).

Cách dùng:

from transformers import AutoModelForCausalLM, BitsAndBytesConfig

quantization_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_compute_dtype=torch.float16
)

model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-2-7b-hf",
    quantization_config=quantization_config,
    device_map="auto"
)

Ưu điểm: Quantize on-the-fly (không cần file riêng), tích hợp tốt với HF ecosystem, hỗ trợ QLoRA (train adapter trên model đã quantize).

GPTQ / AWQ — Quantization thông minh cho INT4

  • GPTQ (GPT Quantization): Sử dụng gradient để tìm cách quantize tối ưu, giảm thiểu loss.
  • AWQ (Activation-aware Weight Quantization): Bảo vệ các trọng số “quan trọng” (activation lớn) khỏi bị quantize quá mạnh.

Cả hai đều cho chất lượng INT4 tốt hơn nhiều so với quantization đơn giản.

Cách dùng (với AutoGPTQ):

from transformers import AutoModelForCausalLM
from auto_gptq import AutoGPTQForCausalLM

model = AutoGPTQForCausalLM.from_quantized(
    "TheBloke/Llama-2-7B-GPTQ",
    device="cuda:0"
)

TensorRT-LLM (NVIDIA) — Production deployment

NVIDIA’s framework cho optimize và deploy LLMs. Hỗ trợ INT8/FP8, fused kernels, multi-GPU inference.

Khi nào dùng: Production deployments trên NVIDIA GPUs (A100, H100), cần throughput cao nhất.

Lựa chọn quantization phù hợp cho dự án của bạn

Flowchart quyết định nhanh:

  1. Có GPU đủ RAM cho FP16? → Dùng FP16 (chất lượng tốt nhất, speed tốt).
  2. GPU hơi thiếu RAM? → INT8 (balance tốt).
  3. Chạy trên CPU / Mac / laptop? → llama.cpp GGUF Q4_K_M hoặc Q5_K_S.
  4. Serve API production với chi phí thấp? → INT8 (bitsandbytes hoặc TensorRT).
  5. Prototype nhanh / không cần chất lượng cao? → INT4 (GPTQ/AWQ).

Lưu ý về fine-tuning: Nếu bạn định fine-tune model, nên train ở FP16 hoặc BF16, rồi quantize sau. QLoRA cho phép fine-tune trên base model đã INT4, nhưng chỉ nên dùng khi thiếu GPU.

Quantization với các modal khác (vision, audio)

Quantization không chỉ cho LLMs:

  • Vision models (YOLO, ResNet, ViT): INT8 quantization thường mất <2% mAP (mean Average Precision). PyTorch Mobile và TensorFlow Lite hỗ trợ tốt.
  • Speech models (Whisper, Wav2Vec): INT8 hoặc FP16, ít ảnh hưởng đến WER (Word Error Rate).
  • Multimodal models (GPT-4V, Gemini): Thường quantize riêng vision encoder và language decoder.

Công cụ: ONNX Runtime, TensorRT, OpenVINO đều hỗ trợ quantization cho đa dạng architectures.

FAQ

Quantization có làm giảm chất lượng output không?

Có, nhưng mức độ phụ thuộc vào mức quantization. FP16 hầu như không ảnh hưởng (<0.5%), INT8 mất 1-3%, INT4 mất 3-7%. Với hầu hết use case (chatbot, summarization, translation), mất 1-3% là chấp nhận được để đổi lấy 50-75% tiết kiệm bộ nhớ.

Có thể quantize model đã fine-tune được không?

Được. Quantization áp dụng sau khi fine-tune. Workflow đúng: pre-train → fine-tune (ở FP16/BF16) → quantize → deploy. Nếu bạn fine-tune trên model đã quantize (ví dụ QLoRA), chất lượng có thể kém hơn một chút so với fine-tune trên FP16 rồi quantize sau.

INT4 và INT8 có chạy nhanh hơn trên CPU không?

Có, nhưng không nhiều bằng trên GPU. Trên CPU, speedup chủ yếu đến từ giảm memory bandwidth (đọc ít data hơn), không phải compute (vì CPU hiện đại làm FP32 cũng nhanh). Trên GPU có Tensor Cores (NVIDIA) hoặc matrix engines (Apple M1/M2), INT8 nhanh hơn rõ rệt.

GPTQ và AWQ khác nhau thế nào?

  • GPTQ: Dùng gradient để quantize, tối ưu toàn bộ model. Chậm hơn (vài giờ cho model 70B), nhưng chất lượng ổn định.
  • AWQ: Chỉ bảo vệ một số trọng số “quan trọng”, nhanh hơn (vài chục phút), chất lượng thường tốt hơn GPTQ ở INT4.

Trong thực tế năm 2026, AWQ được ưa chuộng hơn vì nhanh và chất lượng tốt. Tuy nhiên cả hai đều tốt hơn nhiều so với quantization “naive”.

Có nên quantize model cho production API không?

Nên, nếu bạn tự host. Hầu hết production deployments dùng FP16 hoặc INT8. Ngay cả các nhà cung cấp lớn (OpenAI, Anthropic) cũng serve models ở FP16, không phải FP32. INT8 giúp tiết kiệm chi phí rất nhiều (40-70%) mà chất lượng chỉ giảm nhẹ.

Nếu dùng API của người khác (OpenAI, Claude…), bạn không cần lo — họ đã quantize rồi.

llama.cpp Q4_K_M và Q5_K_S khác nhau thế nào?

Đây là các quantization methods khác nhau trong GGUF:

  • Q4_K_M: 4-bit, “medium” quality, balance tốt giữa size và chất lượng. Phổ biến nhất.
  • Q5_K_S: 5-bit, “small” variant, chất lượng cao hơn Q4 một chút (~15% lớn hơn).
  • Q8_0: 8-bit, gần như không mất chất lượng, nhưng gấp đôi kích thước Q4.

Khuyến nghị: Thử Q4_K_M trước. Nếu thấy output kém, thử Q5_K_S hoặc Q8_0.


Đọc thêm: