pplx-decider-v1.1-27b β€” GGUF

llama.cpp port of perplexity-ai/pplx-decider-v1.1-27b, a decision model: it does not generate text, it answers typed questions about a shared state and returns calibrated probabilities. Same request shape as TypeSafe's Jev (state + noul / choice / score questions).

The upstream checkpoint is bf16 safetensors that needs torch and ~49 GB of weights. This repo makes it runnable under llama.cpp.

file size KL vs bf16 decision flips
pplx-decider-v1.1-27b-Q8_0.gguf 25.4 GB 0.000118 1 / 240
pplx-decider-v1.1-27b-Q5_K_M-dyn.gguf 18.2 GB 0.000794 1 / 240
pplx-decider-v1.1-27b-imatrix.gguf 14 MB β€” β€”

Both quants carry the decision head inside the GGUF as cls.output.weight; readout.safetensors is shipped as well so a runtime can load it independently.

Three things to know before deploying this

1. The attention is bidirectional, so there is no prefix to cache. The checkpoint's attention_mode is noncausal_full_attention: 16 of the 64 layers run full attention with the causal mask removed, the other 48 are linear/recurrent and keep theirs. The prompt is ordered State β†’ Question β†’ Options, so the state's representation depends on which question follows it. Nothing can be reused between questions, and the upstream code enforces this by refusing a KV cache outright. Each question is a full forward pass over the whole state. The first full-attention layer is index 3, so the theoretical ceiling for prefix reuse is 3 of 64 layers (~5 %).

This is the same property that makes the model good: because it can re-read the subject after seeing the question, it handles Czech case marking and word order better than causal decision models. Accuracy and throughput are traded against each other here, not independent.

2. Over 8192 tokens it refuses rather than truncates. prepare() raises instead of cutting the record ("no input was truncated"), and the server in runtime/ returns HTTP 400. That is worth preferring over a model that silently answers from a fragment with high confidence.

3. It is a dense 27B. ~25.6 B parameters (after dropping the vision tower), no MoE, all of it active on every pass. Measured ~1.05 ms per token of state on a GB10: 0.56 s at 0.5k tokens, 8.7 s at the 8192-token maximum. It will not fit an 8 GB card in any of these quants.

Quantization

llama-imatrix over 5.0 MB (1707 prompts) rendered with the model's own decision_messages() and chat template from 603 real Czech and English article states, with a mix of noul / choice / score questions and option counts from 2 to 23. Calibration in the production prompt shape, not plain prose.

The quality metric is KL divergence on the decision distribution, not token perplexity. This model has no language head, so llama-perplexity and the generic KL tooling measure something it never does β€” the reported perplexity during imatrix collection is ~5Β·10⁡ and is meaningless. The numbers here compare the 255-way option distribution against the bf16 GGUF, on 240 held-out states (a different seed from the calibration corpus).

All ten candidates, measured identically:

candidate size mean |dp| p99 |dp| KL flips
Q8_0 25.38 GB 0.00227 0.01795 0.000118 1
Q6_K + ssm f32 19.67 GB 0.00389 0.03574 0.000453 3
Q6_K 19.60 GB 0.00420 0.05000 0.000588 1
Q5_K_M-dyn 18.24 GB 0.00583 0.05408 0.000794 1
Q4_K_M 14.75 GB 0.00961 0.09077 0.002188 2
Q4_K_M + embd q8_0 15.03 GB 0.00970 0.09869 0.002287 2
Q4_K_M + ssm f32 14.82 GB 0.00967 0.10589 0.002384 4
Q4_K_M + full layout 16.16 GB 0.01003 0.10748 0.002701 2
Q5_K_M 17.10 GB 0.00863 0.13787 0.002774 3
Q5_K_M + ssm f32 17.17 GB 0.01008 0.14577 0.004088 5

A paired bootstrap (10 000 resamples over the same 240 items) on the three best:

pair Ξ”KL 95 % CI verdict
Q8_0 βˆ’ Q6_K βˆ’0.000470 [βˆ’0.000862, βˆ’0.000178] real
Q8_0 βˆ’ Q5_K_M-dyn βˆ’0.000677 [βˆ’0.000963, βˆ’0.000440] real
Q6_K βˆ’ Q5_K_M-dyn βˆ’0.000207 [βˆ’0.000598, +0.000233] not distinguishable

Q6_K is therefore not published: it is 1.4 GB larger than Q5_K_M-dyn with no measurable quality advantage on this set. Q8_0 is a real improvement and is published for anyone who wants the headroom.

What did not work

