This release mirrors the recipe and runtime layout of Lorbus/Qwen3.6-27B-int4-AutoRound — the official-base counterpart — but starts from the heretic / abliterated text body for less-restricted generation.
TL;DR
Base: huginnfork/Qwen3.6-27B-uncensored-heretic-v2-mtp (dense Qwen3_5ForConditionalGeneration, 64 layers, multimodal, MTP head preserved)
--kv-cache-dtype fp8 is the right pick for mainline vLLM. Lorbus's README mentions tq-t4nc (TurboQuant 4-bit KV) which is a eugr/spark-vllm-docker fork only. Mainline vLLM 0.20.0 actually exposes nvfp4, turboquant_4bit_nc, turboquant_k8v4, turboquant_3bit_nc etc. in its CacheDType literal — but on this model they are unavailable: nvfp4 has no backend supporting head_size=256 (Qwen3.6's head_dim), and all turboquant_* variants are rejected as NotImplementedError: TurboQuant KV cache is not supported for hybrid (attention + Mamba) models because Qwen3.6's interleaved Gated DeltaNet + full-attention layout classifies as hybrid. So fp8 is the only path on mainline.
--language-model-only keeps vision modules out of the runtime graph for text-only workloads. Drop it to enable image input.
--speculative-config uses the model's native MTP head as a built-in drafter. num_speculative_tokens=3 is the sweet spot per Lorbus's tuning.
Multimodal serving
For image input, drop --language-model-only and reduce max-model-len to leave room for the vision tower's activation budget (e.g. --max-model-len 32768 --gpu-memory-utilization 0.94).
OpenAI-compatible request
python
1from openai import OpenAI
2client = OpenAI(base_url="http://localhost:8000/v1", api_key="EMPTY")3r = client.chat.completions.create(4 model="Qwen3.6-27B-heretic-int4-AutoRound",5 messages=[{"role":"user","content":"Write a quicksort in Python."}],6 max_tokens=512,7)8print(r.choices[0].message.content)
Quantization details
Field
Value
Base
huginnfork/Qwen3.6-27B-uncensored-heretic-v2-mtp
Method
AutoRound (intel/auto-round 0.13.0)
Scheme
W4A16 (4-bit weights, FP16 activations)
Bits
4
Group size
128
Symmetric
yes
Packing format
auto_round:auto_gptq
Unquantized layers
every linear_attn.in_proj_a/b (48 layers × 2), mtp.fc, all LayerNorms / RMSNorms, full vision tower (BF16)
After warmup we expect to reach Lorbus's reported 139–162 tok/s envelope; cold numbers shown above.
Reproduction (advanced)
This repo's full toolchain (Dockerfile, quantize.py, post-quant relabel_keys.py + fix_vision.py, docker-compose.yml, bench.sh) is included for transparent reproduction. Key non-obvious steps:
Quantize via AutoModelForCausalLM, not the multimodal class — the Conditional class needs a Qwen3VLProcessor that ships separately. Force auto-round's detect_model_type → "llm" to bypass MLLM template path.
Skip list: feed layer_config with every linear_attention layer's linear_attn.in_proj_a/b set to bits=16, data_type=fp (mirrors Lorbus's published quantization_config.json exactly — 96 entries for the 48 linear_attention layers).
Calibration: NeelNanda/pile-10k, nsamples=128, seqlen=2048. Wall ~2h on RTX 5090.
Post-quant relabel_keys.py: AutoModelForCausalLM flattens Qwen3_5ForConditionalGeneration and saves keys as model.layers.*. vLLM's serving class for the same arch expects nested model.language_model.layers.*. Without this relabel, vLLM's loader hits a fallback path and OOMs at ~30 GiB during cudagraph capture even at 65k context.
Post-quant fix_vision.py: auto-round's missing-tensor pass auto-quantizes model.visual.blocks.* via WOQ-RTN. vLLM's GPTQ-Marlin kernel rejects vision MLP fc1 (output_size 4304 not divisible by 64). Replace with original BF16 visual tensors from the source; remove model.visual.blocks from block_name_to_quantize.
Restore config skeleton: auto-round saves a flat qwen3_5_text config. Overlay the original huginnfork config.json (root qwen3_5 + nested text_config + vision_config) and only inject quantization_config from auto-round output.
Compact model_extra_tensors.safetensors to drop orphan packed visual tensors after vision swap (saves ~244 MB and avoids confusing vLLM's safetensors scanner).
Without steps 4–7, the artifact looks valid on disk but either OOMs at startup or rejects vLLM's kernel selection.
Cold-start cudagraph capture is heavy — first request after boot takes a few seconds longer; warm throughput climbs into Lorbus's published envelope.
tq-t4nc 4-bit KV is unavailable here — mainline vLLM only supports up to fp8. If you fork eugr/spark-vllm-docker you can plug it in identically to Lorbus.
Vision benchmarking is preliminary — primary focus was text-with-MTP on a 32 GB budget.
Heretic / abliterated content: this is an uncensored model. Guardrails removed during the heretic stage are upstream of this quant; please use responsibly.
Apache 2.0 — same as Qwen3.6-27B base. Heretic abliteration is upstream and inherits its license terms from huginnfork/Qwen3.6-27B-uncensored-heretic-v2-mtp.
Citation
bibtex
1@article{cheng2023autoround,
2 title = {Optimize Weight Rounding via Signed Gradient Descent for the Quantization of LLMs},
3 author = {Cheng, Wenhua and Zhang, Weiwei and Shen, Haihao and Cai, Yiyang and He, Xin and Lv, Kaokao and Liu, Yi},
4 journal = {arXiv preprint arXiv:2309.05516},
5 year = {2023}
6}