Tracks
量化是让大型语言模型在消费级 GPU 上运行的最实用方法之一。与其使用需要大量显存的高精度权重,我们可以使用压缩的 4 位模型,让其适配如 NVIDIA RTX 4090 这样的 GPU。Google 的 Gemma 系列模型正是这股推动开放且强大的 AI 更易本地运行趋势的一部分。
在本教程中,我们将使用 llama.cpp 在本地运行 Gemma 4 12B,并对比基础版本与通过 量化感知训练(QAT) 微调后的版本。
同时,建议阅读我们关于 Google 模型的其他教程:使用 Gemma 4 和 Ollama 构建 AI 代理,以及如何微调 Gemma 4。
什么是量化?
量化是一种模型压缩技术,通过降低模型权重的精度来实现。
大型语言模型通常以 BF16 或 FP16 等高精度格式存储,质量更好但需要大量内存。量化会将这些权重转换为更低位宽的格式(如 8 位或 4 位),从而降低显存占用,使模型更易于在本地运行。Hugging Face 指出,8 位量化大致可将内存使用减半,而 4 位量化能进一步降低。
权衡在于,较低精度有时会降低输出质量,尤其当模型未针对量化进行优化时。通俗讲,BF16 和 FP16 通常提供最佳质量但占用更多内存;8 位模型更小且通常能保持较强质量;4 位模型更小,但可能损失一定准确性或稳定性。
对于本地推理而言,这种权衡往往是值得的,因为它让更大的模型可以在消费级 GPU 上运行,而无需昂贵的数据中心硬件。
什么是量化感知训练?
量化感知训练(QAT)是一种在训练或微调过程中模拟低精度行为的训练技术。这有助于模型在量化后保持更高的稳定性,并在低位宽下提升本地推理性能。
QAT 有何不同?
常见方法——训练后量化,是在模型训练完成后进行压缩。它简单易行,但模型可能因未经历低精度权重的训练而损失部分质量。
根据 Google AI Edge 文档,训练后量化是一个转换步骤,能降低模型大小并改善时延,通常仅带来很小的精度损失。不过,最终质量仍取决于模型本身与量化级别。
量化感知训练(QAT)采取了不同的路径。QAT 不是仅在训练后再量化,而是在训练或微调期间模拟低精度行为,帮助模型学会在稍后转换为更小格式时保持稳定,从而在压缩时尽可能减少质量损失。

这正是 Gemma 4 QAT 对本地 AI 有用的原因。它在设计时就考虑了量化,因此在占用更少内存的同时,能更好地保留原始模型质量。对于在消费级 GPU 上运行模型的用户而言,这意味着更好的低位稳定性、更低的显存占用,以及更实用的本地推理。
步骤 1:安装依赖并构建 llama.cpp
在下载模型之前,我们先准备本地运行环境。本文在一台配备 NVIDIA RTX 4090、24 GB 显存的机器上进行测试。我们将使用 llama.cpp 作为推理运行时,GGUF 作为模型格式,并使用 UD-Q4_K_XL 量化的模型文件。
测试环境:
- GPU:NVIDIA RTX 4090
- 显存:24 GB
- 运行时:llama.cpp
- 模型格式:GGUF
- 量化:UD-Q4_K_XL
我们将对比以下两个 Unsloth GGUF 模型:
- unsloth/gemma-4-12B-it-GGUF
- unsloth/gemma-4-12B-it-qat-GGUF
首先,检查您的 GPU 是否可用。
nvidia-smi

接下来,安装构建 llama.cpp 所需的系统包。
apt-get update
apt-get install pciutils build-essential cmake curl libcurl4-openssl-dev -y
克隆官方 llama.cpp 仓库。
git clone https://github.com/ggml-org/llama.cpp
现在以启用 CUDA 支持的方式构建 llama.cpp。这允许模型层在 GPU 上运行,而不只是使用 CPU。
cmake llama.cpp -B llama.cpp/build \
-DBUILD_SHARED_LIBS=OFF \
-DGGML_CUDA=ON
编译所需的二进制文件。
cmake --build llama.cpp/build \
--config Release \
-j \
--clean-first \
--target llama-cli llama-mtmd-cli llama-server llama-gguf-split

构建完成后,我们将主要使用的二进制是 llama-server。它可在本地运行 GGUF 模型,并提供 OpenAI 兼容的 API 端点,便于通过 curl 进行请求。
步骤 2:下载 Gemma 4 12B 的非 QAT 和 QAT 模型
现在 llama.cpp 已就绪,我们可以从 Hugging Face 下载 Gemma 4 12B 的两个模型变体。我们将下载常规的指令微调模型以及 QAT 版本(均为 GGUF 格式)。
首先,安装带有更快下载支持的 Hugging Face Hub CLI。
pip install -U "huggingface_hub[hf_xet]" hf-xet hf_transfer
启用高性能 Xet 下载。
export HF_XET_HIGH_PERFORMANCE=1
下载 GGUF 格式的常规模型(Gemma 4 12B 指令版)。
hf download unsloth/gemma-4-12B-it-GGUF \
--local-dir models/gemma-4-12B-it-GGUF \
--include "*mmproj-BF16*" \
--include "*UD-Q4_K_XL*"
然后,以相同的量化格式下载 QAT 版本。
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*"
--include 标志可确保只下载本教程所需的文件,而不是整个仓库。在这里,我们下载的是 UD-Q4_K_XL GGUF 模型文件,以及模型包所需的 mmproj-BF16 文件。
下载完成后,确认两个模型文件夹均已存在。
ls models
期望输出:
gemma-4-12B-it-GGUF
gemma-4-12B-it-qat-GGUF
此时,非 QAT 与 QAT 模型均已在本地可用,我们可以开始用 llama-server 提供服务。
步骤 3:使用 llama-server 运行非 QAT 模型
我们先运行常规的 Gemma 4 12B 指令模型,以便后续用相同设置与 QAT 版本进行对比。
使用 llama-server 启动非 QAT 模型。
./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

