← back to catalog · registered 2026-08-27 13:02

voska/Qwen3.8-27B-abliterated-FP8-MTP

voska Qwen 24B second-order
Your rig guess connected
? Why do I need an app?
Reading your rig…

This is a rough estimate. Install the free app - we'll show exact numbers.

Reading real hardware from your app right now. Numbers below are exact.

Below is the per-quantization compatibility for this model.

curl -H "Authorization: Bearer $ABL_KEY" \
     "https://abliteration.org/api/v1/models/voska%2FQwen3.8-27B-abliterated-FP8-MTP"
Response includes
  • classification m1
  • files 13
  • hub_downloads_all_time 287
  • author_summary 2 models
  • readme_text full
10 credits · hourly refresh · ~4 KB payload Get an API key →
Abliteration classifier · v1.0.0
M1
Primary method

Direct removal

No other method signals detected in this model.
Confidence
MEDIUM
Why this label 3 signals
Method inferred from partial signals - repository name, related files, or tag patterns. Producer identity not confirmed; label may sharpen or shift as we gather more evidence.
  • 'abliterated' in name/tags
  • is_gguf=0 (base model)
  • no specific method indicators - defaulting to M1 (most common)
Refusal direction extracted via
Extraction technique

Difference-of-means

Confidence
MEDIUM
Why we say so
primary_method=M1; difference-of-means is the reference extraction for M1/M3 (Arditi 2024)
Downloads · lifetime
287
172 last 30d - active
Likes
0
Model age
6w ago
created 2026-08-27
Downloads over time
Now359→from61↑489%
013226339561 on Aug 26359 on Oct 11AugSepOct
Aug 26 → Oct 11 · 47 snapshots · spans 46 days

Genealogy 0 direct forks

Full fork graph →

This model's place in the market. Above: what it was derived from. Below: the tree of everything derived from it.

Metadata

License
apache-2.0
Tags
transformers safetensors qwen3_5 image-text-to-text abliterated uncensored fp8 w8a8 compressed-tensors mtp speculative-decoding vllm

Related

Total size
29.1 GB
Files
13
Quantizations
1
Registered
2026-08-27 13:02
Last updated on HF
2026-08-27 13:43

Files by quantization

Auxiliary files 13 files 29.1 GB
model-00001-of-00002.safetensors 18.6 GB dee81ebb download
model-00002-of-00002.safetensors 9.71 GB 19c28f74 download
model-mtp-head.safetensors 810 MB 90fa0e3e download
tokenizer.json 19.1 MB 06b95093 download
model.safetensors.index.json 160 KB 1e6695ec download
config.json 14.9 KB 17d1d66c download
README.md 9.73 KB eaf88c1d download
chat_template.jinja 8.74 KB c0c686f9 download
.gitattributes 1.53 KB 52373fe2 download
tokenizer_config.json 1.10 KB d1a20cc3 download
preprocessor_config.json 390 B 2ea84a43 download
video_preprocessor_config.json 385 B 3ba673a5 download
generation_config.json 214 B 0bc3addd download

README current version from Hugging Face


license: apache-2.0
base_model:

  • huihui-ai/Huihui-Qwen3.8-27B-abliterated
    base_model_relation: quantized
    library_name: transformers
    pipeline_tag: text-generation
    tags:
  • qwen3_5
  • abliterated
  • uncensored
  • fp8
  • w8a8
  • compressed-tensors
  • mtp
  • speculative-decoding
  • vllm

Qwen3.8-27B-abliterated-FP8 (MTP preserved)

FP8 W8A8 quantization of huihui-ai/Huihui-Qwen3.8-27B-abliterated,
with the multi-token-prediction (MTP) head intact so vLLM's speculative decoding actually works.

31.2 GB, down from 55.6 GB at BF16. Fits one 48 GB card with room for a long-context KV pool,
or leaves ~65 GB of KV headroom on a 96 GB card.

Why this exists

Qwen3.8-27B ships an MTP head (mtp_num_hidden_layers: 1, 15 mtp.* tensors). Under vLLM
speculative decoding it is worth roughly 2.5x tokens per forward pass — on this build,
51.2% draft acceptance and 2.54 tokens committed per round.

