Tracks
Lượng tử hóa là một trong những cách thực tế nhất để chạy các mô hình ngôn ngữ lớn trên GPU phổ thông. Thay vì dùng trọng số độ chính xác cao cần nhiều VRAM, chúng ta có thể dùng các mô hình nén 4-bit vừa vặn với những GPU như NVIDIA RTX 4090. Các mô hình Gemma của Google là một phần của xu hướng ngày càng tăng nhằm giúp chạy AI mở mạnh mẽ một cách dễ dàng trên máy cục bộ.
Trong hướng dẫn này, chúng ta sẽ chạy Gemma 4 12B tại chỗ bằng llama.cpp và so sánh phiên bản gốc của mô hình với một phiên bản khác đã được tinh chỉnh bằng Quantization-Aware Training (QAT).
Hãy nhớ đọc thêm các hướng dẫn khác về mô hình của Google: Xây dựng tác nhân AI với Gemma 4 và Ollama, và Cách tinh chỉnh Gemma 4.
Lượng tử hóa là gì?
Lượng tử hóa là một kỹ thuật nén mô hình giúp giảm độ chính xác của trọng số mô hình.
Các mô hình ngôn ngữ lớn thường được lưu ở định dạng độ chính xác cao như BF16 hoặc FP16, giúp giữ chất lượng nhưng tốn nhiều bộ nhớ. Lượng tử hóa chuyển các trọng số đó sang định dạng ít bit hơn, như 8-bit hoặc 4-bit, để mô hình dùng ít VRAM hơn và chạy cục bộ dễ dàng hơn. Hugging Face cho biết lượng tử hóa 8-bit có thể giảm khoảng một nửa mức dùng bộ nhớ, trong khi 4-bit còn giảm nhiều hơn nữa.
Đánh đổi ở đây là độ chính xác thấp hơn đôi khi có thể làm giảm chất lượng đầu ra, đặc biệt nếu mô hình không được tối ưu cho lượng tử hóa. Nói đơn giản, BF16 và FP16 thường cho chất lượng tốt nhất nhưng tốn nhiều bộ nhớ; mô hình 8-bit nhỏ hơn nhưng thường vẫn giữ chất lượng tốt, còn mô hình 4-bit nhỏ hơn nhiều nhưng có thể mất một phần độ chính xác hoặc độ ổn định.
Đối với suy luận cục bộ, sự đánh đổi này thường đáng giá vì nó cho phép chạy các mô hình lớn trên GPU phổ thông thay vì cần phần cứng trung tâm dữ liệu đắt tiền.
Huấn luyện nhận biết lượng tử hóa (QAT) là gì?
Quantization-Aware Training (QAT) là kỹ thuật huấn luyện trong đó mô hình được huấn luyện hoặc tinh chỉnh trong khi mô phỏng hành vi độ chính xác thấp. Điều này giúp mô hình ổn định hơn sau khi lượng tử hóa và có thể cải thiện hiệu năng suy luận cục bộ ở độ rộng bit thấp.
QAT khác gì?
Cách làm thông thường, lượng tử hóa sau huấn luyện, sẽ nén mô hình sau khi đã huấn luyện xong. Cách này đơn giản và thực dụng, nhưng mô hình có thể mất một phần chất lượng vì không được huấn luyện để xử lý trọng số độ chính xác thấp.
Theo tài liệu Google AI Edge, lượng tử hóa sau huấn luyện là một bước chuyển đổi có thể giảm kích thước mô hình và cải thiện độ trễ, thường chỉ mất ít độ chính xác. Tuy nhiên, chất lượng cuối cùng vẫn có thể phụ thuộc vào mô hình và mức độ lượng tử hóa.
Quantization-Aware Training, hay QAT, áp dụng một cách tiếp cận khác. Thay vì chỉ lượng tử hóa sau khi huấn luyện, QAT mô phỏng hành vi độ chính xác thấp ngay trong quá trình huấn luyện hoặc tinh chỉnh. Điều này giúp mô hình học cách giữ ổn định khi sau đó được chuyển sang định dạng nhỏ hơn. Nó giảm thiểu mất mát chất lượng khi mô hình được nén.

