Downloads · 30 days
50.6K
28% of all-time downloads
avyukth/Qwen3.8-27B-AWQ-INT4
Qwen3.8-27B-AWQ-INT4 is a image-text-to-text model from avyukth. Use it for the image-text-to-text task on the model card, and read the license before you ship it in a product. It is set up for transformers. The card lists the license as apache-2.0.
4-bit weight quantisation of Qwen/Qwen3.8-27B, built so the model fits a single 24 GB consumer GPU.
Downloads · 30 days
50.6K
28% of all-time downloads
All-time downloads
180K
Public
Parameters
27.4B
18.6 GB on disk
Likes
4
Public
Click a slice to open those files.
.safetensors18.6 GB · 100%
How the weights are stored.
I3224.4B · 89%
From the Hugging Face model README
4-bit weight quantisation of Qwen/Qwen3.8-27B, built so the model fits a single 24 GB consumer GPU.
Note on the
qwen3_5tag: Qwen3.8 is implemented with the Qwen3.5 architecture (model_type: qwen3_5,Qwen3_5ForConditionalGeneration), so the Hub derives that family tag automatically — the upstreamQwen/Qwen3.8-27Brepo carries it too. This is Qwen 3.8.
55.6 GB → 18 GB. Verified serving on an RTX 3090 (sm_86) under vLLM.
| Language model | INT4, group size 128, symmetric (pack-quantized) |
| Vision tower | bf16, not quantised (see Why the vision tower is bf16) |
lm_head, MTP head | bf16 |
Quantised Linear modules | 496 |
| Size on disk | 18 GB |
| Weights in VRAM | 17.68 GiB |
vllm serve avyukth/Qwen3.8-27B-AWQ-INT4 \
--max-model-len 8192 \
--gpu-memory-utilization 0.93 \
--enable-auto-tool-choice --tool-call-parser qwen3_xml
Text-only serving reclaims the vision encoder cache (~5k extra KV tokens on a 24 GB card):
--limit-mm-per-prompt '{"image": 0}'
from transformers import AutoModelForImageTextToText, AutoProcessor
model = AutoModelForImageTextToText.from_pretrained(
"avyukth/Qwen3.8-27B-AWQ-INT4", device_map="auto")
processor = AutoProcessor.from_pretrained("avyukth/Qwen3.8-27B-AWQ-INT4")
Measured on an RTX 3090 (24 GB, sm_86), vLLM, max_model_len=8192.
| Benchmark | Result |
|---|---|
| GSM8K (exact match, n = 40, temperature 0) | 39/40 = 97.5% |
| Vision: read rendered text | exact |
| Vision: identify shape / colour / position | correct |
The GSM8K figure is on 40 problems, not the full 1319-item test set. It is enough to show reasoning survived quantisation; it is not a leaderboard number, and no bf16 side-by-side was run, so the exact delta from the base model is unmeasured.
ignore_eos)| Concurrency | Aggregate tok/s | Per request | TTFT p50 |
|---|---|---|---|
| 1 | 41.1 | 41.1 | 0.38 s |
| 4 | 136.4 | 34.1 | 1.28 s |
| 8 | 221.5 | 27.7 | 2.21 s |
| 16 | 216.9 | 13.6 | 3.14 s |
| 32 | 211.8 | 6.6 | 13.72 s |
Throughput saturates at concurrency 8; beyond that, aggregate is flat and only latency grows.
linear_attn
(Qwen3_5GatedDeltaNet) layers. AWQ's scaling search must replay a parent
module to collect reference outputs, and Qwen3_5GatedDeltaNet.forward has
the runtime signature (self, *args, **kwargs) — a decorator drops the real
one — so llm-compressor's captured arguments collapse into a single nested
kwargs key and replay fails. Those layers are therefore quantised by
round-to-nearest rather than AWQ. Their MLPs and all full-attention layers
do get proper AWQ scaling. No measurable reasoning cost was found
(GSM8K above), but this is not the same as a full AWQ model.intermediate_size is 4304, which is not
divisible by group_size=128 (4304/128 = 33.625; the only divisor under 256
is 16), so those layers cannot be group-quantised at all. This costs 0.92 GB.
Per-channel quantisation would be the workaround if that matters.W4A16_ASYM) tracks AWQ's usual formulation slightly more closely.HuggingFaceH4/ultrachat_200k.
Calibration data is general chat, not domain-specific.Produced with llm-compressor 0.13.0. Two details that are easy to get wrong
on this architecture:
from llmcompressor.modifiers.transform.awq import AWQModifier # NOT modifiers.awq
from llmcompressor.modifiers.quantization import QuantizationModifier
from llmcompressor.modifiers.transform.awq.dynamic_mappings import (
build_hybrid_attention_mappings)
# The dynamic builder emits layer-index-scoped rules per attention kind.
# Drop only the linear-attention rule; the rest keep proper AWQ scaling.
maps = [m for m in build_hybrid_attention_mappings(model)
if not any("linear_attn" in b for b in m.balance_layers)]
recipe = [
AWQModifier(mappings=maps, duo_scaling="both"),
QuantizationModifier(targets=["Linear"], scheme="W4A16",
ignore=["lm_head", "re:.*visual.*", "re:.*mtp.*"]),
]
Load the model with the class its config declares
(Qwen3_5ForConditionalGeneration), not AutoModelForCausalLM — the
latter resolves to the text-only class, which silently drops the vision tower
and writes a config that no longer matches the weights.
Save the tokenizer from a fresh instance. HF fast tokenizers persist
truncation state, so saving the tokenizer used for calibration bakes
"truncation": {"max_length": 512} into tokenizer.json, which silently
clips every prompt beyond the calibration length.
Apache 2.0, inherited from the base model. All credit for the model itself goes to the Qwen team; this repository contains only a quantisation of their weights.