Most conversions lose it silently. Qwen3_5ForConditionalGeneration does not instantiate
the MTP module, so from_pretrained() discards all 15 mtp.* tensors as unexpected keys and
save_pretrained() never writes them back. Anything that round-trips the model through
transformers — including several abliterated re-uploads currently on the Hub — comes out with
1184 tensors instead of 1199 and no speculation available, with nothing in the logs to say so.

This build keeps them, and declares them correctly so vLLM can load them (that declaration is a
second, separate trap — see Gotchas).

Running it

vllm serve voska/Qwen3.8-27B-abliterated-FP8-MTP \
  --max-model-len 262144 \
  --gpu-memory-utilization 0.92 \
  --max-num-seqs 8 \
  --enable-chunked-prefill \
  --enable-prefix-caching \
  --speculative-config '{"method":"qwen3_5_mtp","num_speculative_tokens":3}' \
  --reasoning-parser qwen3 \
  --enable-auto-tool-choice \
  --tool-call-parser qwen3_xml \
  --trust-remote-code

Three of those flags are not optional. vLLM defaults them off, and if you are migrating from
llama.cpp — which handles all three natively — you will ship regressions without noticing.

--reasoning-parser qwen3

Without it the chain-of-thought lands in content along with a stray closing </think>:

"We need to answer user: ... Final: 4.\n</think>\n\n4"

With it, content is "4" and reasoning goes to its own field. This affects every reply.

--enable-auto-tool-choice --tool-call-parser qwen3_xml

Without these, any request with tool_choice: "auto" fails with HTTP 400:

"auto" tool choice requires --enable-auto-tool-choice and --tool-call-parser to be set

Plain chat keeps working perfectly, so health checks and manual testing sail right past it while
every agentic client is hard-broken. qwen3_xml is correct because this model's chat template
emits the XML-nested form, not Hermes JSON. Verify for yourself:

grep -c '<function=' chat_template.jinja   # non-zero -> qwen3_xml

--speculative-config

This is what activates the MTP head. Omit it and you get a perfectly good FP8 model with the
head sitting unused.

For text-only serving add --limit-mm-per-prompt '{"image":0,"video":0}'; the vision tower is
present but left at BF16.

Verify speculation is actually working

Speed alone will not tell you. Check the counter:

curl -s localhost:8000/metrics | grep spec_decode_num_accepted_tokens_total

If it reads 0.0 while num_draft_tokens_total climbs, the head is loaded but every draft is
being rejected — you are paying for speculation and getting nothing back.

Performance

Measured on 1x RTX PRO 6000 Blackwell Max-Q Workstation Edition (96 GB GDDR7, SM120),
vLLM 0.26.0, speculation at k=3.

Important caveat: this card was running at a 260 W power cap, which pins the SM clock around
952 MHz against a 3090 MHz maximum — roughly 31% of rated clock, with memory near full speed.
Decode is bandwidth-bound so it suffers little; prefill is compute-bound and is being heavily
throttled here.
On an unconstrained card, expect prefill materially higher than these numbers.

BF16 FP8 (this)
prefill 4,018 tok/s 6,663 tok/s
decode, single stream 47–49 tok/s 67–79 tok/s
decode @ 8 concurrent, per stream 38.3 tok/s 55.9 tok/s
aggregate @ 8 concurrent 288.8 tok/s 427.4 tok/s
KV cache pool @ 262K ctx 486K tokens 820K tokens

Aggregate scaling is near-linear — 67 / 117 / 234 / 427 tok/s at 1 / 2 / 4 / 8 concurrent, zero
errors at every level. Per-stream throughput only falls ~17% going from 1 to 8 concurrent users.

MTP: 51.2% draft acceptance, 2.54 tokens/round.

Context is 262,144 native (max_position_embeddings), not YaRN-extended. The architecture is
hybrid — layer_types is full_attention every 4th layer, 16 of 64 — so KV costs only
64 KB/token, which is why a 262K window is affordable at all.

How we actually run it

Served to a small group of concurrent users behind an OpenAI-compatible gateway, on one
dedicated GPU, as a systemd-managed container:

  • --max-num-seqs 8 — matched to the real user count rather than left at the default
  • --enable-chunked-prefill is doing heavy lifting. This replaced a llama.cpp deployment
    where one user pasting a 130K-token context would monopolize the GPU and starve everyone
    else's decode down to single-digit tok/s. Chunked prefill with decode priority is most of why
    per-stream throughput barely moves as concurrency rises.
  • --enable-prefix-caching — large shared system prompts across agent turns
  • speculation at k=3, not higher. vLLM warns that num_speculative_tokens > 1 runs multiple
    forward passes over the same single MTP layer, and acceptance decays per position — we measure
    70% / 45% / 28% at positions 0 / 1 / 2. k=3 still earns its keep; deeper does not, and reports
    elsewhere suggest shallower is better again at very long context.
  • Restart cap. Whatever supervises this, bound it. A crash-looping vLLM container will
    happily accumulate thousands of restarts overnight while looking "up" from outside.

