TurinTech models, built with Artemis
Google's Gemma 4 12B for chat, reasoning and tool use on one GPU, from Google's quantization-aware (QAT) checkpoint.
- 6.72 GB download for the default file,
gemma-4-12B-it-Artemis-Q4_0.gguf. - Peak GPU memory 8.4 GiB on an NVIDIA A100 80 GB with the command below, and 6.5 to 6.7 GiB of process memory.
- On chat text it picks the original's next token 90.3% of the time, against 77.8% for Google's own Q4_0 (6.98 GB).
Run it
A chat model for llama.cpp's server with the chat template stored in the file; tested with llama.cpp b11617, and
with b11889 for the vision projector and the MTP drafter. -hf also downloads the projector and loads it; add
--no-mmproj for text only, which skips the 175 MB download.
llama-server -hf turintech/gemma-4-12B-it-Artemis-GGUF:Q4_0 --port 8080 -c 8192 --jinja
Request example, images, MTP, settings and downloadllama-server -m gemma-4-12B-it-Artemis-Q4_0.gguf --port 8080 -c 8192 --jinja
curl http://localhost:8080/v1/chat/completions -H 'Content-Type: application/json' -d '{
"messages": [{"role": "user", "content": "In two sentences, why is the sky blue?"}],
"max_tokens": 1500
}'
-c 8192 sets an 8,192-token context; --jinja uses the chat template stored in the file. Leave the server running
and send the request from a second terminal. The template turns on thinking by default: the server returns it in
message.reasoning_content and the answer in message.content, so allow enough output tokens (about 1,500), or add
"chat_template_kwargs": {"enable_thinking": false} to the request to turn it off. The hf command (pip install -U huggingface_hub) downloads the file
on its own:
hf download turintech/gemma-4-12B-it-Artemis-GGUF gemma-4-12B-it-Artemis-Q4_0.gguf --local-dir .
Images
The vision projector is a separate file, converted from the original weights. mmproj-F16.gguf is the same
projector in F16. The projector also holds the audio input layers; we have not tested audio input.
hf download turintech/gemma-4-12B-it-Artemis-GGUF mmproj-BF16.gguf --local-dir .
llama-server -m gemma-4-12B-it-Artemis-Q4_0.gguf --mmproj mmproj-BF16.gguf --port 8080 -c 8192 --jinja
Send the image as a data URL in an image_url part of the user message. On 20 chart questions this file with the BF16
projector got 13 right (12 with the F16 one), against 13 for Unsloth's UD-Q4_K_XL with Unsloth's projector (see Image questions).
Faster generation with the MTP drafter
mtp-gemma-4-12B-it-Artemis.gguf is Google's drafter for this model (gemma-4-12B-it-qat-q4_0-unquantized-assistant,
revision 1893406), converted to GGUF and quantized to Q4_0. It drafts the next tokens for the main file to check and
does not run on its own. With --spec-type draft-mtp, -hf downloads it as well:
llama-server -hf turintech/gemma-4-12B-it-Artemis-GGUF:Q4_0 --spec-type draft-mtp --port 8080 -c 8192 --jinja
The same file is in the MTP/ folder as MTP/mtp-gemma-4-12B-it-Artemis-Q4_0.gguf. With downloaded files:
hf download turintech/gemma-4-12B-it-Artemis-GGUF mtp-gemma-4-12B-it-Artemis.gguf --local-dir .
llama-server -m gemma-4-12B-it-Artemis-Q4_0.gguf -md mtp-gemma-4-12B-it-Artemis.gguf --spec-type draft-mtp --port 8080 -c 8192 --jinja
On an RTX 5090 it raised generation from 160.1 to 334.6 tokens per second on our 30 prompts (see MTP).
Greedy replies are not always word-for-word the same with it on: all 10 tool-call replies matched, and 1 of the
20 chat and code replies did. --mmproj and -md can be combined.
Ollama
ollama run turintech/gemma-4-12b-it-artemis:q4_0
The package holds the main file only. For images, use Ollama 0.40.11 or newer and pull from Hugging Face, which brings the repository's projector along:
ollama run hf.co/turintech/gemma-4-12B-it-Artemis-GGUF:Q4_0
With Ollama 0.40.11 on 26 October, the same pull from Unsloth's repository of this checkpoint
(hf.co/unsloth/gemma-4-12B-it-qat-GGUF:UD-Q4_K_XL) brought its projector along and ollama show listed vision. A local
package of our Q4_0 file and mmproj-F16.gguf (two FROM lines, PARAMETER num_ctx 8192) also listed vision,
answered 13 of the 20 chart questions and returned get_weather with Paris and celsius for a tool request.
Questions, problems or a model to consider for a smaller version? Reply in our feedback thread.
Choose this model
- Best for chat and tool calling on one GPU: 190 of 200 tool calls and 240 of 250 maths problems right, against 190 and 238 for Google's Q4_0.
- Consider another file when you want the closest file on Wikipedia text: Unsloth's UD-Q4_K_XL (6.72 GB) is slightly closer there (KL .147 against .156). No paired test separated these files on tool calls or maths.
Files
Every file we publish for this model. Sizes are download sizes, not memory.
| File | Size | Use it for | Ollama tag |
|---|---|---|---|
gemma-4-12B-it-Artemis-Q4_0.gguf |
6.72 GB | Default | q4_0 (latest) |
mmproj-BF16.gguf |
175 MB | Vision companion (mmproj): pass it with --mmproj for image inputs |
n/a |
mmproj-F16.gguf |
175 MB | Vision companion (mmproj): pass it with --mmproj for image inputs |
n/a |
MTP/mtp-gemma-4-12B-it-Artemis-Q4_0.gguf |
323 MB | MTP drafter (Google's assistant model, Q4_0): pass it with -md and --spec-type draft-mtp | n/a |
mtp-gemma-4-12B-it-Artemis.gguf |
323 MB | The same MTP drafter at the top level, where -hf with --spec-type draft-mtp finds it | n/a |
- With llama.cpp or a Hugging Face pull, add the file's quant label as the tag:
-hf turintech/gemma-4-12B-it-Artemis-GGUF:Q4_0. - The Ollama tag runs our package, which holds the same file:
ollama run turintech/gemma-4-12b-it-artemis:<tag>. - LM Studio's Hub entry
turintech/gemma-4-12b-it-artemisoffers every model file above, without the vision projector or the companion file.
The vision projector and the MTP drafter are optional. The drafter is there twice, in MTP/ and at the top level, where -hf finds it.
| File | Size | Saved | Choose for |
|---|---|---|---|
| Q4_0 | 6.72 GB | 72% | Default. |
"Saved" is the file-size reduction versus the BF16 original (23.83 GB). Measured results, and comparisons with the original and public files, are under How it was tested.
Results
Our file against Unsloth's file of the same size, Google's own Q4_0 and the original, on an NVIDIA A100. The tool-call and maths items were kept out of development and used in a final check fixed in advance.
| File | Size | Same next token, chat | Tool calls (of 200) | GSM8K (of 250) |
|---|---|---|---|---|
| Ours, Q4_0 | 6.72 GB | 90.3% | 190 | 240 |
| Unsloth UD-Q4_K_XL | 6.72 GB | 89.8% | 191 | 242 |
| Google Q4_0 | 6.98 GB | 77.8% | 190 | 238 |
| BF16 original (QAT) | 23.83 GB | reference | 189 | 242 |
No paired test separated these files on tool calls or maths. How it was tested.
Evaluation details and limitationsHow it was tested
Every file was compared with the BF16 conversion of the same QAT original
(google/gemma-4-12B-it-qat-q4_0-unquantized revision b6ed862, text weights) on an NVIDIA A100 80 GB with llama.cpp
b11617 (14310190c), greedy decoding, thinking off, one shared chat template (Google's, from the original) and the
original's BOS setting for every file.
- KL divergence and same next token over 60 chunks of 512 tokens from each of two human-written texts: the WikiText-2 test set (Wikipedia) and OpenAssistant OASST1 validation conversations. These texts were used while developing this file, so they are not an independent test.
- Native tool calling: BFCL v3 simple Python, tasks 200 to 399, through llama-server's OpenAI-style
toolsAPI, scored with BFCL's own checker. A reply with no tool call counts as wrong. - Maths: GSM8K test problems 250 to 499, rerun with a corrected protocol: a 4,096-token limit, a reply counts only if
it finished on its own, and the answer is the last
\boxed{}(else the last number) of the final reply. An earlier 768-token run, which also scored unfinished replies, gave 240 for this file, 238 for the original, 239 for Unsloth's file and 236 for Google's.
The tool-calling and maths items were kept out of development. They were then used in a final check, fixed in advance, that compared this file with the previous candidate and could have selected that one instead; it did not. They are therefore not an independent test made after the choice.
| File | Size | KL wiki / chat | Same next token, wiki / chat | Tool calls right (of 200) | GSM8K right (of 250) |
|---|---|---|---|---|---|
| BF16 original (QAT) | 23.83 GB | reference | reference | 189 | 242 |
| Artemis Q4_0 | 6.72 GB | .156 / .153 | 86.8% / 90.3% | 190 | 240 |
| Unsloth UD-Q4_K_XL (QAT) | 6.72 GB | .147 / .169 | 87.2% / 89.8% | 191 | 242 |
| Google Q4_0 (QAT) | 6.98 GB | .485 / .567 | 73.9% / 77.8% | 190 | 238 |
Bold marks the best displayed value for each metric among the rows shown, ties included; it is not a significance claim. Unsloth's file has the same overall tensor-type counts as ours and is 64 bytes larger; it is closer to the original on WikiText-2 and ours is closer on the chat text.
| Comparison (exact McNemar, two-sided, uncorrected) | Tool calls (200) | GSM8K (250) |
|---|---|---|
| Artemis Q4_0 vs BF16 original | 1 / 0, p=1.00 | 0 / 2, p=0.50 |
| Artemis Q4_0 vs Unsloth UD-Q4_K_XL | 0 / 1, p=1.00 | 0 / 2, p=0.50 |
| Artemis Q4_0 vs Google Q4_0 | 1 / 1, p=1.00 | 3 / 1, p=0.625 |
Each cell gives the items only the first file got right, the items only the second got right, and p. No paired test established a difference. These samples are small and do not establish equivalence.
Public files: google/gemma-4-12B-it-qat-q4_0-gguf revision 29d0977 (gemma-4-12b-it-qat-q4_0.gguf),
unsloth/gemma-4-12B-it-qat-GGUF revision 980b060 (gemma-4-12B-it-qat-UD-Q4_K_XL.gguf, the main file only; its
optional MTP file was not used).
Limitations: images were checked on 20 chart questions only (see Image questions below), and audio not at all. Tested with thinking off; thinking mode and long contexts were not evaluated. Calibrated on OpenAssistant OASST1 training conversations. The importance matrix is not distributed.
Image questions
A quick check that the projector works with our files: the first 20 ChartQA test questions
(human-written) from the frozen item list of our Qwen3.8 27B release, with lmms-eval's prompt (answer with a
single word or phrase), greedy, thinking off, up to 32 output tokens, scored by relaxed accuracy (a number within
5% of the answer, otherwise an exact match ignoring case). llama.cpp b11889 (d854d98) with CUDA on one NVIDIA
RTX 5090, -ngl 99 -c 8192 -np 1 --cache-ram 0; Unsloth's file ran with Unsloth's projector.
| File | Size | Projector | ChartQA right (of 20) |
|---|---|---|---|
| Artemis Q4_0 | 6.72 GB | ours, F16 | 12 |
| Artemis Q4_0 | 6.72 GB | ours, BF16 | 13 |
| Unsloth UD-Q4_K_XL (QAT) | 6.72 GB | Unsloth, F16 | 13 |
Unsloth's file got one question right that ours missed, and ours none that Unsloth's missed (exact McNemar p = 1.0); 20 questions are too few to separate the files. This model's projector has no vision transformer, only the patch embedding that feeds image patches to the
main model. b11889's converter writes that tensor in F16 in an F16 projector; loaded that way, our main file
returned empty replies to all 20 questions, so our mmproj-F16.gguf keeps it in F32, as Unsloth's does (our
BF16 file already did).
Our projectors were converted from google/gemma-4-12B-it-qat-q4_0-unquantized revision b6ed862 with
convert_hf_to_gguf.py --mmproj from llama.cpp b11889. Their tensors are the same, byte for byte, as those of
Unsloth's mmproj-BF16.gguf and mmproj-F16.gguf (unsloth/gemma-4-12B-it-qat-GGUF revision 980b060), except that the F16 patch embedding, kept in F32 in both, differs by at most 3e-8 (ours is the exact BF16 value).
MTP
Speed was measured with the 30 fixed prompts of our Qwen3.8 27B release (10 chat, 10 code, 10 tool calls with four
tools), greedy, thinking off, 256 output tokens, two warm-ups and two passes, on one RTX 5090 with llama.cpp b11889:
-ngl 99 -ngld 99 -c 8192 -np 1 --cache-ram 0 --spec-type draft-mtp and llama.cpp's default draft length. Speed is
generation tokens per second from llama-server's own timings (prompt excluded), over both passes; acceptance is the
share of drafted tokens the main file kept.
| Main file | MTP file | Chat (tok/s) | Code (tok/s) | Tool calls (tok/s) | All (tok/s) | Accepted | Speed-up |
|---|---|---|---|---|---|---|---|
| Artemis Q4_0 | none | 160.2 | 159.9 | 160.9 | 160.1 | N/A | 1.00 |
| Artemis Q4_0 | ours Q4_0 (shipped), 323 MB | 306.6 | 355.7 | 382.4 | 334.6 | 68.4% | 2.09 |
| Artemis Q4_0 | ours Q8_0 (not shipped), 465 MB | 279.9 | 336.0 | 363.6 | 311.1 | 69.0% | 1.94 |
| Artemis Q4_0 | Unsloth Q4_0, 254 MB | 295.6 | 341.2 | 377.0 | 322.3 | 69.4% | 2.01 |
The drafter is converted from google/gemma-4-12B-it-qat-q4_0-unquantized-assistant revision 1893406. Our BF16
and Q8_0 conversions have the same tensors, byte for byte, as Unsloth's MTP/ files of the same precision; the
headers differ in the name fields and the chat template (ours has the one in Google's current revision). Our Q4_0 is
stock llama-quantize Q4_0, which keeps the token embedding in Q6_K; Unsloth's Q4_0 is smaller and has it in Q4_0.
We ship our Q4_0: it was the fastest of the three here.
With the drafter, greedy replies matched the replies without it on 11 of 30 prompts: all 10 tool calls and 1 of the 20 chat and code prompts. The others change wording partway through, on the same prompts whichever drafter is used, while two passes of each setting gave identical replies. That points to the batched verification rather than the drafter, but the records hold text and hashes, not logits, so the cause is untested.
Closeness to the original
The closeness numbers from the tables above, in one fixed layout with the protocol behind each table.
Protocols and standard tables- Mean KLD: the mean KL divergence between the reference's and the file's next-token distributions, computed and averaged as each protocol's Tool line says. Lower is closer.
- 99th-percentile KLD: the 99th percentile of the per-token values. Lower is closer.
- Same top p: llama.cpp's name for top-1 agreement, the share of scored tokens where the file and the reference pick the same most likely token. Higher is closer.
- PPL and PPL ratio: the file's perplexity on the text, and that perplexity divided by the reference's (1 means the same). They measure prediction of the text, not closeness.
n/a means the card's tables or our run records do not have that value.
Protocol a100-2026-10-24
One NVIDIA A100 80 GB, 24 October 2026.
- Reference: BF16 GGUF conversion of google/gemma-4-12B-it-qat-q4_0-unquantized revision b6ed86275a6a5735884e208bfed95b445a684ca2 (text weights, 667 tensors, 23,832,066,176 bytes)
- Text
wiki: WikiText-2 test; dataset: Salesforce/wikitext atb08601e04326c79dfdd32d625aee71d232d685c3; config: wikitext-2-raw-v1; split: test; chunks: 60; context (tokens): 512; text SHA-256: bbf94c53a05abe9ee670d3b6343608095822c85e26de37c70b24fc571964574a - Text
chat: OpenAssistant validation conversations (English threads as User/Assistant text); dataset: OpenAssistant/oasst1 atfdf72ae0827c1cda404aff25b6603abec9e3399b; split: validation; chunks: 60; context (tokens): 512; text SHA-256: 0a3499a7eaead8f4a40655a868e7faee1ee664e258d09a77cd8f3d97216fc8b7 - Tool:
llama-perplexity --kl-divergenceagainst the reference's saved log-probabilities, chunks of 512 tokens; Mean KLD and Same top p are llama.cpp's own summary lines - llama.cpp build: b11617 (commit 14310190c)
- Command:
llama-perplexity -m <file.gguf> --override-kv tokenizer.ggml.add_bos_token=bool:true --kl-divergence-base <reference-text.kld> --kl-divergence -c 512 --chunks 60 -ngl 99 -t 16; the reference logs were written with-f <text>and the same flags without--kl-divergence - Hardware: one NVIDIA A100 80 GB, all layers on the GPU
- Settings: beginning-of-sequence token on for every file, as in the original; flash attention and KV cache type not set on the command line
- KL unit: nats (natural log)
- Measured by: TurinTech downloaded the Google and Unsloth files at the revisions below and measured every file in this table with the same frozen scoring script, reference logs, binary and GPU
- Selection: these texts were used while developing this file, so they are not an independent test
- Source on this card: the table columns "KL wiki / chat", "Same next token, wiki / chat"
- Comparison files: Unsloth:
unsloth/gemma-4-12B-it-qat-GGUFat980b060c40a8,gemma-4-12B-it-qat-UD-Q4_K_XL.gguf, SHA-256 90fd44e29e0d7cffeb0fd00dc73cfdab9ed0b0e95306ecf7821ea634c940c370; Google:google/gemma-4-12B-it-qat-q4_0-ggufat29d097773436,gemma-4-12b-it-qat-q4_0.gguf, SHA-256 93567e57a8fe10b23569b9d9ec38cd005deedf71e29477c421a4b83f418a538b
Protocol a100-2026-10-24, text wiki (WikiText-2 test):
| File | Repository | Measured by | Size (GB) | Size (bytes) | Mean KLD (nats) | Same top p (top-1 agreement, %) |
|---|---|---|---|---|---|---|
| BF16 GGUF of google/gemma-4-12B-it-qat-q4_0-unquantized | google/gemma-4-12B-it-qat-q4_0-unquantized at b6ed86275a6a |
reference | 23.83 | 23832066176 | reference | reference |
gemma-4-12B-it-Artemis-Q4_0.gguf |
turintech/gemma-4-12B-it-Artemis-GGUF at 7c6b51e |
TurinTech | 6.72 | 6716356736 | 0.156 | 86.8 |
gemma-4-12B-it-qat-UD-Q4_K_XL.gguf |
unsloth/gemma-4-12B-it-qat-GGUF at 980b060c40a8 |
TurinTech | 6.72 | 6716356800 | 0.147 | 87.2 |
gemma-4-12b-it-qat-q4_0.gguf |
google/gemma-4-12B-it-qat-q4_0-gguf at 29d097773436 |
TurinTech | 6.98 | 6975879296 | 0.485 | 73.9 |
Protocol a100-2026-10-24, text chat (OpenAssistant validation conversations (English threads as User/Assistant text)):
| File | Repository | Measured by | Size (GB) | Size (bytes) | Mean KLD (nats) | Same top p (top-1 agreement, %) |
|---|---|---|---|---|---|---|
| BF16 GGUF of google/gemma-4-12B-it-qat-q4_0-unquantized | google/gemma-4-12B-it-qat-q4_0-unquantized at b6ed86275a6a |
reference | 23.83 | 23832066176 | reference | reference |
gemma-4-12B-it-Artemis-Q4_0.gguf |
turintech/gemma-4-12B-it-Artemis-GGUF at 7c6b51e |
TurinTech | 6.72 | 6716356736 | 0.153 | 90.3 |
gemma-4-12B-it-qat-UD-Q4_K_XL.gguf |
unsloth/gemma-4-12B-it-qat-GGUF at 980b060c40a8 |
TurinTech | 6.72 | 6716356800 | 0.169 | 89.8 |
gemma-4-12b-it-qat-q4_0.gguf |
google/gemma-4-12B-it-qat-q4_0-gguf at 29d097773436 |
TurinTech | 6.98 | 6975879296 | 0.567 | 77.8 |
Memory
Peak memory of llama-server with the command above (--port 8080 -c 8192 --jinja) answering 10 short chat prompts,
llama.cpp b11617 on an NVIDIA A100 80 GB: peak GPU memory 8.4 GiB, and peak process memory (RSS) 6.5 to 6.7 GiB in two
runs, which counts the parts of the memory-mapped model file that were read. The command keeps llama-server's default
8 GiB prompt cache, so system memory can grow in longer sessions; add --cache-ram 0 to limit it. Context length and
other runtime settings also change memory use.
On an NVIDIA RTX 5090 with llama.cpp b11889 (-ngl 99 -c 8192 -np 1 --cache-ram 0), GPU memory in use was
7.54 GiB for the Q4_0 file alone and 7.91 GiB with the MTP drafter after the 30 speed prompts, and
7.97 GiB with mmproj-F16.gguf after the 20 chart questions.
File name
The file name ends in a standard llama.cpp quant label, so llama.cpp, Ollama and LM Studio can pick it by tag. The file uses the standard Q4_0 label and averages 4.51 bits per weight over the whole file.
File checksums
| File | Bytes | sha256 |
|---|---|---|
gemma-4-12B-it-Artemis-Q4_0.gguf |
6,716,356,736 | 25b9be6a385bcc2816a14dc4913ced4352f4720786b28bef1f5936f52255ae63 |
mmproj-BF16.gguf |
175,115,616 | 57bcb483665d53c0ac402adafd4f7b0c16fe1ad25c28d2dbb6739f526d78ed3e |
mmproj-F16.gguf |
175,115,616 | 61fda9811b5ac5d04eeb3f5c0b341264425798b754c151d0b303cbcc3cb40863 |
MTP/mtp-gemma-4-12B-it-Artemis-Q4_0.gguf |
322,914,912 | 10de2f2cb74c08cc10a2e11b151c2da334882851e5010aeaf47149d1ee839d97 |
mtp-gemma-4-12B-it-Artemis.gguf |
322,914,912 | 10de2f2cb74c08cc10a2e11b151c2da334882851e5010aeaf47149d1ee839d97 |
Artemis
Teams use Artemis to test and improve code against their own objectives. See Artemis.
About and licence
Gemma 4 12B is Google's mid-sized Gemma 4 instruction model for chat, reasoning and tool use. This file is made from Google's quantisation-aware (QAT) checkpoint (google/gemma-4-12B-it-qat-q4_0-unquantized), which Google trained to hold up well at low precision.
This is an independent TurinTech conversion, not affiliated with or endorsed by Google. The file is standard GGUF and
runs on stock llama.cpp. Changes from the original: the weights are converted to GGUF and quantized for llama.cpp; the vision and audio
input layers are converted to a separate projector file, and Google's drafter model (gemma-4-12B-it-qat-q4_0-unquantized-assistant)
to the MTP file.
See NOTICE.
Apache-2.0, the licence Google releases Gemma 4 under (Gemma 4 licence page); see LICENSE and
NOTICE.
When serving this file to others, for example through an API, an inference provider or OpenRouter, we'd appreciate a mention of TurinTech (turintech.ai) as the source of the quantization.
These files keep improving.