ThinkingCap-Qwen3.8-27B-abliterated-FP8-DYNAMIC

An FP8 quantization (W8A8: per-channel FP8 weights, dynamic per-token FP8 activations) of ThinkingCap-Qwen3.8-27B-abliterated, the uncensored variant of bottlecapai/ThinkingCap-Qwen3.8-27B.

31.3 GB, down from 55.6 GB in bf16, at KL 0.0068 against the bf16 model. vLLM runs it as W8A8 on FP8-capable GPUs (Hopper, Ada, Blackwell, DGX Spark) and as weight-only FP8 on Ampere, through its Marlin fallback; no custom kernels either way.

Which build? The FP8-BLOCK build has the same size and a lower KL (0.0046 against 0.0068), and ran at the same speed on a DGX Spark with vLLM 0.30. Prefer it on Blackwell. On Hopper, vLLM 0.30 by default runs block-scaled FP8 through DeepGEMM with the block scales rounded to powers of two (per its source; not tested here): use FP8-BLOCK with VLLM_USE_DEEP_GEMM=0, or this build. This per-channel build stays for Ada GPUs (RTX 40xx, L40S, L4), where vLLM runs it as W8A8 but has no W8A8 kernel for the block-scaled one. Other vLLM versions and engines were not checked with the block-scaled build.

Usage

vLLM

Tested 2026-10-07 with vLLM 0.30.0 (vllm/vllm-openai:v0.30.0) on a DGX Spark (GB10), text only (--language-model-only), --max-model-len 32768, MTP on. vLLM chose CutlassFP8ScaledMMLinearKernel. One test prompt at temperature 0 was answered correctly. Eight varied prompts at temperature 0 ran at 16.88 tokens/s; their answers were not inspected. A forced 512-token request without MTP, run twice, gave 7.91-7.93 tokens/s. Image input was not tested.

On a DGX Spark, use a vLLM build with cu130 wheels.

vllm serve IstroSec/ThinkingCap-Qwen3.8-27B-abliterated-FP8-DYNAMIC \
  --language-model-only \
  --reasoning-parser qwen3 \
  --enable-auto-tool-choice --tool-call-parser qwen3_xml \
  --speculative-config '{"method":"mtp","num_speculative_tokens":3}' \
  --max-model-len 65536 --gpu-memory-utilization 0.85

Sampling (Qwen3.8 recommendations, which ThinkingCap uses unchanged): thinking mode temperature 1.0, top_p 0.95, top_k 20, min_p 0; non-thinking mode temperature 0.7, top_p 0.8, top_k 20, presence_penalty 1.5. Thinking budget via chat_template_kwargs: {"reasoning_effort": "xhigh"}, with xhigh (default, recommended), medium or low.

KV cache. Only the 16 full-attention layers have a KV cache, so FP8 KV (--kv-cache-dtype fp8) saves less memory than on a dense model. Leave it at auto unless memory is short; if you do enable it, fp8_e5m2 needs no scales.

MTP. The head is bf16 and listed in quantization_config.ignore. In the test above (3 speculative tokens, temperature 0, 8 prompts) vLLM accepted 69.5% of drafted tokens (3,410 of 4,905, mean acceptance length 3.09); figures from sampling-based runs are not directly comparable.

Image input. For text-only use keep --language-model-only; it also skips the vision tower's memory. For images, drop it and keep MTP. If startup then fails in profile_run with 'NoneType' object has no attribute 'size', vLLM reused a compiled graph cached by an earlier run with different multimodal limits (vllm#58203, a duplicate of vllm#50891): start with a fresh VLLM_CACHE_ROOT or set VLLM_USE_AOT_COMPILE=0.

Transformers

Loads with the weights dequantized to bf16, so it needs about 56 GB of memory:

from transformers import AutoModelForImageTextToText
m = AutoModelForImageTextToText.from_pretrained("IstroSec/ThinkingCap-Qwen3.8-27B-abliterated-FP8-DYNAMIC", device_map="cuda")

