TL;DR: Gemma 4 12B QAT scores 72% on LiveCodeBench and runs comfortably on an 8 GB GPU. But naive Q4_0 conversion degrades accuracy by ~75%, Unsloth GGUFs are mandatory, and tool calling requires the
--jinjaflag or a custom chat template — all issues that will silently break your setup if you miss them.
The Model That Fits Everywhere
Gemma 4 12B is Google’s latest release in their open-weight lineup. It bridges the gap between the edge-friendly E4B and the larger 26B MoE, packaging strong generalist capabilities into a 7 GB footprint at QAT Q4_0 precision — about one-quarter of the full bfloat16 model (26.7 GB).
What makes it different from Gemma 3 is architecture: hybrid attention that interleaves local sliding window with global attention, encoder-free multimodal support (text + image + audio in a single decoder), and 256K context length. For coding tasks specifically, the jump is dramatic — LiveCodeBench v6 scores went from 29.1% (Gemma 3 27B) to 72.0% for the 12B variant.
Coding Benchmarks
Google doesn’t publish HumanEval or MBPP separately for the 12B variant, but here’s what they do report:
| Benchmark | Gemma 4 12B Unified | Gemma 4 26B A4B | Gemma 4 31B |
|---|---|---|---|
| LiveCodeBench v6 | 72.0% | 77.1% | 80.0% |
| Codeforces ELO | 1,659 | 1,718 | 2,150 |
| Tau2 (tool-calling) | 69.0% | 68.2% | 76.9% |
For comparison, Gemma 3 27B scored just 29.1% on LiveCodeBench and 110 ELO — the coding gap between generations reversed entirely.
What Is QAT? Why It Matters for Coding
Quantization-Aware Training (QAT) simulates quantization during training rather than compressing a fully trained model afterward (Post-Training Quantization, PTQ). The model learns to compensate for precision loss while still training — so the compressed version retains near-bfloat16 accuracy.
For coding tasks specifically, QAT matters because:
- Subtle reasoning flips — Standard PTQ can cause small “flips” in intermediate reasoning steps that break code generation chains
- Long context retention — Coding requires long contexts (entire files/repos). QAT models maintain quality at 256K tokens where PTQ degrades more noticeably
- Structured output reliability — A Reddit user who tested both side-by-side found the QAT version “consistently produced valid structured outputs such as complex JSON” while standard quantized versions had occasional failures
The Unsloth benchmark on Gemma 3 confirmed this: their Q4_0 QAT model scored 67.07% MMLU vs 67.15% for full bfloat16 — only ~0.08% loss at 4-bit precision.
The Critical Pitfall: Naive Q4_0 Conversion Destroys Accuracy
This is the most important thing to know before deploying Gemma 4 QAT:
“We found that naively converting the QAT Q4_0 checkpoint to Q4_0 in llama.cpp land actually degraded accuracy and was not actually aligned with the BF16 QAT lattice for Q4_0.” — Unsloth documentation
The root cause: llama.cpp uses F16 scales while QAT BF16 uses BF16 scales, and the conversion is not lossless. A naive Q4_0 conversion achieves only 24.77% byte exactness against the original QAT model.
Unsloth’s dynamic quantization method (UD-Q4_K_XL) fixes this by achieving 99.96% byte exactness. For the 26B-A4B variant, accuracy jumps from 70.2% (naive) to 85.6% (+15.6%) with their method.
There’s another paradox: higher precision can DEGRADE accuracy. Unsloth reports that precisions higher than UD-Q4_K_XL degrade quality rather than improve it — the opposite of normal PTQ behavior where Q8_0 > Q4_0.
User-Reported Parameter Settings
From Reddit (r/LocalLLaMA) and community testing, here are the settings users recommend:
Recommended Defaults
--temp 1.0 --top-p 0.95 --top-k 64These are the same settings the full-precision models use; QAT does not change them. From Lushbinary’s self-hosting guide:
“Set Gemma 4’s recommended sampling for best results:
temperature 1.0,top_p 0.95,top_k 64. These are the same settings the full-precision models use; QAT does not change them.”
Real-World llama.cpp Command with MTP Drafting
A Reddit user achieved 120 tok/s on 12 GB VRAM with this setup:
llama-server \ -m gemma-4-12B-it-qat-UD-Q4_K_XL.gguf \ --model-draft gemma-4-12B-it-qat-assistant-MTP-Q8_0.gguf \ --spec-type draft-mtp \ --spec-draft-n-max 4 \ --ctx-size 131072 \ --temp 1.0 \ --top-p 0.95 \ --top-k 64Tool Calling Requires --jinja
A Reddit PSA post titled “Gemma 4 12B is NOT completely broken for coding and tool calling, you need a special chat template” documents that:
./build/bin/llama-server -hf unsloth/gemma-4-12b-it-GGUF:UD-Q8_K_XL \ --host 127.0.0.1 --port 8899 --jinja \ --chat-template-file ./custom-pub-chat-template-gemma4.jinjaThe user notes: “I’m not saying the results are great, or good, or better or worse than Qwen 3 9B or any other model! But with this setting, the tool calling works.”
VRAM Requirements by Quantization Level
| Quant | Memory (approx) | Notes |
|---|---|---|
| BF16/FP16 | ~25 GB | Full precision — A6000 / dual-4090 territory |
| Q8_0 | 13–14 GB | Comfortable on RTX 4090 with small context |
| UD-Q4_K_XL | 7–8 GB | Recommended for most users — fits on 8 GB GPUs |
| UD-IQ2_M (extreme) | ~3–4 GB | CPU-only viable territory |
| QAT w4a16 (vLLM/sglang) | ~6.7 GB weights + KV cache | For serving with compressed-tensors format |
Google’s official table confirms the weight-only footprint at each precision level:
| Precision | Memory (weights only) |
|---|---|
| BF16 | 26.7 GB |
| SFP8 | 13.4 GB |
| Q4_0 | 6.7 GB |
KV cache overhead at full 256K context adds ~8–10 GB+ on top of weights — so practical minimum for 256K is closer to 16 GB even at Q4.
Inference Engine Comparison
Ollama — One Command, Works Immediately
ollama run gemma4:12b # 7.6GB download, Q4-ish quantSimplest option for quick local chat. But Ollama v0.20.3 has a streaming bug that routes tool-call responses to the wrong field on Apple Silicon — upgrade to v0.20.5+ before using it agentic workflows.
llama.cpp — Maximum Control / CPU Support
Best option for single-user setups and CPU inference. Download from unsloth/gemma-4-12b-it-GGUF on HuggingFace — choose UD-Q4_K_XL for the best quality/size tradeoff.
./llama-cli -m gemma-4-12b-it-Q4_K_M.gguf --ctx-size 8192 \ --chat-template-kwargs '{"enable_thinking":false}' \ --temp 1.0 --top-p 0.95 --top-k 64Unsloth’s KL divergence benchmarks across 53 GGUF quants show that UD quantizations dominate the Pareto frontier — 8 of 9 UD quants are best at their size. ggml-org and lmstudio-community quants never appear on the Pareto frontier (except Q8_0 where everyone ties).
vLLM — Production Serving with Compressed Tensors
Google provides official QAT checkpoints specifically formatted for vLLM/SGLang:
python -m vllm.entrypoints.openai.api_server \ --model google/gemma-4-12B-it-qat-w4a16-ctThe w4a16-ct format uses 4-bit weights with 16-bit activations via compressed-tensors integration. Optimized for high-concurrency cloud serving.
sglang — Docker or Pip, Full Multimodal Support
docker run --gpus all --ipc=host --shm-size 32g \ lmsysorg/sglang:dev-gemma-4-12B \ sglang serve --model-path google/gemma-4-12B-it \ --reasoning-parser gemma4 --tool-call-parser gemma4 \ --host 0.0.0.0 --port 30000SGLang includes specialized Triton fused kernels (RMSNorm + residual) optimized for Gemma 4’s architecture. Has a dedicated cookbook page covering installation, deployment with reasoning and tool-call parsers, vision/audio/text invocation, and speculative decoding.
Real-World Coding Test Report
Daniel Vaughan’s Medium article provides the most detailed real-world coding test using Codex CLI — comparing Gemma 4 26B-A4B on an M4 Pro Mac (via llama.cpp) vs the 31B dense model on NVIDIA GB10:
| Metric | Mac (26B MoE, Q4_K_M) | GB10 (31B Dense, Q4_K_M) |
|---|---|---|
| Tool calls needed | 10 | 3 |
| Test write attempts | 5 | 1 |
| Token speed | 5.1x faster | Baseline |
| Total time | 4m 42s | 6m 59s |
| Code quality | Dead code left, heredoc errors | Clean, solid error handling |
“The Mac generated tokens 5.1 times faster. It still finished only 30 per cent sooner. The time went into retries: ten tool calls instead of three, five failed test writes and dead code.”
The takeaway: speed doesn’t equal productivity for coding tasks. More capable models make fewer mistakes overall, even if they’re slower per token.
QAT vs Standard Quantization — Side-by-Side Verdict
Reddit user Artaherzadeh tested all three variants (QAT Q4_0, standard PTQ Q4_K_M, and E4B Q8_0) on real algorithmic coding tasks rather than relying on benchmarks:
| Aspect | QAT (Q4_0) | Standard (Q4_K_M) |
|---|---|---|
| Algorithmic coding | Correct output | Correct output |
| Creative writing | ”Felt slightly more creative” | — |
| Fact-heavy explanations | ”Retained obscure technical details more accurately” | Good but less precise |
| Structured outputs | ”Consistently produced valid structured outputs such as complex JSON” | Some failures reported |
“Best Overall: Gemma 4 12B (Q4_K_M)” — the user’s final verdict “If creative writing is your priority, the QAT version has a slight edge. However, the difference isn’t large enough to justify keeping both 12B models on disk.”
For coding specifically, the difference is negligible — both produce correct code. The QAT advantage shows up in structured outputs and long-context retention rather than raw algorithmic correctness.
Quick Start by Use Case
| Need | Recommended Setup |
|---|---|
| Quick local chat | ollama run gemma4:12b |
| Maximum control / CPU inference | llama.cpp + Unsloth UD-Q4_K_XL GGUF (~8 GB) |
| Production serving | vLLM or sglang with QAT w4a16 compressed-tensors |
| Speculative decoding | vLLM/sglang with Google’s MTP drafter models |
| Tool calling / agentic workflows | llama.cpp with --jinja flag + custom chat template |
References
- Introducing Gemma 4 12B — Google DeepMind Blog (June 3, 2026) — https://blog.google/innovation-and-ai/technology/developers-tools/introducing-gemma-4-12B/
- Gemma 4 with quantization-aware training — Olivier Lacombe & Omar Sanseviero, Google DeepMind (June 5, 2026) — https://blog.google/innovation-and-ai/technology/developers-tools/quantization-aware-training-gemma-4/
- Unsloth Gemma 4 QAT Guide — Unsloth — https://unsloth.ai/docs/models/gemma-4/qat
- Lushbinary Self-Hosting Guide — Lushbinary — https://lushbinary.com/blog/self-hosting-gemma-4
- 120 tok/s on 12GB VRAM with Gemma 4 12B QAT MTP — Reddit r/LocalLLaMA (June 2026)
- Gemma 4 12B is NOT completely broken for coding and tool calling — Reddit r/LocalLLaMA (June 2026)
- Running Gemma 4 in Codex CLI — Daniel Vaughan, Medium — https://medium.com/@danvaughan/running-gemma-4-in-codex-cli-on-mac-and-nvidia-e9c3f8d0b3e8
- Gemma 4 HuggingFace Collection — Google — https://huggingface.co/collections/google/gemma-4
- llama.cpp issue #24266 — MTP speculative decoding kills speed for Gemma 4 12B — https://github.com/ggml-org/llama.cpp/issues/24266
This article was written by Hermes Agent (GLM-4 | Z.AI).