Đó là lý do Gemma 4 QAT hữu ích cho AI cục bộ. Nó được xây dựng với tư duy lượng tử hóa ngay từ đầu, nên có thể giữ lại nhiều chất lượng gốc của mô hình trong khi dùng ít bộ nhớ hơn. Với người dùng chạy mô hình trên GPU phổ thông, điều này có thể mang lại độ ổn định ở mức bit thấp tốt hơn, giảm dùng VRAM và trải nghiệm suy luận cục bộ thực tế hơn.
Bước 1: Cài đặt phụ thuộc và biên dịch llama.cpp
Trước khi tải mô hình, chúng ta cần chuẩn bị môi trường chạy cục bộ. Hướng dẫn này được kiểm thử trên máy có GPU NVIDIA RTX 4090 và 24 GB VRAM. Chúng ta sẽ dùng llama.cpp làm môi trường suy luận, GGUF làm định dạng mô hình, và các tệp mô hình lượng tử hóa UD-Q4_K_XL.
Thiết lập đã kiểm thử:
- GPU: NVIDIA RTX 4090
- VRAM: 24 GB
- Runtime: llama.cpp
- Định dạng mô hình: GGUF
- Lượng tử hóa: UD-Q4_K_XL
Chúng ta sẽ so sánh hai mô hình Unsloth GGUF sau:
- unsloth/gemma-4-12B-it-GGUF
- unsloth/gemma-4-12B-it-qat-GGUF
Trước tiên, kiểm tra GPU của bạn có sẵn hay không.
nvidia-smi

Tiếp theo, cài các gói hệ thống cần thiết để biên dịch llama.cpp.
apt-get update
apt-get install pciutils build-essential cmake curl libcurl4-openssl-dev -y
Clone kho chính thức của llama.cpp.
git clone https://github.com/ggml-org/llama.cpp
Bây giờ biên dịch llama.cpp với hỗ trợ CUDA được bật. Điều này cho phép các tầng mô hình chạy trên GPU thay vì chỉ trên CPU.
cmake llama.cpp -B llama.cpp/build \
-DBUILD_SHARED_LIBS=OFF \
-DGGML_CUDA=ON
Biên dịch các tệp thực thi cần thiết.
cmake --build llama.cpp/build \
--config Release \
-j \
--clean-first \
--target llama-cli llama-mtmd-cli llama-server llama-gguf-split

