CoolFace
Modelpublic

primitive-ai/Qwen3.8-27B-mixed-NVFP4-FP8

sourceHugging Faceapache-2.0updated 1mo agoView on Hugging Face
6likes762downloads
Model Card

<p align="center"> <img src="assets/banner.png" alt="Primitive — Qwen3.8-27B mixed NVFP4/FP8" width="100%"> </p>

<p align="center"> <img src="https://img.shields.io/badge/size-~21%20GiB-F98424?style=flat-square" alt="21 GiB"> <img src="https://img.shields.io/badge/vs%20BF16-2.5×%20smaller-F98424?style=flat-square" alt="2.5x smaller than BF16"> <img src="https://img.shields.io/badge/accuracy-88.8%20vs%2089.3%20BF16-3DD13D?style=flat-square" alt="accuracy 88.8 versus BF16 89.3"> <img src="https://img.shields.io/badge/throughput-2.0×%20@%20conc%2032-F98424?style=flat-square" alt="2x throughput at concurrency 32"> <img src="https://img.shields.io/badge/runs%20on-Blackwell%20·%20A100-F98424?style=flat-square" alt="Runs on Blackwell and A100"> <a href="https://primitive.com"><img src="https://img.shields.io/badge/web-primitive.com-lightgrey?style=flat-square" alt="primitive.com"></a> </p>

<h3 align="center">Half the memory. Twice the throughput. The same answers.</h3>

<p align="center"> Mixed-precision quantization of <a href="https://huggingface.co/Qwen/Qwen3.8-27B">Qwen/Qwen3.8-27B</a> down to <b>~21 GiB</b>, <b>2.5× smaller than BF16</b>, that serves on <b>stock vLLM</b><br> and still loads on an A100. </p>


Why this quant

  • —🗜️ 2.5× smaller than BF16, 28% smaller than Qwen's own FP8. 20.7 GiB against 51.7 GiB BF16 and 28.7 GiB FP8.
  • —🎯 Accuracy ties BF16 and eight of the nine builds measured. 88.8 vs 89.3 pooled over 1,370 items. Repeating one unchanged checkpoint moves that number by ~1.1 points, which is wider than the whole field's spread.
  • —⚡ 2.0× throughput at concurrency 32, 2.5× at concurrency 1 versus BF16.
  • —💸 At the cheap end of the field on output tokens. 651 per answer against a 625–818 spread, at a 99.7% completion rate. Both go straight to your serving bill.
  • —🖥️ Verified end to end on Ampere as well as Blackwell. Native FP4/FP8 kernels on Blackwell, Marlin W·A16 fallback on A100, where the BF16 lm_head is what makes that path load.
  • —🚀 Speculative decoding survives quantization. The in-checkpoint MTP head is preserved: up to +101% with a DSpark drafter.
  • —🔧 No calibration data, no custom runtime. Weights-only round-to-nearest, compressed-tensors, stock vllm serve.

Serve it

bash
vllm serve primitive-ai/Qwen3.8-27B-mixed-NVFP4-FP8 \
  --reasoning-parser qwen3 \
  --speculative-config '{"method":"mtp","num_speculative_tokens":2}'

Measured

1,370 items across fourteen public benchmarks. A 1,170-item knowledge suite and a 200-item tool-calling suite, under one fixed protocol for every row: temperature 0.6 / top_p 0.95 / top_k 20, thinking forced on, a 16,384-token budget, concurrency 32, all rows back to back in one sitting on one RTX PRO 6000 Blackwell.

buildsizeoverallknowledgecallabstainruns k/afinishedout/answertok/s @ 32per-token latencytok/s @ 1
Qwen BF1651.7 G89.391.085.655.01/199.1%81848366.2 ms26.3
Qwen FP828.7 G89.691.485.055.01/199.3%80775242.6 ms45.6
rdtand PrismaAQUA 5.5bit22.0 G89.491.285.652.51/199.6%79392734.5 ms58.3
unsloth NVFP4 †21.8 G89.691.485.057.51/199.6%75097432.9 ms59.6
this repo20.7 G88.890.485.554.512/599.7%65190835.3 ms66.4
RadixArk NVFP4 †20.4 G89.591.385.052.53/199.3%78298532.5 ms63.7
cyankiwi AWQ-INT419.6 G89.891.385.662.51/199.4%71895633.5 ms69.3
sakamakismile MTP-NVFP419.1 G89.190.884.457.51/199.8%62596533.1 ms67.8
gittensor NVFP4-RTX5090 †17.5 G90.191.686.260.01/199.7%809115127.8 ms69.3
this repo, its single leg from the sitting above—88.389.985.652.51/199.7%65190835.3 ms—

