TheDrainFlorist/Qwen3.6-35B-A3B-VQ-3.8bpw

Source: 🤗text-generationapache-2.06.7B params3B activated13 GBsafetensors✓ 7 checksumsupdated 9d ago
or submit a torrent

Qwen3.6-35B-A3B-VQ-3.8bpw

15.7 GiB — smaller than the community 4-bit and a third closer to bf16.

A vector-quantized build of Qwen3.6-35B-A3B for Apple Silicon. Stock mlx-lm, no patches — the VQ runtime ships inside the checkpoint as model.py.

Changelog

2026-10-03 — MTP draft head

This repo now ships mtp-head-q6.safetensors, a 0.70 GiB multi-token-prediction draft head for speculative decoding. The weights and the bundled model.py are unchanged. The head is Qwen3.6-35B-A3B's own mtp.* layer from the bf16 release (stripped from the common MLX conversions), quantized to 6-bit, group 32. Knurlogic drafts with it automatically; see Speculative decoding. The exo --mtp note in the 2026-09 entry below is superseded: exo is no longer the serving path, and no head shipped until this revision.

2026-10-01 — runtime refresh; Knurlogic

The bundled model.py is updated to the current VQ runtime; the weights are unchanged. The run, multi-Mac, drafting and vision instructions now use Knurlogic.

2026-09-17 — the full Qwen3.6-35B-A3B VQ ladder on one KL instrument

KL to this family's own bf16 teacher (cached top-64), 12288 tokens, on all three house corpora — prose, public code and literary — every rung scored on the same cache and the same positions, through a streamed pass validated against a direct full-model forward to all printed decimals.

build GiB prose code literary mean top-1
VQ-3.4bpw 13.8 73.3 520.2 207.5 267.0 89.4%
VQ-3.8bpw 15.7 44.5 423.6 101.4 189.8 91.4%
VQ-4.6bpw 18.7 33.7 409.2 58.3 167.1 92.7%
VQ-5.4bpw 22.2 21.6 345.1 33.5 133.4 94.0%

Millinats per token; lower is closer to bf16. These rows are VQ rungs only and are not comparable to the affine-comparator table further down, which was measured prose-only at 2048 tokens on an earlier instrument.

Rank by KL, not perplexity. On this family perplexity is not monotone in quality: rungs that are measurably closer to the teacher can read a higher perplexity, because a damaged model can score better than bf16 on a finite sample. KL on cached teacher logits does not have that failure mode.

2026-09-09 — runtime refresh

Runtime refresh. The bundled model.py is updated so downloaders run exactly the code that was benchmarked; dense bundles now carry both runtimes.

  • Faster prefill on affected geometries, measured per rung: a device-codebook kernel arm for large-codebook geometries (up to 1.46x on affected rungs), a ragged-subvector relaxation (up to 1.34x on affected rungs), a fused d8 arm, and a routing memo (≈2%). No blanket speedup is claimed across the lineup — gains apply only where the geometry engages the new paths.
  • Output quality is unchanged: the kernel changes are bit-identical or 1-ULP-equivalent, and the routing memo is bit-identical (logits checksum verified).
  • Speculative decoding (MTP): on repos that ship mtp-head-q6.safetensors, the sidecar works with the exo fork branch mtp-stage1 (github.com/noahzelezny/exo) — launch each node with exo --mtp (or set EXO_MTP=1). Note: with MTP enabled, exo serves requests sequentially (the batch engine has no MTP path), so leave it off for concurrent / multi-agent workloads.

2026-09 — bundle refresh

Bundle refresh.

The bundled model.py runtime is updated as part of the 2026-09 refresh shared across the VQ lineup:

  • Updated MoE expert kernels (uint32 code loads for the d2 geometry, template-free specialized dispatch). For the code geometries this model uses, outputs are verified equivalent to the previous bundle and the speed change is modest; the refresh is mainly for runtime consistency across the lineup.
  • The bundle loads under both mlx-lm and mlx_vlm.
  • Nothing you have downloaded breaks: weights are unchanged, only model.py is replaced, and the prior revision stays pinnable by commit hash.

Measured results

See also the 2026-09-17 entry in the changelog above, which places this rung against the rest of its family on the three-corpus KL instrument. The table below is the earlier prose-only measurement and is not comparable to it row-for-row.

Referee corpus, 2048-token windows, scored against the bf16 teacher on the same files with an unmodified mlx-lm. All sizes include the bf16 vision tower, which every build here carries:

build size KL to bf16 (mnats/tok) top-1 agreement perplexity
bf16 65.4 GiB 0 100% 4.7215
mlx-community 8-bit 35.1 GiB 7.4 96.18% 4.7150
this model 15.7 GiB 53.0 89.55% 4.7090
mlx-community 4-bit 19.0 GiB 78.6 85.61% 4.9154

33% less divergence than the 4-bit, at 3.3 GiB smaller. That is the comparison this build exists for.

Read the perplexity column carefully. At 4.7090 this build sits slightly below the bf16 teacher, and the 4-bit sits above it. That does not make it better than bf16 — perplexity is an aggregate over finite text and absorbs offsetting errors in both directions. KL measures distance to the teacher's distribution directly and does not. Treat anything within about 1% of the teacher as indistinguishable, and rank by KL.

