license: apache-2.0
library_name: mlx
pipeline_tag: image-text-to-text
base_model:
- SC117/occamy-1.0-abliterated-FIT-GGUF
- Accio-Lab/occamy-1.0
- KaedeTai/Ornith-1.5-35B-A3B-BigBang-MTP-zh-mlx-4bit
- Qwen/Qwen3.6-35B-A3B
language: - zh
- en
tags: - mlx
- apple-silicon
- mtp
- speculative-decoding
- qwen3_5_moe
- moe
- vision-language
- abliterated
- omlx
- 4-bit
Occamy-1.0 abliterated, back from GGUF to MLX, with a draft head it never had
SC117/occamy-1.0-abliterated-FIT-GGUF
is the abliterated Accio-Lab/occamy-1.0,
and it exists only as GGUF. This repo converts its BF16 GGUF back to the
Hugging Face layout, quantizes it for MLX the same way as
KaedeTai/Ornith-1.5-35B-A3B-BigBang-MTP-mlx-4bit,
puts Occamy's vision tower back, and adds a multi-token-prediction (MTP) draft
head taken unchanged from
KaedeTai/Ornith-1.5-35B-A3B-BigBang-MTP-zh-mlx-4bit.
A head trained on a different fine-tune of the same base drafts for Occamy as
well as it drafts for its own trunk: 65.6% of drafts accepted, against 64.9% on
Ornith.
| trunk | draft head | accepted drafts | tokens per cycle |
|---|---|---|---|
| Ornith-1.5 BigBang | stock BigBang head | 64.5% | — |
| Ornith-1.5 BigBang | zh head | 64.9% | — |
| occamy-1.0-abliterated (this repo) | zh head | 65.6% | 2.13 |
Same prompt set, oMLX Lightning MTP, 4 draft tokens, read from oMLX'sMTP[n] ... accept=a/d log lines. Speculative decoding is verify-then-accept, so
the head changes speed, not what the model knows.
What is in the files
| part | source | format |
|---|---|---|
| language model | SC117 BF16 GGUF, un-converted to HF layout | 4-bit affine, group 64 |
router gates (mlp.gate, shared_expert_gate) |
same | 8-bit, group 64 |
| vision tower (333 tensors) | Accio-Lab/occamy-1.0 model-visual.safetensors |
bf16 |
MTP head (44 tensors, model-mtp.safetensors) |
KaedeTai/Ornith-…-zh-mlx-4bit, copied as stored | 8-bit, group 64 |
About 20 GB. config.json carries 92 per-module overrides: 80 for the router
gates and 12 for the head. Abliteration does not touch the vision tower, so it
comes straight from Accio's release.
Getting back from GGUF
llama.cpp's QWEN35MOE conversion rewrites several tensors on the way in.scripts/convert_occamy.py undoes each step before the usual HF→MLX pass:
- zero-centred RMSNorms were stored +1 → subtract 1 (
linear_attn.normexcepted) A_logwas stored asssm_a = -exp(A_log)→log(-ssm_a)dt_biaswas renamedssm_dt.bias, and conv1d was squeezed → restored to[C, 1, K]- linear-attention V heads were reordered from grouped to tiled order across
in_proj_qkv,in_proj_z,in_proj_a/b,A_log,dt_bias, conv1d andout_proj→ inverse permutation - per-expert matrices were stacked into
ffn_*_exps→ kept stacked, which is
what MLX'sswitch_mlpwants
Check against the unabliterated base: 42 reconstructed tensors from two
layers (one linear-attention, one full-attention) were compared with
Accio-Lab/occamy-1.0. 40 are bit-identical. The other two are exactly the
matrices abliteration edits: self_attn.o_proj (relative difference 1.7e-2)
and one expert's down_proj (5.9e-2). A wrong inverse transform could not
leave the other 40 identical. The GGUF's SHA-256 matched SC117's SHA256SUMS
before conversion.
General knowledge: TMMLU+
Evaluated on the trunk, without MTP. 3,334 questions from
ikala/tmmluplus: 67 subjects,
up to 50 each, sampled with seed 0. Zero-shot, thinking off. The score is the
mean of the four group means, and the confidence intervals are bootstrapped
within subjects.
| model (MLX, same machine) | TMMLU+ | 95% CI | STEM | humanities | social | other |
|---|---|---|---|---|---|---|
| occamy-1.0-abliterated (this repo) | 72.6 | 70.9–74.2 | 70.3 | 70.0 | 79.7 | 70.3 |
| Qwen3.6-35B-A3B-Escha-W2 | 72.6 | 71.0–74.3 | 73.4 | 67.1 | 78.9 | 71.0 |
| Ornith-1.5-35B-A3B-BigBang-MTP-zh 4-bit | 70.5 | 68.9–72.2 | 70.2 | 66.0 | 76.4 | 69.4 |
On the same questions, occamy scores +2.1 points over Ornith (paired
bootstrap, 95% CI +0.8 to +3.4). Most of the gain is in humanities. Two answers
out of 3,334 could not be parsed and count as wrong.
Serving it in oMLX
- Let oMLX register the directory itself (open it once in the app), then set
mtp_enabled: true,mtp_num_draft_tokens: 4andenable_thinking: false
through the app or the admin API. A hand-written entry in~/.omlx/model_settings.jsonis not picked up. Without that entry,enable_thinkingdefaults to true. - Do not set
vlm_mtp_enabled. It is a different feature, mutually
exclusive withmtp_enabled, and it silently switches this head off. - When it works, every request logs
MTP path activated … (model has mtp_forward …)
and, at the end,MTP[0] finish=… accept=a/d (…%). - With MTP on, outputs are not bit-identical to MTP off. oMLX is not
bit-reproducible run to run even on the donor model, so this is batching and
kernel order, not the head.
One tensor, one file
The head lives only in model-mtp.safetensors. Occamy ships no MTP tensors, so
no shard duplicates the head (a hazard described in the donor repo): 2,134
tensors in the index, 44 of them language_model.mtp.*, each stored once.scripts/graft_mtp.py is the whole graft. It copies the donor'slanguage_model.mtp.* tensors, text_config.mtp_num_hidden_layers and the
head's quantization overrides.
Accio publishes an experimental MTP head of its own,
Accio-Lab/occamy-1.0-MTP. It
was not tried here.
Limitations
- Abliterated. Refusal directions were removed by SC117. Refusal behaviour
was not measured for this repo; see SC117's card. You are responsible for how
you use it. - The draft head was trained on one deployment's Traditional Chinese traffic
(health consultation and customer service) on a different trunk. On other
workloads the acceptance rate may be lower. - The numbers above are acceptance rates, not a paired tokens-per-second
benchmark. - Everything here comes from one machine (M5 Max, 128 GB) with oMLX and MLX.
Nothing was tested with vLLM or transformers.
Scripts
scripts/convert_occamy.py GGUF BASE_META_DIR DST [--check]builds the MLX
weights from the GGUF.--checkruns the comparison against the base repo
instead. The vision tower comes fromBASE_META_DIR/model-visual.safetensors,
or from the base repo over HTTP range requests (scripts/hfrange.py).scripts/graft_mtp.py TARGET DONOR OUTadds the head. It hard-links the
trunk files, so the graft costs no extra disk.
Credits and license
- Accio-Lab trained Occamy-1.0
(Apache-2.0) from Qwen/Qwen3.6-35B-A3B
(Apache-2.0). - SC117 did the
abliteration (Apache-2.0). - The MTP head comes from the MIT-licensed Ornith lineage:
EryriLabs/Ornith-1.5-35B-A3B-BigBang-MTP,
retrained for Chinese in
KaedeTai/Ornith-1.5-35B-A3B-BigBang-MTP-zh-mlx-4bit. - oMLX provides Lightning MTP.
- The conversion reads llama.cpp's
conversion/qwen.pybackwards.
The repository is released under Apache-2.0 (see LICENSE, Accio's original).
The MTP head's MIT terms are compatible with that.