Migration note: coming from llama.cpp, remember its -c is a total KV budget divided across
-np slots, whereas vLLM's --max-model-len is per request against a shared paged pool. The
pool here (820K tokens) is smaller than a naive slots×context figure but far better utilized.

Quality

FP8 is a lateral move from 8-bit GGUF, not a step down. Published KL-divergence measurements for
this model family put Q8_0 at 0.00064 against BF16, with all 8-bit formats clustered around
0.0006–0.0007 — while the best 4-bit sits at 0.00835, an order of magnitude worse. If you care
about output quality, 8-bit is the floor worth holding.

Abliteration behaviour is unchanged from the base: a 10-prompt refusal probe spanning adult
fiction, profanity, contested political argument, harm reduction, security education, blunt
medical advice and dark fiction returned 0/10 refusals, identical to the BF16 source.

How it was made

FP8 dynamic requires no calibration data — weights are quantized statically per channel,
activations dynamically per token at runtime. That is the whole recipe:

from llmcompressor import oneshot
from llmcompressor.modifiers.quantization import QuantizationModifier

recipe = QuantizationModifier(
    targets="Linear",
    scheme="FP8_DYNAMIC",
    ignore=["lm_head", "re:.*visual.*"],
)
oneshot(model=model, recipe=recipe)
model.save_pretrained(DST, save_compressed=True, save_original_format=False)

Roughly 20 seconds on a free GPU. lm_head and the vision tower stay BF16, matching Qwen's own
FP8 release.

Gotchas if you build your own

1. save_pretrained crashes on transformers 5.14.1. You get
ValueError: dictionary update sequence element #0 has length 1; 2 is required, reported
misleadingly as a weight-conversion/offloading failure. The cause is misplaced braces upstream:
weight_map.update({k: ...} for k in ...) builds a generator of one-key dicts instead of a dict
comprehension. Pass save_original_format=False.

2. The MTP head needs grafting and declaring. After quantizing, copy the 15 mtp.*
tensors over from the BF16 source (~0.85 GB, fine to leave unquantized) — and add their 8
Linear modules to quantization_config.ignore
:

mtp.fc
mtp.layers.0.mlp.{down,gate,up}_proj
mtp.layers.0.self_attn.{q,k,v,o}_proj

Skip that second step and vLLM expects weight_scale tensors that do not exist. It loads
without complaint and acceptance drops to exactly zero — measured here as 7,194 draft tokens
generated, 0 accepted, with decode falling from ~79 to 30 tok/s. It reads as "disappointing"
rather than "broken," which is what makes it dangerous.

Limitations

  • Vision is untested. The tower is present and left at BF16, but this build was only
    exercised for text.
  • Long-context behaviour was verified for KV allocation and prefill throughput, not for
    retrieval quality at depth.
  • Benchmarks come from one power-limited card; absolute numbers will differ on yours.

About abliteration

This is an uncensored model — refusal behaviour has been ablated. It will engage with material
its instruction-tuned parent declines. Abliteration also removes safety behaviours you may
actually want. Evaluate it for your use case; you own what you deploy.

Credits

Apache 2.0, inherited from the base model.

README history 3 versions

The author's README evolved over time. Click a version to see its content at that point.

  1. 2026-08-27Restructure to quant-card canon: overview block, sampling params, prompt form...c2f4b8814.5 KB
    Loading...
  2. 2026-08-27Add tool-calling flags, name the test hardware, add serving notesd1d5ca59.7 KB
    Loading...
  3. 2026-08-27Upload README.md with huggingface_hubd9e9c216.9 KB
    Loading...
Catalog is the map. Apps are the tools.

Run models on your own machine, not in the cloud.

Every model page has an "Open in Abliteration" button that hands the model directly to the first-party desktop client, at the quantization your rig can actually run. No API keys, no subscription, no prompt leakage.

Open in Abliteration