Note the two metrics disagree in emphasis: KL and perplexity both favor this build over the 4-bit, while top-1 agreement is 89.55% against the 8-bit's 96.18%. For a 256-expert MoE that is expected — discrete routing flips swap one plausible token for another, which perplexity absorbs and argmax agreement punishes. Both numbers are honest; quote both.

Runtime

Speed on this revision (measured 2026-10-01)

One Mac Studio M3 Ultra, vqlab speed-pair: a fresh process per run, alternating with the reference, 3 pairs, 2048-token prompt, 128 generated tokens, no drafting.

this model Qwen3.6-35B-A3B-8bit
decode 62.3 tok/s (1.06×) 58.0 tok/s
prefill 2401 tok/s (0.87×) 2743 tok/s
peak memory 17.5 GB 38.8 GB

Throughput differs across Apple silicon; compare the ratio, not the absolute numbers.

Comfortable on a 24 GB machine; workable on 16 GB at short context.

Run it

Requires a Mac with Apple Silicon (macOS, MLX).

With Knurlogic, which works out the settings and checks the model fits before loading it:

pip install knurlogic
hf download TheDrainFlorist/Qwen3.6-35B-A3B-VQ-3.8bpw --local-dir ~/Knurlogic/Models/Qwen3.6-35B-A3B-VQ-3.8bpw
knurlogic serve ~/Knurlogic/Models/Qwen3.6-35B-A3B-VQ-3.8bpw

Chat at http://127.0.0.1:8080/, or point any OpenAI-, Anthropic- or Ollama-compatible client at it (model local). knurlogic ui opens a page with a Launch button for every model on disk instead.

Images work through Knurlogic directly; mlx-vlm is not needed.

The VQ runtime ships inside this repo as model.py (declared by model_file in config.json), and Knurlogic runs the file the model ships.

Speculative decoding (MTP)

Knurlogic drafts with mtp-head-q6.safetensors by default when it sits beside the weights (a full download includes it), and switches between drafting and plain decoding by measured cost.

  • Turn it off: knurlogic serve <model> --set KNURLOGIC_MTP=off, or MTP Off in the load panel.
  • Force it on, without automatic switching: --set KNURLOGIC_MTP_DYNAMIC=off.
  • Requires Knurlogic 0.1.3 or newer (pip install -U knurlogic).

Measured on this build with this head (M4 Max, one Mac, greedy, thinking off, 400 tokens, 3 prompts; Knurlogic main + DSpark work, mlx 0.32.3):

plain drafting
decode 71.5–72.1 tok/s 93.1–103.2 tok/s (1.37×)
acceptance 0.879 (523 of 595 drafts)

Throughput differs across Apple silicon; compare the ratio, not the absolute numbers.

Without Knurlogic:

pip install 'mlx-lm>=0.31.3'
python -m mlx_lm generate \
  --model TheDrainFlorist/Qwen3.6-35B-A3B-VQ-3.8bpw \
  --prompt "Write a Python function that ..." \
  --max-tokens 512

Methodology

Uniform vector quantization of the experts at d=4, K=8192 — each 4-weight subvector stores one 13-bit index into a per-tensor 8192-entry fp16 codebook, with an fp16 scale per (row, 64 weights). Non-expert tensors are 8-bit. Experts are ≈92% of the model, so that is where the bytes are.

There is no depth schedule and no mixed allocation: every expert tensor uses the same geometry. Flat rungs are the reference points in this lineup because no mixed-allocation build we measured beat the flat rung at its own size.

Codebooks are fit in pure weight space — k-means over the weight subvectors, no Hessian, no activation statistics, no calibration corpus.

The fit is not seeded. k-means draws an unseeded subsample, so this artifact is reproducible in recipe and geometry but not bit-for-bit. Margins are therefore quoted against a measured fit-to-fit floor rather than against a repeated build; on this family that floor is 0.214 mnats, so the 25-mnat gap to the 4-bit is far outside it.

Verification

Every tensor was decoded from the published artifact and compared against the bf16 source; no tensor exceeds 3x the artifact's own median reconstruction error. The packed artifact reproduced its unpacked twin's KL score to every printed digit. The bundled runtime was exercised as the executing copy in a stock venv, not merely present in the folder.

Vision tower grafted in (333 tensors, 0.83 GiB); the text path is unchanged, verified against the same KL cache.

Limitations

  • Top-1 agreement is 89.55% against the 8-bit's 96.18%. If your workload is sensitive to exact token choice rather than distributional quality, the 8-bit is measurably closer to bf16.
  • No throughput measurement — see Runtime.
  • No task-suite scores for this artifact.
  • One asymmetry favors this build: the affine comparators quantize the MoE router, and this build leaves it at bf16. The bytes are trivial, but a router feeds an argmax over experts, so the effect is not bounded by the byte share. It is unmeasured.

Paper

The method, the full model ladder, the negative results, and the measurement rules behind every number here: Data-Free Vector Quantization Beats Affine Quantization at Matched Bytes Below 6 Bits (CC BY 4.0) · code: VQLab · web version: Space

Support this work

VQLab and these artifacts are built and released independently — the fits, the measurement harness and the published rungs are one person's compute and time. If they are useful to you:

Provenance

Base model: Qwen/Qwen3.6-35B-A3B — Apache-2.0. This is a quantized derivative and inherits that license; using it means accepting the base model's terms. Quantization: TheDrainFlorist, 2026.

Built with MLX and VQLab.