`overall` is one number over both suites: the 1,170 knowledge and 200 tool-calling items pooled as 1,370, weighted 85.4% and 14.6% by item count. Repeat runs of one checkpoint moved it by about a point, so treat a gap below 1.0 as a tie.

<details> <summary>Where the tool-calling half goes: call vs abstain</summary>

buildagenticcallabstain
Qwen BF1679.585.655.0
Qwen FP879.085.055.0
rdtand PrismaAQUA 5.5bit79.085.652.5
unsloth NVFP4 †79.585.057.5
this repo79.385.554.5
RadixArk NVFP4 †78.585.052.5
cyankiwi AWQ-INT481.085.662.5
sakamakismile MTP-NVFP479.084.457.5
gittensor NVFP4-RTX5090 †81.086.260.0

call is accuracy on the 160 rows that require a call; abstain is the 40 whose correct action is to call nothing. Benchmarks: BFCL v4 (30, including irrelevance), xLAM/APIGen (45), ToolACE (45), Glaive v2 (40), nvidia When2Call (40, the abstention rows). Tool schemas go in the system prompt and the model answers with a JSON array of calls, the same way for every model. An item counts only if every expected call is present with acceptable arguments and no call is invented.

Abstention is the weak axis for every model we have measured (52–82%), so a build can look strong on overall and still over-call.

</details>

† These three checkpoints ship a `kv_cache_scheme` that enables an FP8 KV cache automatically. That is a real memory advantage, and it also lifts their throughput against builds running a BF16 KV cache, so the speed columns are not purely a comparison of weights.

Read the `runs` column before the ordering. This build's figures are means of twelve knowledge runs; every community build except RadixArk is a single draw. Re-running RadixArk interleaved with this build on one host settled its 92.0 to 91.3, and left the two 0.35 apart on knowledge. Since one unchanged checkpoint moves overall by ~1.1 points, the 1.3 points separating this whole field is not a ranking. Decide on size, output tokens and hardware instead.

A100 40 GB. Everything runs Marlin W·A16 there, and a build whose lm_head is quantized will not load on that path at all, which is why this one leaves it at BF16:

buildacctok/s @ conc 32tok/s @ conc 1
this repo88.1790.053.9

Repeat measurements of this exact checkpoint span 89.7 to 91.0 on the knowledge suite across twelve runs in five sittings, sd 0.39, and its tool-calling half moves about a point over five. Throughput moved −4.5% between two of those sittings, which is why every row of a table here is measured back to back rather than assembled from separate runs.


Speculative decoding

<p align="center"> <img src="assets/speculative.png" alt="Throughput gain over no drafting: MTP +59% at concurrency 1 and +61% at 16; DSpark drafter +101% at concurrency 1 and +83% at 16" width="100%"> </p>

A separate measurement run from the table above. The baselines differ, so the two are never plotted together.

speculative configconc 1conc 16
none59.4 tok/s396.6 tok/s
MTP ({"method":"mtp","num_speculative_tokens":2})+59%+61%
DSpark drafter (RadixArk/Qwen3.8-27B-DSpark, n=4)+101%+83%
Gotcha: the RadixArk drafter's config.json needs architectures: ["Qwen3DSparkModel"]. As shipped it says DSparkDraftModel, which vLLM routes to the DeepSeek-V4 class and crashes on hc_mult.

Reasoning effort is a real cost lever

Qwen3.8's chat template exposes reasoning_effort, and its default is xhigh. Measured on this checkpoint, same 1,170 items, same sitting:

`reasoning_effort`accfinishedout/answertok/s @ conc 32per-token latency
xhigh (the default)90.599.7%61389435.8 ms
medium89.799.8%58790135.5 ms
low89.399.9%528103530.9 ms
bash
curl localhost:8000/v1/chat/completions -d '{
  "model": "...", "messages": [...],
  "chat_template_kwargs": {"reasoning_effort": "low"}
}'

`low` costs 1.2 accuracy points and returns about 25% cheaper answers. 14% fewer output tokens and 14% lower per-token latency, which compound. On a throughput-bound deployment where a point of accuracy is worth less than a quarter of the serving bill, that is the setting to run.

