Downloads · 30 days
235
19% of all-time downloads
jason-schulz/KAT-Coder-V2.5-Dev-VL-oQ4e-mtp
KAT-Coder-V2.5-Dev-VL-oQ4e-mtp is a image-text-to-text model from jason-schulz. 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.
Kwaipilot/KAT-Coder-V2.5-Dev with its vision tower and MTP head restored from the base model it was fine-tuned from, quantized to 4-bit for Apple Silicon. 20 GB.
Downloads · 30 days
235
19% of all-time downloads
All-time downloads
1.2K
Public
Parameters
36B
21.6 GB on disk
Likes
2
Public
Click a slice to open those files.
.safetensors21.6 GB · 100%
How the weights are stored.
U3235.5B · 99%
From the Hugging Face model README
Kwaipilot/KAT-Coder-V2.5-Dev with its
vision tower and MTP head restored from the base model it was fine-tuned from, quantized to
4-bit for Apple Silicon. 20 GB.
This is the 4-bit member of a set built from one bf16 master:
| level | size | HumanEval pass@1 | MTP acceptance | tok/cycle |
|---|---|---|---|---|
| oQ8e | 36 GB | 0.8598 | 74.1% | 2.27 |
| oQ6e | 28 GB | 0.8659 | 75.5% | 2.46 |
| oQ4e | 20 GB | 0.8963 | 79.3% | 2.54 |
Read the accuracy column as a tie, not a ranking. All three were measured the same day, same
settings (full 164 problems, batch_size=1, thinking enabled, deterministic profile). The oQ8e
build scored 146/164 on an earlier run and 141/164 on the run in this table — a 5-problem swing on
an unchanged model, which is as large as the entire spread between levels. Speculative decoding plus
Metal batching numerics means "deterministic" is not bit-reproducible here. The honest conclusion is
that 8, 6, and 4-bit are indistinguishable on this benchmark, not that 4-bit is better.
Read this first: what you need to load it.
The
oQ4equantization is not a proprietary format. oQ writes standard mlx-lm safetensors with a standard per-module quantization config, and portable oQ models load in stock MLX apps.What makes this repo oMLX-only is the restored MTP head. Stock
mlx-vlmdoes a strict load and rejects the 42 extralanguage_model.mtp.*tensors:ValueError: Received 42 parameters not in model. So as published this needs oMLX on Apple Silicon — for the MTP tensors, not the quant.Not loadable by llama.cpp, vLLM, or Transformers (MLX safetensors either way).
| source | |
|---|---|
| text weights | Kwaipilot/KAT-Coder-V2.5-Dev, unmodified (bit-exact; only the MoE expert tensor layout was converted) |
| vision tower (333 tensors) | Qwen/Qwen3.6-35B-A3B |
| MTP head (19 tensors) | Qwen/Qwen3.6-35B-A3B |
| quantization | oMLX oQ4 enhanced, group_size=64, affine, bf16 scales, 128x512 imatrix |
Kwaipilot's open-weight release ships language-model weights only — the vision components and the
multi-token-prediction head were stripped. Both are recoverable because KAT's config.json is
byte-identical to Qwen/Qwen3.6-35B-A3B's except for one field, and the text architecture is
unchanged.
The tensor key set is identical to an oMLX oQ8e-mtp build of the stock base model — 2052
tensors, with the MTP head correctly switch_mlp-named.
Measured on this exact checkpoint:
VLMBatchedEngine loaded, not the silent VLM to LLM
fallback that yields a vision-less model.Q in sk-7Qv3... reads as lowercase,
and a sparse 384x320 @64px image misreads. No regression against the oQ8e build.Caveat on MTP at low bit depths. oMLX warns that quantizing a preserved MTP head can collapse
draft acceptance toward ~0%. That did not happen here, and the likely reason is that the imatrix was
recomputed with the MTP head present rather than reused from a pre-graft cache. If you build
your own level from a stale imatrix, check the MTP[n] ... accept= line before trusting the
speedup — do not assume 4-bit is universally safe for MTP-preserved heads.
Build scripts live in the oQ8e repo: build/merge_kat_vl.py
and build/graft_mtp.py, with full instructions in its
README. Budget ~146 GB of free disk; peak RAM is about 8 GB.
Steps 1 and 2 produce the bf16 master. This repo is step 3 with "oq_level": 4:
curl -X POST http://127.0.0.1:8899/admin/api/oq/start \
-H 'Content-Type: application/json' -d '{
"model_path": "'"$HOME"'/Models/_build/KAT-Coder-V2.5-Dev-VL",
"oq_level": 4, "enhanced": true, "dtype": "bfloat16", "group_size": 64,
"preserve_mtp": true }'
Then set mtp_enabled on the new model id — it is per-model and off by default, and a model with
MTP disabled logs no acceptance line at all, which is easy to misread as a collapsed head.
mtp.*
tensors and set text_config.mtp_num_hidden_layers = 0 and the remainder is a portable oQ
checkpoint that loads in stock MLX apps; you lose speculative decoding, keep vision and the text
model.max_tokens cap. Long reasoning excursions stall rather than error in an agent loop.Apache-2.0, inherited from both parents.