Downloads · 30 days
15
6% of all-time downloads
studioburnside/Tess-4-27B-MLX-Q8
Tess-4-27B-MLX-Q8 is a image-text-to-text model from studioburnside. 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 mlx. The card lists the license as apache-2.0.
basemodel + basemodelrelation are what build the HF "Model tree". With relation: quantized this repo appears under migtissera/Tess-4-27B's Quantizations tab automatically -- no manual linking needed. The chain further…
Downloads · 30 days
15
6% of all-time downloads
All-time downloads
264
Public
Parameters
27.4B
30.4 GB on disk
Likes
1
Public
Click a slice to open those files.
.safetensors30.4 GB · 100%
How the weights are stored.
U3226.9B · 98%
From the Hugging Face model README
An MLX conversion of migtissera/Tess-4-27B (Qwen3.6-27B base, dense, vision-capable) quantized to 8-bit (group size 64, affine), with the native multi-token-prediction head restored as a BF16 sidecar — which, at the time of upload, no other public MLX conversion of the Qwen3.6 family ships.
A 4-bit build with the same MTP sidecar is at Tess-4-27B-MLX-Q4 (16.1 GB).
mlx-lm's qwen3_5 sanitize() unconditionally drops mtp.* tensors during
conversion, so every community MLX checkpoint of this family carries
mtp_num_hidden_layers: 1 in its config while containing zero MTP weights.
Check your model.safetensors.index.json, not the config — the config will
tell you the head is there when it is not.
This repo re-extracts the head from the original BF16 release and ships it at
mtp/weights.safetensors (15 tensors, BF16 — quantizing the head collapses
acceptance to ~0%).
Measured with vllm-mlx 0.4.0
(--enable-mtp, greedy envelope) on an M5 Max: 78% draft acceptance,
+19.5% decode throughput with acceptance-verified speculative decoding — no
output change vs. non-speculative greedy.
An honest caveat. MTP is real and it works, but it is worth less than it sounds. On the same model and workload, omlx decodes at 18.4 tok/s with no speculative decoding at all, versus vllm-mlx's 19.4 tok/s with MTP (and ~17.3 without). A better runtime recovered nearly the whole gain on its own. Take the head because it is free; do not architect around it.
Same harness, same 3500-token budget, same machine (M5 Max). The Q4 build is the same conversion at 4 bits, so this is a clean read on what the extra 14 GB buys you:
| Axis | Q8 (this repo) | Q4 | Δ |
|---|---|---|---|
| HumanEval+ pass@1 (50-problem subset) | 0.90 | 0.82 | +0.08 |
| MMLU-Pro-style reasoning (40q, 10 options) | 0.80 | 0.85 | −0.05 |
| Tool-calling (20 scenarios) | 0.85 | 0.85 | — |
| Browser action-selection (20 simulated pages) | 0.95 | 0.95 | — |
| RULER-style long-context (8k/16k/32k) | 0.80 | 0.73 | +0.07 |
| Deterministic VQA (10 items) | 1.00 | 1.00 | — |
| My hard screenshot test (fine-print OCR) | 2/2 | 2/2 | — |
| Decode, single stream | 17.3 tok/s | 28.3 tok/s | −64% |
| On disk | 30.4 GB | 16.1 GB | +14.3 GB |
The honest summary: 8-bit buys you ~8 points of coding and ~7 of long-context. It buys you nothing on reasoning, tool-use, browser action-selection or vision — those survive 4-bit intact. And it costs you 40% of your decode speed and 14 GB.
Take Q8 if you lean on long-context recall or code generation, and you have the memory. Take Q4 if your workload is agentic (tool calls, short-to-medium turns, vision), or you are on a 32 GB machine — there it is close to free.
Small subsets: treat as directional, not as leaderboard numbers. The reasoning axis showing Q4 ahead is well within the noise of a 40-question set — read it as "no loss", not "Q4 is smarter".
# omlx (recommended — faster engine, and the only one I trust with large images)
omlx serve --model-dir <dir-containing-this-model>
# vllm-mlx (if you want the MTP head to actually engage)
vllm-mlx serve <this-repo> --mllm --enable-mtp --mtp-num-draft-tokens 1
# MTP engages only on exactly-greedy requests: temperature=0, top_p=1, top_k=0, min_p=0
Anything that loads standard MLX safetensors will run this model; engines without
MTP support simply ignore the mtp/ sidecar.
+1.0 RMSNorm shift to already-converted weights and produces
deterministic garbage, with no error and no warning. Use ≥0.6.5 or ≤0.6.3.mlx_vlm convert (8-bit, gs64) + BF16 MTP re-attachment.Converted and benchmarked as part of a local inference stack for a personal Automated Agentic Software Factory — something I'm building solo and will make publicly available after its limited-alpha phase. Full benchmark data, harnesses and the conversion recipe: https://huggingface.co/datasets/studioburnside/mlx-local-inference-benchmarks.
Questions, results and corrections all welcome in Discussions.