`medium` is not worth using. It saves 4% of tokens for 0.8 points, the worst trade of the three.


Comparable with our other models

Accuracy numbers move for reasons that have nothing to do with the model: a shorter token budget, a different temperature, or whether the model was allowed to reason at all. So every number in this table, on this card and on our other cards, comes from one fixed protocol.

The same 1,370 items: a 1,170-item knowledge suite (MMLU-Pro, ARC-Challenge, HellaSwag, WinoGrande, CommonsenseQA, BoolQ, OpenBookQA, GSM8K, MATH-500) and a 200-item tool-calling suite (BFCL v4, xLAM/APIGen, ToolACE, Glaive v2, nvidia When2Call). temperature 0.6, top_p 0.95, top_k 20, thinking forced on, a 16,384-token budget, no reasoning parser, scoring the last ANSWER: in the reply. Concurrency 32 on one RTX PRO 6000 Blackwell, each model's rows in one sitting. Auto-scored, no LLM judge. Both halves are means of at least three runs per build.

modelshapesizeoverallknowledgecallabstainfinishedouttok/s @ 32
Laguna-XS-2.131 B MoE19.3 GiB81.783.868.473.598.9%1097 tok1523
Nemotron-3.5-Lightning-30B-A3B30 B MoE+Mamba19.2 GiB87.187.985.470.597.9%1429 tok2204
Ornith-1.5-35B-A3B35 B MoE22.6 GiB88.791.774.460.099.3%760 tok1469
Muse-Glimmer-30B30 B MoE20.4 GiB86.688.878.654.599.7%800 tok1176
Qwen3.8-27B (this repo)27 B dense20.7 GiB88.890.485.554.599.7%651 tok908
Laguna-S-2.1110 B MoE64.0 GiB84.387.164.681.097.3%995 tok670
Qwen3.8-Flash-Next180 B MoE (6 B active)183.7 GB90.392.284.856.799.5%686 tok816

Read `overall` with `finished`. overall scores an answer that overran the token budget as wrong, but it cannot say whether the model needed the room or failed to stop; finished and out separate those. A gap under 1.0 is a tie. The tok/s column comes from each model's own sitting and drifts a few percent between sittings, so read it as a bracket.

`call` and `abstain` are the tool-calling suite's two halves, reported separately. call is accuracy on the 160 items that require a tool call; abstain is the 40 whose correct action is to call nothing. They used to be pooled into one agentic number, and the pooling misled: a model with ordinary call accuracy and unusual abstention discipline outscored models that are better at actually making calls. Weight them by your own workload's mix.

<details> <summary>Per-benchmark detail, both halves</summary>

benchmarkLaguna-XS-2.1Nemotron-3.5-Lightning-30B-A3BOrnith-1.5-35B-A3BMuse-Glimmer-30B**Qwen3.8-27B**Laguna-S-2.1Qwen3.8-Flash-Next
knowledge
mmlu_pro79.082.089.589.089.581.089.0
math_50076.080.088.074.082.083.086.0
gsm8k97.096.099.098.098.099.097.0
arc_challenge94.097.398.798.098.096.098.7
hellaswag70.778.086.783.382.076.788.7
winogrande84.789.389.390.789.386.095.3
commonsenseqa80.883.386.782.584.285.886.7
boolq90.092.092.090.091.092.094.0
openbookqa94.099.098.097.097.094.096.0
tool calling
bfcl_v483.396.776.786.796.790.096.7
xlam64.473.355.666.777.848.982.2
toolace37.871.171.164.468.948.973.3
glaive87.597.592.5100.0100.085.0100.0
when2call75.077.552.555.055.075.055.0

</details>

What's quantized to what

tensorsformat
all 64 layers' MLP gate/up/down_proj; linear-attn in_proj_qkv/in_proj_z on layers 8–63NVFP4 (group 16)
full-attn q/k/v/o_proj; linear-attn in_proj_qkv/in_proj_z on layers 0–7; linear_attn.out_projFP8 E4M3 (channel)
lm_head, linear-attn in_proj_a/in_proj_b gates, conv1d, norms, embeddings, vision tower, MTP headBF16

Weights-only round-to-nearest, no calibration.


<p align="center"> <br> <img src="assets/primitive-logo.png" alt="Primitive" width="34"><br> <sub> <a href="https://primitive.com"><b>primitive</b></a> · <a href="https://huggingface.co/primitive-ai">more models</a> · inference economics for production LLM systems </sub> </p>