Text Generation
Transformers
Safetensors
granite
vllm
compressed-tensors
nvfp4
fp8
mixed-precision
quantized
reasoning
tool-calling
blackwell
conversational
8-bit precision
Instructions to use primitive-ai/granite-4.2-30b-mixed-NVFP4-FP8 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use primitive-ai/granite-4.2-30b-mixed-NVFP4-FP8 with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="primitive-ai/granite-4.2-30b-mixed-NVFP4-FP8") messages = [ {"role": "user", "content": "Who are you?"}, ] pipe(messages)# Load model directly from transformers import AutoTokenizer, AutoModelForCausalLM tokenizer = AutoTokenizer.from_pretrained("primitive-ai/granite-4.2-30b-mixed-NVFP4-FP8") model = AutoModelForCausalLM.from_pretrained("primitive-ai/granite-4.2-30b-mixed-NVFP4-FP8", device_map="auto") messages = [ {"role": "user", "content": "Who are you?"}, ] inputs = tokenizer.apply_chat_template( messages, add_generation_prompt=True, tokenize=True, return_dict=True, return_tensors="pt", ).to(model.device) outputs = model.generate(**inputs, max_new_tokens=40) print(tokenizer.decode(outputs[0][inputs["input_ids"].shape[-1]:])) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use primitive-ai/granite-4.2-30b-mixed-NVFP4-FP8 with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "primitive-ai/granite-4.2-30b-mixed-NVFP4-FP8" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "primitive-ai/granite-4.2-30b-mixed-NVFP4-FP8", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker
docker model run hf.co/primitive-ai/granite-4.2-30b-mixed-NVFP4-FP8
- SGLang
How to use primitive-ai/granite-4.2-30b-mixed-NVFP4-FP8 with SGLang:
Install from pip and serve model
# Install SGLang from pip: pip install sglang # Start the SGLang server: python3 -m sglang.launch_server \ --model-path "primitive-ai/granite-4.2-30b-mixed-NVFP4-FP8" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "primitive-ai/granite-4.2-30b-mixed-NVFP4-FP8", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker images
docker run --gpus all \ --shm-size 32g \ -p 30000:30000 \ -v ~/.cache/huggingface:/root/.cache/huggingface \ --env "HF_TOKEN=<secret>" \ --ipc=host \ lmsysorg/sglang:latest \ python3 -m sglang.launch_server \ --model-path "primitive-ai/granite-4.2-30b-mixed-NVFP4-FP8" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "primitive-ai/granite-4.2-30b-mixed-NVFP4-FP8", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }' - Docker Model Runner
How to use primitive-ai/granite-4.2-30b-mixed-NVFP4-FP8 with Docker Model Runner:
docker model run hf.co/primitive-ai/granite-4.2-30b-mixed-NVFP4-FP8
Card in house format: banner, badges, field table, cross-model table
Browse files
README.md
CHANGED
|
@@ -3,140 +3,226 @@ license: apache-2.0
|
|
| 3 |
base_model: ibm-granite/granite-4.2-30b
|
| 4 |
base_model_relation: quantized
|
| 5 |
pipeline_tag: text-generation
|
|
|
|
| 6 |
tags:
|
| 7 |
-
-
|
| 8 |
-
-
|
| 9 |
- nvfp4
|
| 10 |
- fp8
|
| 11 |
- mixed-precision
|
| 12 |
-
-
|
| 13 |
-
- vllm
|
| 14 |
- reasoning
|
| 15 |
- tool-calling
|
|
|
|
|
|
|
| 16 |
---
|
| 17 |
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
this model puts all 448 projections at one precision.
|
| 22 |
|
| 23 |
-
|
| 24 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 25 |
|
| 26 |
-
|
| 27 |
-
|---|---|---|
|
| 28 |
-
| MLP: `gate/up/down`, 3 × 4096×32768 per layer | 25.77 B | 90.6% |
|
| 29 |
-
| attention: `q/o` 4096×4096, `k/v` 4096×1024 per layer | 2.68 B | 9.4% |
|
| 30 |
-
| `embed_tokens` + `lm_head`, untied | 0.82 B | 2.8% |
|
| 31 |
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
|
|
|
|
|
|
|
| 35 |
|
| 36 |
-
|
| 37 |
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 44 |
|
| 45 |
-
|
| 46 |
-
UltraChat conversations at seqlen 2048. NVFP4 is W4A4, so the activation scale is data: run the
|
| 47 |
-
export data-free and every `input_global_scale` comes out zero, vLLM computes `1/0`, and the
|
| 48 |
-
model emits noise while its weights still verify against the source.
|
| 49 |
|
| 50 |
-
## Serve
|
| 51 |
|
| 52 |
```bash
|
| 53 |
-
vllm serve primitive-ai/granite-4.2-30b-mixed-NVFP4-FP8
|
| 54 |
-
--max-model-len 20480 --gpu-memory-utilization 0.95 \
|
| 55 |
-
--max-num-batched-tokens 8192 --max-num-seqs 32
|
| 56 |
```
|
| 57 |
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
`{"reasoning_effort": "low"}` shortens it.
|
| 61 |
|
| 62 |
-
|
| 63 |
-
|
| 64 |
-
One host, one sitting, identical serve flags for every row.
|
| 65 |
-
[PQE-1.2](https://huggingface.co/datasets/primitive-ai/pqe): 1,170 knowledge items and 200
|
| 66 |
-
tool-calling items, temperature 0.6 / top_p 0.95 / top_k 20, thinking forced on, 16,384-token
|
| 67 |
-
budget, concurrency 32.
|
| 68 |
-
|
| 69 |
-
| | size | knowledge, strict | completed-only | completion | mean out |
|
| 70 |
-
|---|---|---|---|---|---|
|
| 71 |
-
| BF16 source | 58.60 GB | 86.78 ±0.32 (n=3) | 87.77 | 98.8% | 1370 |
|
| 72 |
-
| `granite-4.2-30b-fp8` | 30.12 GB | 87.26 ±0.68 (n=3) | 88.16 | 98.9% | 1366 |
|
| 73 |
-
| **this build** | **18.13 GB** | **86.23 ±0.61 (n=6)** | 87.33 | 98.5% | 1502 |
|
| 74 |
-
| `granite-4.2-30b-nvfp4` | 17.66 GB | 85.34 ±0.33 (n=4) | 86.20 | 98.8% | 1420 |
|
| 75 |
-
|
| 76 |
-
Against BF16 this build is −0.56 (Welch t = −1.79, a tie). The uniform 4-bit build is −1.44
|
| 77 |
-
(t = −5.76). Between the two 4-bit builds: +0.88, t = 2.96.
|
| 78 |
-
|
| 79 |
-
| tool calling, 200 items | pooled | call accuracy | abstention |
|
| 80 |
-
|---|---|---|---|
|
| 81 |
-
| BF16 source | 81.50 ±0.00 (n=3) | 86.7 | 60.8 |
|
| 82 |
-
| this build | 80.83 ±1.08 (n=6) | 85.8 | 60.8 |
|
| 83 |
-
| `granite-4.2-30b-nvfp4` | 81.00 ±0.50 (n=3) | 86.7 | 58.3 |
|
| 84 |
-
|
| 85 |
-
Nothing separates the field on tool calling. Every arm measured lands in 80.8–81.5 and the
|
| 86 |
-
suite's own spread is wider than the gaps.
|
| 87 |
-
|
| 88 |
-
| 8192 in / 512 out, cache-free | tok/s @ conc 1 | TPOT | tok/s @ conc 32 | TTFT |
|
| 89 |
-
|---|---|---|---|---|
|
| 90 |
-
| BF16 source | 22.18 | 42.26 ms | 139.0 | 61.5 s |
|
| 91 |
-
| `granite-4.2-30b-fp8` | 38.63 | 24.16 ms | 233.7 | 7.50 s |
|
| 92 |
-
| this build | 58.26 | 15.98 ms | 321.3 | 2.68 s |
|
| 93 |
-
| `granite-4.2-30b-nvfp4` | 60.19 | 15.52 ms | 333.9 | 2.47 s |
|
| 94 |
-
|
| 95 |
-
Decode here is memory-bound, and every build on the list moves its weights at roughly the same
|
| 96 |
-
rate: 1181 GB/s for this one against 1192 for the uniform build, out of about 1792 GB/s of
|
| 97 |
-
peak. The mixed layout costs no kernel time. It costs 2.7% more bytes per token and returns
|
| 98 |
-
2.7% fewer tokens per second, which is the whole of the difference.
|
| 99 |
|
| 100 |
-
##
|
| 101 |
|
| 102 |
-
|
| 103 |
-
|
| 104 |
-
|
| 105 |
-
|
| 106 |
|
| 107 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 108 |
|
| 109 |
-
|
| 110 |
-
|
| 111 |
-
were the ones staged and verified, but the calibration is not the reason the build scores what
|
| 112 |
-
it does.
|
| 113 |
|
| 114 |
-
|
| 115 |
-
|
| 116 |
|
| 117 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 118 |
|
| 119 |
-
|
| 120 |
|
| 121 |
-
|
| 122 |
-
|
| 123 |
-
|
| 124 |
-
|
| 125 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 126 |
|
| 127 |
-
|
|
|
|
|
|
|
|
|
|
| 128 |
|
| 129 |
-
|
| 130 |
-
|
| 131 |
-
- Calibration: 256 conversations from `HuggingFaceH4/ultrachat_200k`, seqlen 2048.
|
| 132 |
-
- IBM's `model.sig` is not carried over. It signs the original weights and would not verify
|
| 133 |
-
against these.
|
| 134 |
|
| 135 |
---
|
| 136 |
|
| 137 |
<p align="center">
|
| 138 |
<br>
|
| 139 |
-
<img src="
|
| 140 |
<sub>
|
| 141 |
<a href="https://primitive.com"><b>primitive</b></a> ·
|
| 142 |
<a href="https://huggingface.co/primitive-ai">more models</a> ·
|
|
|
|
| 3 |
base_model: ibm-granite/granite-4.2-30b
|
| 4 |
base_model_relation: quantized
|
| 5 |
pipeline_tag: text-generation
|
| 6 |
+
library_name: transformers
|
| 7 |
tags:
|
| 8 |
+
- vllm
|
| 9 |
+
- compressed-tensors
|
| 10 |
- nvfp4
|
| 11 |
- fp8
|
| 12 |
- mixed-precision
|
| 13 |
+
- quantized
|
|
|
|
| 14 |
- reasoning
|
| 15 |
- tool-calling
|
| 16 |
+
- blackwell
|
| 17 |
+
thumbnail: https://huggingface.co/primitive-ai/granite-4.2-30b-mixed-NVFP4-FP8/resolve/main/assets/banner.png
|
| 18 |
---
|
| 19 |
|
| 20 |
+
<p align="center">
|
| 21 |
+
<img src="assets/banner.png" alt="Primitive — Granite-4.2-30B mixed NVFP4/FP8" width="100%">
|
| 22 |
+
</p>
|
|
|
|
| 23 |
|
| 24 |
+
<p align="center">
|
| 25 |
+
<img src="https://img.shields.io/badge/size-18.1%20GB-F98424?style=flat-square" alt="size 18.1 GB">
|
| 26 |
+
<img src="https://img.shields.io/badge/vs%20BF16-3.2×%20smaller-F98424?style=flat-square" alt="3.2x smaller than BF16">
|
| 27 |
+
<img src="https://img.shields.io/badge/knowledge-86.2%20vs%2086.8%20BF16-3DD13D?style=flat-square" alt="knowledge 86.2 versus BF16 86.8">
|
| 28 |
+
<img src="https://img.shields.io/badge/throughput-2.3×%20@%20conc%2032-F98424?style=flat-square" alt="2.3x throughput at concurrency 32">
|
| 29 |
+
<img src="https://img.shields.io/badge/runs%20on-Blackwell-F98424?style=flat-square" alt="Runs on Blackwell">
|
| 30 |
+
<a href="https://primitive.com"><img src="https://img.shields.io/badge/web-primitive.com-lightgrey?style=flat-square" alt="primitive.com"></a>
|
| 31 |
+
</p>
|
| 32 |
|
| 33 |
+
<h3 align="center">A third of the size, level with BF16. One projection kept at 8 bits.</h3>
|
|
|
|
|
|
|
|
|
|
|
|
|
| 34 |
|
| 35 |
+
<p align="center">
|
| 36 |
+
Mixed-precision quantization of <a href="https://huggingface.co/ibm-granite/granite-4.2-30b">ibm-granite/granite-4.2-30b</a> to
|
| 37 |
+
<b>18.1 GB</b>, <b>3.2× smaller than BF16</b>, on <b>stock vLLM</b>.<br>
|
| 38 |
+
The MLP and the fused <code>q/k/v</code> are NVFP4; <code>o_proj</code> is FP8.
|
| 39 |
+
</p>
|
| 40 |
|
| 41 |
+
---
|
| 42 |
|
| 43 |
+
## Why this quant
|
| 44 |
+
|
| 45 |
+
* 🗜️ **3.2× smaller than BF16, 40% smaller than IBM's FP8.** 18.1 GB against 58.6 GB and 30.1 GB.
|
| 46 |
+
* 🎯 **Knowledge ties BF16.** 86.2 against 86.8 over 1,170 items and six runs (Welch t = −1.79).
|
| 47 |
+
The uniform NVFP4 build of the same weights scores 85.3, which is 1.4 below BF16 and outside
|
| 48 |
+
the noise (t = −5.76).
|
| 49 |
+
* 🧭 **The difference is one projection.** `o_proj` is 40% of attention's parameters and carries
|
| 50 |
+
about 72% of what moving attention off 4 bits recovers. Protecting it costs 0.47 GB;
|
| 51 |
+
protecting all of attention costs 1.18 GB and buys 0.18 points more.
|
| 52 |
+
* ⚡ **2.3× BF16 throughput at concurrency 32, 2.6× single-stream.** 321 tok/s against 139, and
|
| 53 |
+
58.3 against 22.2.
|
| 54 |
+
* 💸 **The mixed layout costs no kernel time.** Every build measured moves its weights at
|
| 55 |
+
1178–1192 GB/s. This one carries 2.7% more bytes than the uniform build and returns 2.7% fewer
|
| 56 |
+
tokens per second, which is the whole of the difference.
|
| 57 |
+
* ⚠️ **If you have 30 GB, IBM's own FP8 is the more accurate build.** 8-bit is lossless on this
|
| 58 |
+
model by our measurement (87.3 against BF16's 86.8, t = 1.12). This one exists for the 18 GB slot.
|
| 59 |
+
* 🔧 **Stock vLLM, `compressed-tensors`, no patches.** Round-to-nearest weights; calibration is
|
| 60 |
+
used only to observe the NVFP4 activation scales.
|
| 61 |
|
| 62 |
+
---
|
|
|
|
|
|
|
|
|
|
| 63 |
|
| 64 |
+
## Serve it
|
| 65 |
|
| 66 |
```bash
|
| 67 |
+
vllm serve primitive-ai/granite-4.2-30b-mixed-NVFP4-FP8 --max-model-len 20480
|
|
|
|
|
|
|
| 68 |
```
|
| 69 |
|
| 70 |
+
Thinking is on by default in Granite's own template. `chat_template_kwargs`
|
| 71 |
+
`{"enable_thinking": false}` turns it off; `{"reasoning_effort": "low"}` shortens it.
|
|
|
|
| 72 |
|
| 73 |
+
---
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 74 |
|
| 75 |
+
## Measured
|
| 76 |
|
| 77 |
+
**1,370 items across fourteen public benchmarks.** A 1,170-item knowledge suite and a 200-item
|
| 78 |
+
tool-calling suite, under one fixed protocol for every row: `temperature 0.6` / `top_p 0.95` /
|
| 79 |
+
`top_k 20`, thinking forced on, a 16,384-token budget, concurrency 32, all rows back to back in one
|
| 80 |
+
sitting on one RTX PRO 6000 Blackwell.
|
| 81 |
|
| 82 |
+
| build | size | overall | knowledge | call | abstain | runs k/a | finished | out/answer | tok/s @ 32 | per-token latency | tok/s @ 1 |
|
| 83 |
+
|---|---|---|---|---|---|---|---|---|---|---|---|
|
| 84 |
+
| [IBM BF16](https://huggingface.co/ibm-granite/granite-4.2-30b) | 58.6 G | 86.0 | 86.8 | 86.7 | 60.8 | 3/3 | 98.8% | 1370 | 139 | 95.2 ms | 22.2 |
|
| 85 |
+
| [IBM FP8](https://huggingface.co/ibm-granite/granite-4.2-30b-fp8) | 30.1 G | 86.4 | 87.3 | 86.7 | 60.0 | 3/3 | 98.9% | 1366 | 234 | 95.5 ms | 38.6 |
|
| 86 |
+
| **this repo** | **18.1 G** | **85.5** | 86.2 | 85.8 | 60.8 | 6/6 | 98.5% | 1502 | 321 | 86.3 ms | 58.3 |
|
| 87 |
+
| [IBM NVFP4](https://huggingface.co/ibm-granite/granite-4.2-30b-nvfp4) | 17.7 G | 84.6 | 85.3 | 86.7 | 58.3 | 4/3 | 98.8% | 1420 | 334 | 83.7 ms | 60.2 |
|
| 88 |
+
| *all attention at FP8, built and not shipped* | 18.8 G | 85.6 | 86.4 | 84.6 | 61.7 | 3/6 | 98.6% | 1427 | 316 | 87.6 ms | 56.2 |
|
| 89 |
|
| 90 |
+
**`overall` is one number over both suites**: the 1,170 knowledge and 200 tool-calling items pooled
|
| 91 |
+
as 1,370, weighted **85.4%** and **14.6%** by item count.
|
|
|
|
|
|
|
| 92 |
|
| 93 |
+
<details>
|
| 94 |
+
<summary>Where the tool-calling half goes: call vs abstain</summary>
|
| 95 |
|
| 96 |
+
| build | agentic | call | abstain |
|
| 97 |
+
|---|---|---|---|
|
| 98 |
+
| [IBM BF16](https://huggingface.co/ibm-granite/granite-4.2-30b) | 81.5 | 86.7 | 60.8 |
|
| 99 |
+
| [IBM FP8](https://huggingface.co/ibm-granite/granite-4.2-30b-fp8) | 81.3 | 86.7 | 60.0 |
|
| 100 |
+
| **this repo** | **80.8** | 85.8 | 60.8 |
|
| 101 |
+
| [IBM NVFP4](https://huggingface.co/ibm-granite/granite-4.2-30b-nvfp4) | 81.0 | 86.7 | 58.3 |
|
| 102 |
+
|
| 103 |
+
`call` is accuracy on the 160 rows that require a call; `abstain` is the 40 whose correct action is
|
| 104 |
+
to call **nothing**. Benchmarks: BFCL v4 (30, including `irrelevance`), xLAM/APIGen (45), ToolACE
|
| 105 |
+
(45), Glaive v2 (40), nvidia When2Call (40, the abstention rows). Tool schemas go in the system prompt
|
| 106 |
+
and the model answers with a JSON array of calls, the same way for every model. An item counts only
|
| 107 |
+
if every expected call is present with acceptable arguments and no call is invented.
|
| 108 |
+
|
| 109 |
+
**Nothing separates this field on tool calling.** Every build lands in 80.8–81.5 and the suite's own
|
| 110 |
+
run-to-run spread is wider than the gaps. Quantization did not cost this model its tool use.
|
| 111 |
+
|
| 112 |
+
</details>
|
| 113 |
+
|
| 114 |
+
**Read the `runs` column, and read this before reading any gap.** Three consecutive knowledge runs
|
| 115 |
+
of this checkpoint scored 86.50, 86.15 and 86.15, which suggests a run-to-run sd near **0.2**. Six
|
| 116 |
+
runs on weights proven byte-identical span **85.60 to 87.26, sd 0.61**. The tight triple was luck,
|
| 117 |
+
and an earlier draft of this card quoted a t-statistic off it that was inflated about twofold.
|
| 118 |
+
Treat anything under about **1.2 points** on this suite as unresolved until both sides have six
|
| 119 |
+
runs. The throughput columns come from one sitting and drift a few percent between sittings, so read
|
| 120 |
+
them as a bracket.
|
| 121 |
+
|
| 122 |
+
**On the last row.** Putting all four attention projections at FP8 rather than `o_proj` alone scores
|
| 123 |
+
86.4 on knowledge for 0.71 GB more and 3.5% less decode speed. It was built, gated and measured on
|
| 124 |
+
the same protocol; it is not published because the pooled difference (85.6 against 85.5) is inside
|
| 125 |
+
the noise described above and it is the larger, slower artifact.
|
| 126 |
+
|
| 127 |
+
**GPTQ over this allocation is a null.** Calibrated weight updates measured +0.49 after one run,
|
| 128 |
+
+0.31 after two and **+0.26 after three (t = 0.80)**, at identical size and identical bytes per
|
| 129 |
+
decode step. The weights here are the calibrated ones because those were the ones staged and
|
| 130 |
+
verified, but the calibration is not why the build scores what it does.
|
| 131 |
|
| 132 |
+
---
|
| 133 |
|
| 134 |
+
## Comparable with our other models
|
| 135 |
+
|
| 136 |
+
Accuracy numbers move for reasons that have nothing to do with the model: a shorter token budget, a
|
| 137 |
+
different `temperature`, or whether the model was allowed to reason at all. So every number in this
|
| 138 |
+
table, on this card and on our other cards, comes from one fixed protocol.
|
| 139 |
+
|
| 140 |
+
The same 1,370 items: a 1,170-item knowledge suite (MMLU-Pro, ARC-Challenge, HellaSwag, WinoGrande,
|
| 141 |
+
CommonsenseQA, BoolQ, OpenBookQA, GSM8K, MATH-500) and a 200-item tool-calling suite (BFCL v4,
|
| 142 |
+
xLAM/APIGen, ToolACE, Glaive v2, nvidia When2Call). `temperature 0.6`, `top_p 0.95`, `top_k 20`,
|
| 143 |
+
thinking forced on, a 16,384-token budget, no reasoning parser, scoring the last `ANSWER:` in the
|
| 144 |
+
reply. Concurrency 32 on one RTX PRO 6000 Blackwell, each model's rows in one sitting. Auto-scored,
|
| 145 |
+
no LLM judge. Both halves are means of at least three runs per build.
|
| 146 |
+
|
| 147 |
+
| model | shape | size | overall | knowledge | call | abstain | finished | out | tok/s @ 32 |
|
| 148 |
+
|---|---|---|---|---|---|---|---|---|---|
|
| 149 |
+
| [Laguna-XS-2.1](https://huggingface.co/primitive-ai/Laguna-XS-2.1-mixed-NVFP4-MXFP8) | 31 B MoE | 19.3 GiB | 81.7 | 83.8 | 68.4 | 73.5 | 98.9% | 1097 tok | 1523 |
|
| 150 |
+
| [Nemotron-3.5-Lightning-30B-A3B](https://huggingface.co/primitive-ai/Nemotron-3.5-Lightning-30B-A3B-mixed-INT4-INT8) | 30 B MoE+Mamba | 19.2 GiB | 87.1 | 87.9 | 85.4 | 70.5 | 97.9% | 1429 tok | 2204 |
|
| 151 |
+
| [Ornith-1.5-35B-A3B](https://huggingface.co/primitive-ai/Ornith-1.5-35B-A3B-mixed-NVFP4-FP8) | 35 B MoE | 22.6 GiB | 88.7 | 91.7 | 74.4 | 60.0 | 99.3% | 760 tok | 1469 |
|
| 152 |
+
| [Muse-Glimmer-30B](https://huggingface.co/primitive-ai/Muse-Glimmer-30B-mixed-NVFP4) | 30 B MoE | 20.4 GiB | 86.6 | 88.8 | 78.6 | 54.5 | 99.7% | 800 tok | 1176 |
|
| 153 |
+
| [Qwen3.8-27B](https://huggingface.co/primitive-ai/Qwen3.8-27B-mixed-NVFP4-FP8) | 27 B dense | 20.7 GiB | 88.8 | 90.4 | 85.5 | 54.5 | 99.7% | 651 tok | 908 |
|
| 154 |
+
| **Granite-4.2-30B** (this repo) | 30 B dense | 18.1 GB | **85.5** | 86.2 | 85.8 | 60.8 | 98.5% | 1502 tok | 321 |
|
| 155 |
+
| [Laguna-S-2.1](https://huggingface.co/primitive-ai/Laguna-S-2.1-mixed-NVFP4-MXFP8) | 110 B MoE | 64.0 GiB | 84.3 | 87.1 | 64.6 | 81.0 | 97.3% | 995 tok | 670 |
|
| 156 |
+
| [Qwen3.8-Flash-Next](https://huggingface.co/primitive-ai/Qwen3.8-Flash-Next-mixed-NVFP4-FP8) | 180 B MoE (6 B active) | 183.7 GB | 90.3 | 92.2 | 84.8 | 56.7 | 99.5% | 686 tok | 816 |
|
| 157 |
+
|
| 158 |
+
**Read `overall` with `finished`.** `overall` scores an answer that overran the token budget as wrong,
|
| 159 |
+
but it cannot say whether the model needed the room or failed to stop; `finished` and `out` separate
|
| 160 |
+
those. A gap under **1.0** is a tie. The `tok/s` column comes from each model's own sitting and drifts
|
| 161 |
+
a few percent between sittings, so read it as a bracket.
|
| 162 |
+
|
| 163 |
+
**The `tok/s` column is not comparable across shapes.** Granite-4.2-30B is dense: every one of its
|
| 164 |
+
30 B parameters is read for every token. The MoE rows above it read a fraction of theirs, which is
|
| 165 |
+
why a 180 B model outruns this one. Compare within a shape, or compare against the same model's
|
| 166 |
+
other builds.
|
| 167 |
+
|
| 168 |
+
**`call` and `abstain` are the tool-calling suite's two halves, reported separately.** `call` is
|
| 169 |
+
accuracy on the 160 items that require a tool call; `abstain` is the 40 whose correct action is to
|
| 170 |
+
call nothing. They used to be pooled into one `agentic` number, and the pooling misled: a model with
|
| 171 |
+
ordinary call accuracy and unusual abstention discipline outscored models that are better at
|
| 172 |
+
actually making calls. Weight them by your own workload's mix.
|
| 173 |
+
|
| 174 |
+
<details>
|
| 175 |
+
<summary>Per-benchmark detail, both halves</summary>
|
| 176 |
+
|
| 177 |
+
| benchmark | Laguna-XS-2.1 | Nemotron-3.5-Lightning-30B-A3B | Ornith-1.5-35B-A3B | Muse-Glimmer-30B | Qwen3.8-27B | **Granite-4.2-30B** | Laguna-S-2.1 | Qwen3.8-Flash-Next |
|
| 178 |
+
|---|---|---|---|---|---|---|---|---|
|
| 179 |
+
| **knowledge** | | | | | | | | |
|
| 180 |
+
| mmlu_pro | 79.0 | 82.0 | 89.5 | 89.0 | 89.5 | 79.4 | 81.0 | 89.0 |
|
| 181 |
+
| math_500 | 76.0 | 80.0 | 88.0 | 74.0 | 82.0 | 80.0 | 83.0 | 86.0 |
|
| 182 |
+
| gsm8k | 97.0 | 96.0 | 99.0 | 98.0 | 98.0 | 96.3 | 99.0 | 97.0 |
|
| 183 |
+
| arc_challenge | 94.0 | 97.3 | 98.7 | 98.0 | 98.0 | 95.9 | 96.0 | 98.7 |
|
| 184 |
+
| hellaswag | 70.7 | 78.0 | 86.7 | 83.3 | 82.0 | 76.7 | 76.7 | 88.7 |
|
| 185 |
+
| winogrande | 84.7 | 89.3 | 89.3 | 90.7 | 89.3 | 85.1 | 86.0 | 95.3 |
|
| 186 |
+
| commonsenseqa | 80.8 | 83.3 | 86.7 | 82.5 | 84.2 | 83.6 | 85.8 | 86.7 |
|
| 187 |
+
| boolq | 90.0 | 92.0 | 92.0 | 90.0 | 91.0 | 90.2 | 92.0 | 94.0 |
|
| 188 |
+
| openbookqa | 94.0 | 99.0 | 98.0 | 97.0 | 97.0 | 96.7 | 94.0 | 96.0 |
|
| 189 |
+
| **tool calling** | | | | | | | | |
|
| 190 |
+
| bfcl_v4 | 83.3 | 96.7 | 76.7 | 86.7 | 96.7 | 95.6 | 90.0 | 96.7 |
|
| 191 |
+
| xlam | 64.4 | 73.3 | 55.6 | 66.7 | 77.8 | 75.9 | 48.9 | 82.2 |
|
| 192 |
+
| toolace | 37.8 | 71.1 | 71.1 | 64.4 | 68.9 | 78.5 | 48.9 | 73.3 |
|
| 193 |
+
| glaive | 87.5 | 97.5 | 92.5 | 100.0 | 100.0 | 97.9 | 85.0 | 100.0 |
|
| 194 |
+
| when2call | 75.0 | 77.5 | 52.5 | 55.0 | 55.0 | 60.8 | 75.0 | 55.0 |
|
| 195 |
+
|
| 196 |
+
</details>
|
| 197 |
+
|
| 198 |
+
## What's quantized to what
|
| 199 |
+
|
| 200 |
+
Granite-4.2-30B is dense, so nothing is sparsely active and the usual reasoning about protecting an
|
| 201 |
+
always-active path has nothing to say. What does say something is where the weights sit: the MLP is
|
| 202 |
+
**25.77 B parameters (90.6%)**, attention **2.68 B (9.4%)**, and the untied embeddings and head
|
| 203 |
+
**0.82 B (2.8%)**. Going to 4 bits is a decision about the MLP, which leaves attention cheap to
|
| 204 |
+
treat differently. `q`, `k` and `v` are fused into one tensor by the engine and must share a scheme;
|
| 205 |
+
`o_proj` is its own module and does not.
|
| 206 |
+
|
| 207 |
+
| tensors | format |
|
| 208 |
+
|---|---|
|
| 209 |
+
| all 64 layers' `mlp.gate_proj` / `up_proj` / `down_proj`; `self_attn.q_proj` / `k_proj` / `v_proj` | NVFP4 (group 16) |
|
| 210 |
+
| `self_attn.o_proj` | FP8 E4M3 (channel weights, dynamic per-token activations) |
|
| 211 |
+
| `lm_head`, `embed_tokens`, norms | BF16 |
|
| 212 |
|
| 213 |
+
`compressed-tensors`, top-level format `mixed-precision`, two config groups. NVFP4 is W4A4, so the
|
| 214 |
+
activation scale is data: exported data-free, every `input_global_scale` comes out zero, vLLM
|
| 215 |
+
computes `1/0`, and the model emits noise while its weights still verify against the source. The
|
| 216 |
+
256 UltraChat conversations are there to observe those scales.
|
| 217 |
|
| 218 |
+
IBM's `model.sig` is deliberately not carried over. It signs the original weights and would not
|
| 219 |
+
verify against these.
|
|
|
|
|
|
|
|
|
|
| 220 |
|
| 221 |
---
|
| 222 |
|
| 223 |
<p align="center">
|
| 224 |
<br>
|
| 225 |
+
<img src="assets/primitive-logo.png" alt="Primitive" width="34"><br>
|
| 226 |
<sub>
|
| 227 |
<a href="https://primitive.com"><b>primitive</b></a> ·
|
| 228 |
<a href="https://huggingface.co/primitive-ai">more models</a> ·
|