Published recipes are usually a list of things that helped. These are the things that did not, because they cost a day to find out:

  • cls.output.weight=f16 is a no-op. llama-quantize leaves the 255Γ—5120 decision head at bf16 on its own. --output-tensor-type does not reach it either β€” that flag targets output.weight, which this checkpoint does not have.
  • Forcing the recurrent gains to f32 makes things worse. ssm_alpha/beta/dt/conv1d = f32 alone raised KL at both Q4 (0.0022 β†’ 0.0024) and Q5 (0.0028 β†’ 0.0041), and doubled the flips. The gain in Q5_K_M-dyn comes from the rest of the layout, chiefly ssm_out and the attention projections at q8_0.
  • --token-embedding-type q8_0 changed nothing measurable (0.002188 β†’ 0.002287).
  • Lower KL does not mean better decisions. Q6_K + ssm f32 has a lower mean KL than plain Q6_K (0.000453 vs 0.000588) and three times the flips (3 vs 1). Selecting on mean KL alone would have picked the worse model.
  • A layout lifted from a different model in the same family (Clef-Flash) did not transfer.

Caveats on these numbers

240 items is a small sample and KL is heavily skewed β€” the worst 5 % of items carry 45–71 % of the total. That is why the confidence intervals are wide and why differences inside the 2–4Β·10⁻³ group should not be read as a ranking. The two gaps claimed above are the only ones the bootstrap supports.

Port fidelity

Before any quantization, the bf16 GGUF was checked against the original torch checkpoint on 25 Czech and English items:

mode mean |dp| max |dp| flipped decisions
non-causal (correct) 0.00042 0.00641 0 / 25
causal (control) 0.13590 0.99602 3 / 25

The causal control is the proof that llama_set_causal_attn(ctx, false) is doing real work and that llama.cpp's routing matches the model's own hook: causal_attn reaches only set_input_kq_mask, i.e. the full-attention layers, leaving the recurrent ones alone.

All quant numbers above are measured against this bf16 GGUF, so port error (4·10⁻⁴) and quantization error are not mixed together.

Running it

runtime/pplx_bridge.cpp is a small binary that takes token ids on stdin and returns the last token's hidden state; runtime/pplx_api.py puts a Jev-compatible POST /v1/systemone in front of it and applies the readout.

g++ -O2 -std=c++17 -I llama.cpp/include -I llama.cpp/ggml/include -I llama.cpp/src \
    runtime/pplx_bridge.cpp -L <build>/bin -lllama -lggml-base \
    -Wl,--allow-shlib-undefined -Wl,-rpath,<build>/bin -o pplx_bridge

MODEL_DIR=. GGUF=./pplx-decider-v1.1-27b-Q5_K_M-dyn.gguf BRIDGE=./pplx_bridge \
  python3 runtime/pplx_api.py
curl -s localhost:8012/v1/systemone -H 'Content-Type: application/json' -d '{
  "state": "Spartu porazila Plzeň 2:1.",
  "questions": {
    "won":   {"type": "noul", "instructions": "VyhrÑla Plzeň?"},
    "topic": {"type": "choice", "instructions": "Classify the state.",
              "criteria": {"sport": "sport", "politics": "politics", "other": "anything else"}}
  }}'

Two requirements the bridge has that a normal llama.cpp model does not: causal_attn off, and n_ubatch large enough for the whole prompt β€” chunking the prefill would cut the bidirectional attention window at every chunk boundary.

How it compares

Measured on identical item sets against hosted Jev and Liquid d1 (via Vercel AI Gateway) and our own Clef-Flash and Rune deployments:

pplx-decider Jev Liquid d1 Clef-Flash Rune 26B-A4B
16-item CZ/EN boolean 16/16 15/16 15/16 15/16 14/16
Brier (calibration) 0.013 0.061 0.063 0.065 0.100
Czech OVS word order 7/9 5/9 5/9 5/9 5/9
latency at 2k tokens 2.1 s 0.30 s 0.37 s 1.8 s β€”
state limit 8 192 32 000 65 536 16 384 16 384
shared prefix across questions no yes yes yes yes

It is the most accurate and by far the best calibrated decision model we have measured, and the only one that gets any of the Czech object-verb-subject items right β€” "Spartu porazila Plzeň 2:1." / "VyhrΓ‘la Plzeň?" is answered 1.00 here and 0.00–0.02 by everything else. It still misses two of the four OVS items, both times confidently.

The cost is throughput: no prefix sharing means a 10-question evaluation over one state costs ten full passes (21.7 s at 2k tokens, versus 2.0 s for Clef-Flash, which answers all ten in one pass). Pick this model when the verdict matters more than the rate.

Licence

Apache 2.0, inherited from the upstream checkpoint. runtime/autojev/ is the upstream prompt and answer code, redistributed under the same licence.

Downloads last month
5,867
GGUF
Model size
26B params
Architecture
qwen35
Hardware compatibility
Log In to add your hardware

5-bit

8-bit

Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support

Model tree for Livesport/pplx-decider-v1.1-27b-GGUF

Base model

Qwen/Qwen3.8-27B
Quantized
(4)
this model

Spaces using Livesport/pplx-decider-v1.1-27b-GGUF 2