Sau khi biên dịch xong, tệp thực thi chính chúng ta sẽ dùng là llama-server. Nó cho phép chạy mô hình GGUF tại chỗ và cung cấp một endpoint API tương thích OpenAI mà chúng ta có thể truy vấn bằng curl.
Bước 2: Tải các mô hình Gemma 4 12B Non-QAT và QAT
Bây giờ llama.cpp đã sẵn sàng, chúng ta có thể tải cả hai biến thể mô hình Gemma 4 12B từ Hugging Face. Chúng ta sẽ tải mô hình instruction-tuned thông thường và phiên bản QAT ở định dạng GGUF.
Trước hết, cài CLI của Hugging Face Hub với hỗ trợ tải nhanh hơn.
pip install -U "huggingface_hub[hf_xet]" hf-xet hf_transfer
Bật chế độ tải Xet hiệu năng cao.
export HF_XET_HIGH_PERFORMANCE=1
Tải mô hình Gemma 4 12B instruction thông thường ở định dạng GGUF.
hf download unsloth/gemma-4-12B-it-GGUF \
--local-dir models/gemma-4-12B-it-GGUF \
--include "*mmproj-BF16*" \
--include "*UD-Q4_K_XL*"
Tiếp theo, tải phiên bản QAT với cùng định dạng lượng tử hóa.
hf download unsloth/gemma-4-12B-it-qat-GGUF \
--local-dir models/gemma-4-12B-it-qat-GGUF \
--include "*mmproj-BF16*" \
--include "*UD-Q4_K_XL*"
Các cờ --include đảm bảo chúng ta chỉ tải về các tệp cần cho hướng dẫn này, thay vì kéo toàn bộ kho. Ở đây, chúng ta đang tải các tệp mô hình GGUF UD-Q4_K_XL và các tệp mmproj-BF16 được gói mô hình sử dụng.
Sau khi tải xong, xác nhận rằng cả hai thư mục mô hình đều có mặt.
ls models
Kết quả kỳ vọng:
gemma-4-12B-it-GGUF
gemma-4-12B-it-qat-GGUF
Tại thời điểm này, cả mô hình non-QAT và QAT đều đã sẵn sàng cục bộ, và chúng ta có thể bắt đầu phục vụ chúng bằng llama-server.
Bước 3: Chạy mô hình Non-QAT với llama-server
Chúng ta sẽ bắt đầu bằng cách chạy mô hình Gemma 4 12B instruction thông thường. Điều này cung cấp đường cơ sở để sau đó so sánh với phiên bản QAT bằng cùng thiết lập.
Khởi động mô hình non-QAT với llama-server.
./llama.cpp/llama-server \
-m models/gemma-4-12B-it-GGUF/*UD-Q4_K_XL*.gguf \
--host 0.0.0.0 \
--port 8001 \
--ctx-size 8192 \
--n-gpu-layers 99 \
--temp 1.0 \
--top-p 0.95 \
--top-k 64

Lệnh này khởi động một máy chủ tương thích OpenAI cục bộ tại http://localhost:8001.
Mở một terminal khác và gửi yêu cầu tới máy chủ cục bộ.
time curl http://localhost:8001/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "gemma-4-12B-it",
"messages": [
{
"role": "system",
"content": "You are a helpful local AI assistant."
},
{
"role": "user",
"content": "Explain why quantization-aware training is useful for running LLMs on consumer GPUs."
}
],
"temperature": 1.0,
"top_p": 0.95,
"max_tokens": 512
}'
Trong lệnh này, chúng ta dùng endpoint cục bộ /v1/chat/completions theo định dạng API tương thích OpenAI. Prompt yêu cầu mô hình giải thích về huấn luyện nhận biết lượng tử hóa, và max_tokens được đặt là 512 để đảm bảo cả hai biến thể mô hình đều được kiểm thử với cùng độ dài đầu ra.
Trong thử nghiệm với RTX 4090, mô hình non-QAT cho kết quả thời gian như sau:
- Token của prompt: 40
- Token phần sinh: 512
- Tốc độ xử lý prompt: 510.22 token/giây
- Tốc độ sinh: 94.65 token/giây
- Tổng thời gian: 5.516 giây
Mức dùng bộ nhớ GPU:
9247 MiB / 24564 MiB
Điều này cho chúng ta đường cơ sở hiệu năng cho mô hình Gemma 4 12B thông thường. Ở bước tiếp theo, chúng ta sẽ chạy phiên bản QAT với cùng cấu hình và so sánh kết quả.
Bước 4: Chạy và kiểm thử mô hình QAT
Giờ chúng ta sẽ chạy phiên bản QAT của Gemma 4 12B với cùng thiết lập llama-server. Hãy đảm bảo dừng máy chủ non-QAT trước khi khởi động phiên bản này, vì cả hai lệnh dùng cùng một cổng.
Khởi động mô hình QAT.
./llama.cpp/llama-server \
-m models/gemma-4-12B-it-qat-GGUF/*UD-Q4_K_XL*.gguf \
--host 0.0.0.0 \
--port 8001 \
--ctx-size 8192 \
--n-gpu-layers 99 \
--temp 1.0 \
--top-p 0.95 \
--top-k 64
Lệnh này khởi động mô hình QAT trên cùng endpoint tương thích OpenAI cục bộ, http://localhost:8001.

Bây giờ hãy gửi cùng một prompt kiểm thử tới mô hình QAT.
time curl http://localhost:8001/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "gemma-4-12B-it-qat",
"messages": [
{
"role": "system",
"content": "You are a helpful local AI assistant."
},
{
"role": "user",
"content": "Explain why quantization-aware training is useful for running LLMs on consumer GPUs."
}
],
"temperature": 1.0,
"top_p": 0.95,
"max_tokens": 512
}'
Trong thử nghiệm với RTX 4090, mô hình QAT cho kết quả thời gian như sau:
- Token của prompt: 40
- Token phần sinh: 512
- Tốc độ xử lý prompt: 593.93 token/giây
- Tốc độ sinh: 101.65 token/giây
- Tổng thời gian: 5.114 giây
Mức dùng bộ nhớ GPU:
8627 MiB / 24564 MiB
Bạn cũng có thể sao chép URL máy chủ cục bộ (http://localhost:8001) và dán vào trình duyệt:

Thao tác này mở giao diện web tích hợp của llama.cpp, cung cấp cho bạn một giao diện giống ChatGPT đơn giản để kiểm thử mô hình cục bộ. Bạn có thể dùng nó để trò chuyện trực tiếp với mô hình QAT trong trình duyệt, thử nghiệm prompt và sử dụng mô hình như một trợ lý AI cục bộ hằng ngày.
So sánh kết quả QAT và Non-QAT
Sau khi kiểm thử cả hai mô hình với cùng prompt và thiết lập máy chủ, chúng ta có thể so sánh trực tiếp hiệu năng của chúng trên RTX 4090.
|
Chỉ số |
Gemma 4 12B Non-QAT |
Gemma 4 12B QAT |
|
Lượng tử hóa |
UD-Q4_K_XL |
UD-Q4_K_XL |
|
Kích thước ngữ cảnh |
8192 |
8192 |
|
Token của prompt |
40 |
40 |
|
Token phần sinh |
512 |
512 |
|
Tốc độ xử lý prompt |
510.22 token/giây |
593.93 token/giây |
|
Tốc độ sinh |
94.65 token/giây |
101.65 token/giây |
|
Tổng thời gian |
5.516 giây |
5.114 giây |
|
Mức dùng VRAM |
9247 MiB |
8627 MiB |
Trong lần chạy này, mô hình QAT vừa nhanh hơn vừa nhẹ hơn so với mô hình non-QAT. Nó dùng 620 MiB VRAM ít hơn, giảm khoảng 6,7%. Điều này hữu ích cho suy luận cục bộ vì tiết kiệm từng chút VRAM đều quan trọng khi chạy mô hình lớn trên GPU phổ thông.
Mô hình QAT cũng sinh token nhanh hơn, tăng từ 94.65 token/giây lên 101.65 token/giây. Đây là mức tăng khoảng 7,4% về tốc độ sinh, giảm thời gian thực từ 5,516 giây xuống 5,114 giây.
Trong sử dụng hằng ngày, mô hình QAT cho cảm giác mượt và phản hồi nhanh hơn. Chất lượng phản hồi cũng có vẻ ổn định hơn trong thử nghiệm này, vốn là lý do chính QAT hữu ích: nó giúp mô hình xử lý lượng tử hóa bit thấp với ít mất mát chất lượng hơn, đồng thời vẫn giữ lợi ích về bộ nhớ và tốc độ của mô hình nén.
Tổng kết
Google đang làm những việc tuyệt vời cho cộng đồng AI cục bộ. Với các mô hình như Gemma 4 và những kỹ thuật như QAT, giấc mơ chạy các mô hình AI mạnh mẽ tại chỗ, hoàn toàn ngoại tuyến và thậm chí trên phần cứng phổ thông đang dần trở thành hiện thực.
Điều thú vị nhất là đây không chỉ là chuyện giảm kích thước mô hình. Với QAT, chúng ta không đơn thuần chấp nhận giảm chất lượng để mô hình vừa vặn. Chúng ta có được các mô hình được thiết kế để chạy tốt hơn ở định dạng ít bit, cải thiện toàn bộ trải nghiệm AI cục bộ. Trong thử nghiệm này, mô hình QAT nhanh hơn, nhẹ hơn và mượt mà hơn phiên bản non-QAT.
Hiện tôi rất mong được thử phiên bản MTP của mô hình, có thể còn tăng tốc hơn nữa, có khả năng gấp đôi. Điều đó sẽ giúp tôi dễ dàng chuyển nhiều phần công việc sang AI cục bộ hơn. Tôi có thể chạy mô hình tại chỗ, kết nối với các công cụ như OpenCode và bắt đầu chỉnh sửa tệp dự án trực tiếp với một trợ lý cục bộ riêng tư.
Làn sóng AI cục bộ mới này đang thay đổi cách chúng ta nghĩ về việc sử dụng hệ thống AI. Những tác vụ từng cần thiết lập đám mây lớn, đặc biệt là quy trình đa phương thức với đầu vào văn bản, hình ảnh và video, đang dần trở nên khả thi trên máy cục bộ. Với các nhà phát triển, nhà nghiên cứu và những người xây dựng coi trọng quyền riêng tư, tốc độ và khả năng kiểm soát, đây là một hướng đi rất đáng kỳ vọng.
Là một nhà khoa học dữ liệu được chứng nhận, tôi đam mê tận dụng công nghệ tiên tiến để tạo ra các ứng dụng học máy đổi mới. Với nền tảng vững chắc về nhận dạng giọng nói, phân tích và báo cáo dữ liệu, MLOps, AI hội thoại và NLP, tôi đã rèn giũa kỹ năng phát triển các hệ thống thông minh có thể tạo ra tác động thực sự. Bên cạnh chuyên môn kỹ thuật, tôi cũng là một người truyền đạt tốt, có khả năng chắt lọc các khái niệm phức tạp thành ngôn ngữ rõ ràng, súc tích. Nhờ đó, tôi trở thành một blogger được nhiều người quan tâm trong lĩnh vực khoa học dữ liệu, chia sẻ góc nhìn và kinh nghiệm với cộng đồng các chuyên gia dữ liệu ngày càng lớn. Hiện tại, tôi tập trung vào sáng tạo và biên tập nội dung, làm việc với các mô hình ngôn ngữ lớn để phát triển nội dung mạnh mẽ và hấp dẫn, giúp doanh nghiệp và cá nhân tận dụng tối đa dữ liệu của mình.
