Views
No views yet
pack-quantized format.This checkpoint does not load on stock vLLM. It needs a two-line patch toqwen3_5.py/qwen3_5_mtp.py, supplied invllm-patch/. See Running it before downloading this.
KL(P_base || Q_quant) in nats. Same reference distribution and the same token sequence as every other row, and the tokenization was verified byte-identical against the previous build's stored token array.| Metric | INT6-Mixed | BF16 base |
|---|---|---|
| mean KL | 0.001980 (±SE 0.000051) | 0 |
| median | 0.001135 | — |
| p90 | 0.003683 | — |
| p95 | 0.005642 | — |
| p99 | 0.014824 | — |
| p99.9 | 0.055416 | — |
| max | 4.638205 | — |
| top-1 agreement | 97.905 % | 100 % |
| Perplexity | 7.9183 | 7.9112 |
| Group | Scheme | Tensors |
|---|---|---|
mlp.{gate,up}_proj, the 44 middle layers | INT6 symmetric, group_size 64 | 88 |
mlp.{gate,up}_proj, the 20 edge layers | INT7 symmetric, group_size 64 | 40 |
mlp.down_proj, the 44 middle layers | INT7 symmetric, group_size 64 | 44 |
mlp.down_proj, the 20 edge layers | INT6 symmetric, group_size 64 | 20 |
self_attn.{q,k,v,o}_proj, the 16 full-attention layers | INT7 symmetric, group_size 64 | 64 |
linear_attn.{in_proj_qkv,in_proj_z,out_proj}, 48 layers | INT8 symmetric, group_size 128 | 144 |
MTP block (self_attn.*, mlp.*) | INT5 symmetric, group_size 128 | 7 |
embed_tokens, lm_head | INT8 symmetric, group_size 128 | 2 |
linear_attn.{in_proj_a,in_proj_b}, 48 layers | BF16 | 96 |
| Vision tower (27 blocks, merger, pos_embed) | BF16 | 111 |
mtp.fc | BF16 | 1 |
| All norms | BF16 | — |
HummingLinearKernel through CompressedTensorsWNA16. You need a build where:WNA16_SUPPORTED_TYPES_MAP covers 5/6/7 bits (vLLM PR #46389, merged 2026-06-24),humming-kernels package is installed. It is in requirements/cuda.txt, so a stock CUDA wheel or image has it.1python -c "import importlib.metadata as m; print(m.version('humming-kernels'));
2from vllm.model_executor.layers.quantization.compressed_tensors.schemes.compressed_tensors_wNa16 \
3import WNA16_SUPPORTED_TYPES_MAP as M; print(sorted(M))"
4# humming-kernels 0.1.12
5# [2, 3, 4, 5, 6, 7, 8]HummingLinearKernel.get_min_capability() is 75, so sm86 (RTX 3090) is fine. Verified against vLLM 0.26.1rc1.dev542+gb22afe45a and 0.27.2rc1.dev122+g8efa13b70.CompressedTensorsEmbeddingWNA16Int) that Qwen3.5's model definition never reaches, because models/qwen3_5.py buildsself.embed_tokens = VocabParallelEmbedding(self.vocab_size, config.hidden_size)quant_config nor prefix. vllm-patch/apply.sh pulls the two files out of your image, applies the diffs, and writes the bind-mount flags:1cd vllm-patch && ./apply.sh <your-vllm-image>
2podman run ... $(cat mounts.txt) <your-vllm-image> --model /model ...1vllm serve /path/to/model \
2 --tensor-parallel-size 2 \
3 --gpu-memory-utilization 0.97 \
4 --max-model-len 262144 \
5 --speculative-config '{"method":"mtp","num_speculative_tokens":3}'Using HummingLinearKernel for CompressedTensorsWNA16
Model loading took 12.19 GiB memory and 86.27 seconds
Available KV cache memory: 8.97 GiB
GPU KV cache size: 263,672 tokens, Maximum concurrency for 262,144 tokens per request: 1.01x
Auto-fit max_model_len: full model context length 262144 fits in available GPU memory
Actual usage is 12.36 GiB for consumed memory (weights + non-torch),
1.53 GiB for peak activation, and 0.04 GiB for CUDAGraph memory.embed_tokens cannot be 5, 6 or 7 bits.
vLLM's embedding path is not the Linear path. CompressedTensorsEmbeddingWNA16Int computes pack_factor = 32 // num_bits and its Triton dequant-gather kernel indexes with packed_idx = col // PACK_FACTOR; shift = (col % PACK_FACTOR) * NUM_BITS, i.e. it assumes values never straddle a 32-bit word. compressed-tensors ≥0.18 writes the dense layout, ceil(in_features * bits / 32). At six bits those disagree (5120 // (32 // 6) = 1024 against ceil(5120*6/32) = 960) and the weight loader fails with a shape mismatch. Only widths that divide 32 work, such as 2, 4 and 8. Fixing this means rewriting that kernel, not adding a keyword argument.WNA16_ZP_SUPPORTED_TYPES_MAP covers 4 and 8 only, so every 5/6/7-bit group here is symmetric. The previous build's four-bit tier was asymmetric and got roughly a quarter-bit of its accuracy from that; this one does not have the option and does not need it.CompressedTensorsWNA16MoEMethod still computes 32 // num_bits and raises for anything but int4/int8, so the same layout cannot be applied to a Qwen3.5-MoE checkpoint through compressed-tensors. The native humming checkpoint format has a fused MoE path. This format does not.llm_compressor format out of the box. Two bit checks in auto_round/export/formats/backends/llm_compressor.py reject them before any work happens; the packing itself is delegated to compressed-tensors and has handled 1-8 bits for a while. The patch is in auto-round-patch/:1- if scheme.bits not in [4, 8, 16]:
2+ if scheme.bits not in [4, 5, 6, 7, 8, 16]:
3- if scheme.data_type == "int" and scheme.bits not in [4, 8]:
4+ if scheme.data_type == "int" and scheme.bits not in [4, 5, 6, 7, 8]:W5A16 / W6A16 in support_schemes. With that applied, pack_layer produces exactly the shapes vLLM expects. Verified at 4, 5, 6, 7 and 8 bits against ceil(in_features * bits / 32), and end-to-end through a vLLM load.iters=500, nsamples=768, seqlen=2048, batch_size=2, gradient_accumulate_steps=4, dataset NeelNanda/pile-10k (256) plus codeparrot/github-code-clean (768).layer_config.json is included: three keyword exclusions (embed_tokens, visual, lm_head at 16 bits) followed by all 400 language-model projections named in full. The projections are spelled out rather than pattern-matched because a pattern like mlp.gate_proj also hits mtp.layers.0.mlp.gate_proj and the vision tower, and AutoRound resolves the longest match last. Anything the file does not mention falls through to the default scheme, so the dry run's "unexpected 16-bit layers" column has to be empty before committing five hours to it.WeightsMapper, but apply_vllm_mapper treats anything without a dot as a class name and passes it through untouched. A target spelled lm_head never reaches language_model.lm_head. And model.language_model.embed_tokens reaches the main model but not the MTP draft, whose module sits at mtp.embed_tokens. re: targets skip the rewrite and are matched as regular expressions, so they hit every copy.model-0000{1..9}-of-00009.safetensors weights
model-mtp.safetensors MTP block
config.json includes the compressed-tensors config
layer_config.json the allocation, as fed to AutoRound
vllm-patch/ the two-line vLLM embedding patch
auto-round-patch/ the 5/6/7-bit export gate patch