这会在 http://localhost:8001 启动一个本地的 OpenAI 兼容服务器。
打开另一个终端,向本地服务器发送请求。
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
}'
在该命令中,我们调用本地的 /v1/chat/completions 端点,其遵循 OpenAI 兼容的 API 格式。提示词要求模型解释量化感知训练;max_tokens 设为 512,以确保两个模型变体测试时输出长度一致。
在我们的 RTX 4090 测试中,非 QAT 模型的计时结果如下:
- 提示词 Token 数:40
- 补全 Token 数:512
- 提示处理速度:510.22 tokens/sec
- 生成速度:94.65 tokens/sec
- 总耗时:5.516 sec
GPU 显存占用为:
9247 MiB / 24564 MiB
以上即为常规 Gemma 4 12B 模型的基线表现。下一步我们将用相同配置运行 QAT 版本并比较结果。
步骤 4:运行并测试 QAT 模型
现在我们用相同的 llama-server 设置运行 Gemma 4 12B 的 QAT 版本。请在启动之前先停止上一个非 QAT 服务器,因为两条命令使用相同端口。
启动 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
这会在相同的本地 OpenAI 兼容端点 http://localhost:8001 启动 QAT 模型。

现在向 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
}'
在我们的 RTX 4090 测试中,QAT 模型的计时结果如下:
- 提示词 Token 数:40
- 补全 Token 数:512
- 提示处理速度:593.93 tokens/sec
- 生成速度:101.65 tokens/sec
- 总耗时:5.114 sec
GPU 显存占用为:
8627 MiB / 24564 MiB
您也可以复制本地服务器 URL(http://localhost:8001)并在浏览器中打开:

这会打开内置的 llama.cpp Web UI,提供一个类似 ChatGPT 的简单界面来测试本地模型。您可以直接在浏览器中与 QAT 模型对话、尝试不同提示词,并将其作为日常本地 AI 助手使用。
对比 QAT 与非 QAT 的结果
在使用相同提示词与服务器设置测试两个模型后,我们可以直接比较它们在 RTX 4090 上的表现。
|
指标 |
Gemma 4 12B 非 QAT |
Gemma 4 12B QAT |
|
量化 |
UD-Q4_K_XL |
UD-Q4_K_XL |
|
上下文长度 |
8192 |
8192 |
|
提示词 Token 数 |
40 |
40 |
|
补全 Token 数 |
512 |
512 |
|
提示处理速度 |
510.22 tokens/sec |
593.93 tokens/sec |
|
生成速度 |
94.65 tokens/sec |
101.65 tokens/sec |
|
总耗时 |
5.516 sec |
5.114 sec |
|
显存占用 |
9247 MiB |
8627 MiB |
在本次运行中,QAT 模型既更快也更轻。它比非 QAT 模型少用 620 MiB 显存,约减少 6.7%。对于本地推理而言,这很有价值,因为在消费级 GPU 上运行大模型时,节省的每一份显存都很重要。
QAT 模型的生成速度也更快,从 94.65 tokens/sec 提升到 101.65 tokens/sec,约提升 7.4%,将壁钟时间从 5.516 秒缩短到 5.114 秒。
在日常使用中,QAT 模型的交互更顺滑、更灵敏。本次测试中响应质量也更稳定——这正是 QAT 的主要价值:帮助模型在低位量化下更少地损失质量,同时保留压缩模型在内存与速度上的优势。
结语
Google 正在为本地 AI 社区做出卓越贡献。借助 Gemma 4 等模型和 QAT 等技术,在完全离线、甚至在消费级硬件上运行强大的 AI 模型正逐步变为现实。
更令人兴奋的是,这不仅仅是缩小模型体积。有了 QAT,我们并非单纯为适配而牺牲质量,而是得到在低位格式下运行更佳的模型,全面提升本地 AI 体验。在本次测试中,QAT 模型相较非 QAT 版本更快、更轻、更顺畅。
我也期待测试该模型的 MTP 版本,它可能进一步提升速度,或许可达 2 倍。这将大幅降低将更多工作流迁移到本地 AI 的门槛。我可以在本地运行模型,将其与 OpenCode 等工具连接,直接用私有本地助手编辑项目文件。
这股本地 AI 浪潮正在改变我们看待 AI 系统使用方式的方式。那些曾经需要大型云端部署的任务,尤其是涉及文本、图像与视频输入的多模态工作流,正逐步在本地机器上实现。对于重视隐私、速度与控制的开发者、研究者与建设者而言,这是非常令人振奋的方向。