Views
No views yet
Qwen/Qwen3.6-35B-A3B MoE
checkpoint, packed into a single 1.6 GB safetensors file.mtp_num_hidden_layers: 1 in its config but ships zero mtp.* tensors). With
the MTP head re-attached via the sharded-symlinks layout (see usage below),
vLLM speculative decoding works out of the box.guru87/Qwen3.6-27B-MTPguru87/Qwen3.5-9B-MTPguru87/Qwen3.5-4B-MTPguru87/Qwen3.5-2B-MTPguru87/Qwen3.5-0.8B-MTP| File | Purpose |
|---|---|
mtp.safetensors | 19 BF16 tensors, 1611 MiB, lifted verbatim from the base |
SHA256SUMS | Per-tensor full SHA256 for audit / authenticity check |
extract_from_qwen_base.py | Reproducible extraction script (the file was made with this) |
Qwen/Qwen3.6-35B-A3B/model-00025-of-00026.safetensors and
model-00026-of-00026.safetensors (the two shards that contain the mtp.*
weight-map entries) on a local copy of the public Qwen base model.1python extract_from_qwen_base.py --src /path/to/Qwen3.6-35B-A3B \
2 --out /tmp/mtp.safetensors --sums /tmp/SHA256SUMS
3diff /tmp/SHA256SUMS SHA256SUMS # must be byte-identical| Source | matches? |
|---|---|
Qwen/Qwen3.6-35B-A3B (BF16, this repo's source) | 10/10 |
Qwen3.6-35B-A3B-AWQ-4bit (BF16-kept tensors) | 10/10 |
weight_packed + weight_scale + weight_shape), so they
can't bit-match the stacked BF16 expert tensors here — but the
non-quantized tensors that stay BF16 in AWQ are all bit-equal. This shows the
MTP head here is canonical Qwen output, identical to what's already
redistributed inside community quants.mtp.fc.weight shape=[2048, 4096] bf16
mtp.norm.weight shape=[2048] bf16
mtp.pre_fc_norm_embedding.weight shape=[2048] bf16
mtp.pre_fc_norm_hidden.weight shape=[2048] bf16
mtp.layers.0.input_layernorm.weight shape=[2048] bf16
mtp.layers.0.post_attention_layernorm.weight shape=[2048] bf16
mtp.layers.0.self_attn.q_norm.weight shape=[256] bf16
mtp.layers.0.self_attn.k_norm.weight shape=[256] bf16
mtp.layers.0.self_attn.q_proj.weight shape=[8192, 2048] bf16
mtp.layers.0.self_attn.k_proj.weight shape=[512, 2048] bf16
mtp.layers.0.self_attn.v_proj.weight shape=[512, 2048] bf16
mtp.layers.0.self_attn.o_proj.weight shape=[2048, 4096] bf16
mtp.layers.0.mlp.gate.weight shape=[256, 2048] bf16
mtp.layers.0.mlp.shared_expert_gate.weight shape=[1, 2048] bf16
mtp.layers.0.mlp.shared_expert.gate_proj.weight shape=[512, 2048] bf16
mtp.layers.0.mlp.shared_expert.up_proj.weight shape=[512, 2048] bf16
mtp.layers.0.mlp.shared_expert.down_proj.weight shape=[2048, 512] bf16
mtp.layers.0.mlp.experts.gate_up_proj shape=[256, 1024, 2048] bf16
mtp.layers.0.mlp.experts.down_proj shape=[256, 2048, 512] bf16mtp.safetensors is
added as the last shard, and model.safetensors.index.json is rewritten to
include the MTP keys:1from paroquant.cli.inject_mtp import inject_mtp
2
3inject_mtp(
4 target_dir="/path/to/Qwen3.6-35B-A3B-PARO", # quant missing MTP
5 mtp_file="mtp.safetensors", # this file
6 out_dir="/path/to/Qwen3.6-35B-A3B-PARO-MTP", # merged result
7)paroquant-inject-mtp --target ... --mtp ... --out ...).--speculative-config '{"method": "mtp", "num_speculative_tokens": 2}'
under vLLM 0.19.1+.Qwen/Qwen3.6-35B-A3B. These weights
are bit-identical to what Qwen redistributes; we're just packaging them as a
single file for easier re-injection into community quants.