llama.cpp

Not for llama.cpp: this is compressed-tensors format. GGUF builds are made separately from the bf16 source.

Evaluation

Heretic's evaluator (--evaluate-model), 100 harmful and 100 harmless prompts, against the bf16 abliterated checkpoint:

Size Refusals (100 harmful) KL vs. bf16 abliterated
bf16 abliterated (source) 55.6 GB 6 / 100 โ€”
FP8, DeltaNet kept in bf16 (earlier build) 36.8 GB 7 / 100 0.0047
FP8, DeltaNet quantized (this repo) 31.3 GB 7 / 100 0.0068

Quantizing DeltaNet saved 5.5 GB for 0.0021 more KL, so this build replaced the earlier one.

Heretic decodes greedily, so there is no sampling noise, but a re-run with a different batch size can still move a count by about one prompt. Differences of one or two refusals are not significant.

Provenance: the original ThinkingCap refuses 97/100; the bf16 abliteration brings that to 6/100 at KL 0.065 against the original; this quantization adds a further KL of 0.0068 relative to the abliterated model.

How it was made

Produced with llm-compressor 0.14.0, scheme FP8_DYNAMIC: per-channel FP8 (E4M3) weights, per-token dynamic FP8 activations. Data-free: no calibration set.

What is quantized

Every Linear in the text decoder: the 64 MLPs, the q/k/v/o_proj of the 16 full-attention layers, and the three large Gated DeltaNet projections (in_proj_qkv, in_proj_z, out_proj) in the other 48 layers.

Kept in bf16:

Component Why
linear_attn.in_proj_a, in_proj_b tiny (output dimension 48); negligible size, kept at full precision as in bottlecapai's own recipe
visual.* vision tower and merger
lm_head standard
mtp.* MTP head, kept in bf16 so speculative decoding works; its Linears are in quantization_config.ignore

Fused projections

Per-channel FP8 scales stay correct when vLLM runs in_proj_qkv and in_proj_z as one fused GEMM, so this build needs no special scale handling. The NVFP4A16 build does; see its card.

Recipe

In plain llm-compressor 0.14:

from llmcompressor import oneshot
from llmcompressor.modifiers.quantization import QuantizationModifier
recipe = QuantizationModifier(
    targets="Linear", scheme="FP8_DYNAMIC",
    ignore=["lm_head", "re:.*visual.*", "re:.*linear_attn\\.in_proj_(a|b)$"],
)
oneshot(model=model, recipe=recipe)
# llm-compressor 0.14 keeps mtp.* in bf16 when it saves; then add the MTP Linears to quantization_config.ignore
# (older versions drop mtp.*: copy it from the bf16 checkpoint first)

Limitations

Everything from the bf16 card applies: no safety filter, residual refusals around 6/100; thinking and non-thinking modes were not evaluated separately. You are the safety layer.

Speed was measured only on a DGX Spark. On Ampere vLLM runs this build weight-only (see the summary).

License

PolyForm Small Business License 1.0.0 + BottleCap personal-use grant, inherited from ThinkingCap (see LICENSE). Upstream Qwen materials and the abliteration adapter are Apache-2.0 (see NOTICE). Commercial use beyond the PolyForm terms: contact BottleCap AI.

Credits

bottlecapai (ThinkingCap, and the DeltaNet quantization recipe) ยท MuXodious (abliteration adapter) ยท p-e-w/heretic ยท vllm-project/llm-compressor ยท Qwen team

Downloads last month
129
Safetensors
Model size
28B params
Tensor type
BF16
ยท
F8_E4M3
ยท
Inference Providers NEW
This model isn't deployed by any Inference Provider. ๐Ÿ™‹ Ask for provider support

Model tree for IstroSec/ThinkingCap-Qwen3.8-27B-abliterated-FP8-DYNAMIC

Quantized
(9)
this model