alt.freeweights.text / K2-Horizon-MoVA-36B-A4B-4bit
From: mlx-community <huggingface.co/mlx-community>Newsgroups: alt.freeweights.textSubject:

K2-Horizon-MoVA-36B-A4B-4bit

Date: 2026-11-15Commit: 923353eSigned: 2DC28CC7B26A283B ✓

Text generation model with 37.4B parameters. Safetensors weights, 26.4 GB in all. Published by mlx-community under Apache-2.0.

37.4B params26.4GBK2-Horizon-MoVA-36B-A4B-4bitsafetensorspermissive
FactsParams37.4BSize26.4 GBFormatssafetensorsTasktext generationLicenseApache-2.0From sourcepermissive
$ fw get mlx-community/K2-Horizon-MoVA-36B-A4B-4bit
# manifest sha256 87fd63cb9c93… · 26.4 GB · 14 files
$ fw verify ./K2-Horizon-MoVA-36B-A4B-4bit mlx-community/K2-Horizon-MoVA-36B-A4B-4bit
From sourceHosted (signed)mlx-community/K2-Horizon-MoVA-36B-A4B-4bitLast check: 2026-11-15 05:15 UTC

Get help: custom fine-tune or private deploy. We review your setup before we quote.

Quantized of K2-Horizon-MoVA-36B-A4B.

Works with

Overview

Size
26.4 GB
Weights
26.4 GB (safetensors)
Parameters
37.4B
Formats
safetensors
Task
text generation
License
Apache-2.0 (permissive)
Files
14, each with a sha256
Publisher
mlx-community
Added
2026-11-15
Section
alt.freeweights.text
Lineage

Original release from the publisher.

Base model: IFM/K2-Horizon-MoVA-36B-A4B

Where these bytes come from
Publisher at the pinned commit→You

Sources are tried in order. A file counts only when its size and sha256 match the manifest. Sources are checked when you ask for them, not on a timer.

Sources
BadgeHostLast checkResult
From sourcehuggingface.co2026-11-15 05:15 UTCpassed

Model card

From the publisher at commit 923353e. Shown as plain text with links; images open at the publisher.

K2-Horizon-MoVA-36B-A4B (MLX, 4-bit)#

Mixed-precision 4-bit MLX quantization of IFM/K2-Horizon-MoVA-36B-A4B, converted from revision e5c131d. 5.6 bits/weight effective, 25 GB on disk. For Apple silicon.

K2-Horizon-MoVA-36B-A4B is IFM's sparse K2-Horizon model: a 36B-parameter Mixture-of-Experts model with 4B active per token and 512K context. Its attention is Mixture-of-Values (MoVA), where the values come from 4 of 64 routed value experts.

Requirements#

mlx-lm doesn't support the k2_horizon architecture yet. There's an open request: mlx-lm#1876. Until support lands, this repo ships the MLX model code (k2_horizon.py), which mlx-lm loads through the model_file entry in config.json. So the released mlx-lm works as-is:

pip install -U mlx-lm

Pass --trust-remote-code (or trust_remote_code=True). mlx-lm 0.31.3 loads the file without it, but newer versions require it. The file runs on your machine, so read it first if you like.

Once K2-Horizon support lands in a released mlx-lm, this repo will be updated to use it. If something breaks after that, open a discussion here asking for a re-upload.

How it was quantized#

Mixed precision, chosen from measurements rather than a fixed rule:

  • 4-bit (affine, group size 64): the routed MoE experts and the shared expert. These hold most of the parameters.
  • 8-bit (affine, group size 64): everything else: attention (including the MoVA value experts), the dense MLPs of layers 0–2, the embeddings and lm_head.
  • bf16: the MoE and MoVA routers.

I compared three 4-bit recipes against bf16 on WikiText-2. Plain 4-bit everywhere: +4.5% perplexity. 4-bit with only the MoVA value experts at 8-bit: +4.4%. This recipe: +1.2%, for about 5 GB more memory than plain 4-bit. Keeping the value experts alone at 8-bit barely helps; what matters is keeping all the non-expert weights at 8-bit.

Memory#

Peak 26.5 GB for a short prompt: fits a 48 GB Mac under the default Metal working-set cap. A 36 GB Mac needs a raised cap (sudo sysctl iogpu.wired_limit_mb=...). The KV cache adds about 192 KB per token (about 24 GB at 128K tokens).

Conversion check#

The MLX implementation was checked against IFM's PyTorch code (modeling_k2_horizon.py) in fp32 on the real weights, one layer at a time. All 48 layers match to a relative error of 1e-6 or better, and the next-token predictions agree at every position.

Smoke-tested after conversion with released mlx-lm 0.31.3 (mlx_lm.generate and mlx_lm.server):

  • 17 * 23 → 391 with correct reasoning
  • "capital of Australia" → Canberra
  • A multi-turn server conversation that carries context correctly

On a Mac Studio M4 Max 128GB: 59.6 tok/s generation, peak 26.5 GB (short prompt).

Benchmarks (all K2-Horizon MLX variants)#

WikiText-2 test perplexity (128 × 512 tokens, lower is better) and generation speed on an M4 Max 128GB, all measured the same way:

bf168-bit4-bit
Bits/weight168.55.6
Disk70 GB37 GB25 GB
Peak memory75.0 GB39.9 GB26.5 GB
WikiText-2 perplexity11.36811.372 (+0.04%)11.508 (+1.2%)
Generation35.3 tok/s51.2 tok/s59.6 tok/s

Perplexity is a coarse signal. Test the versions on your own workload before picking one.

Usage#

mlx_lm.generate --model mlx-community/K2-Horizon-MoVA-36B-A4B-4bit --trust-remote-code --prompt "Explain mixture-of-experts in two sentences." --max-tokens 2048
from mlx_lm import load, generate

# Newer mlx-lm versions need trust_remote_code=True; on mlx-lm 0.31.3 use load("mlx-community/K2-Horizon-MoVA-36B-A4B-4bit").
model, tokenizer = load("mlx-community/K2-Horizon-MoVA-36B-A4B-4bit", trust_remote_code=True)
messages = [{"role": "user", "content": "Explain mixture-of-experts in two sentences."}]
prompt = tokenizer.apply_chat_template(messages, add_generation_prompt=True)
print(generate(model, tokenizer, prompt, max_tokens=2048))

mlx_lm.chat and mlx_lm.server take the same --trust-remote-code flag.

The model thinks before it answers, inside <ifm|think> … </ifm|think>. Leave room for that in max_tokens. The effort level is set with reasoning_effort in the chat template: "high" (default), "medium" or "low", e.g. apply_chat_template(messages, add_generation_prompt=True, reasoning_effort="low").

Notes:

  • Server output: mlx-lm doesn't recognize the <ifm|think> tags yet, so mlx_lm.server returns the thinking text inside content, before </ifm|think>, rather than in a separate reasoning field. K2-Horizon's tool-call format isn't parsed yet either.
  • Chat template change: the original template raises an error when an earlier assistant message has no thinking field, which is what OpenAI-style clients send. The template here renders empty thinking for those messages instead. Nothing else was changed.

License#

Apache-2.0, inherited from the base model. Refer to the original model card for architecture, benchmarks and intended use. All credit for the model belongs to IFM.

Files

14 files · 26.4 GBWeights 26.4 GB (safetensors). Sizes and sha256 from the signed manifest.
Hide all 14 files with their sha256
FileSizesha256
.gitattributes1.57 KB34448b82c17d60fec9b65b1f093c115ddbaadc04beb1b0140b6bfed2e012a930
README.md5.82 KB308a23a2235ea70e58436f11860292a8734ac6deec041ae21d74d0b201c74a5f
chat_template.jinja51.0 KBcaf441b7eef4032175e18e5a3fcc5d574d39db3d46a752f9fe60e05b3b0fd435
config.json152 KBe2942618c201478722a3578382648486e434efa115c0f4daff904aeaadc02939
generation_config.json81 B2da7d47641f4509da4ae47711e31d8b5f0f3f801ee08d87e7e9f07f814bdc4a3
k2_horizon.py26.4 KB80b501f2ea7364842bd25659928d3af7692238e7c6c2a50bad2f35f61f5483bc
model-00001-of-00005.safetensors5.37 GBc4a7ae6d73b65b4a380dedf37b2630c86ac84e9bab7dd0613046e70a83e8f754
model-00002-of-00005.safetensors5.36 GB8ab647ceb24429fa3757111d28de9c739a698a3a404b236f03d01341de6115c1
model-00003-of-00005.safetensors5.30 GB26c98f3b1969a7ff66c060a6da587fdc02f47fc486eb3a2f0e417102a5633ade
model-00004-of-00005.safetensors5.31 GB6dc006088ee0affbed44e1107cc66389dfb26874531f9f0dc40f86586b528154
model-00005-of-00005.safetensors5.06 GB75c4c27319c93758d429429c63e0efd280103db023c0db125a2d24fa8ad97b2e
model.safetensors.index.json168 KBd76cf3bd7796deee3ea7d1eba35fd2561684cf2fad005ed9daf449bcf9369da1
tokenizer.json20.6 MB838d767b7c9925ff257feb20eaa4299a8e3cc35bb3d805589c373f51d2cc3cb6
tokenizer_config.json293 B068cfdcf2bcef44fd77f935a9fb41b4d45af547fd41b95079817bd40b24fe518
VersionsEach time the pinned upstream commit or file list changed in this repo. Newest first.
Upstream commitDateContents
923353ec7a pinned now2026-11-15 05:15 UTC14 files · 26.4 GB

Use it

$ fw get mlx-community/K2-Horizon-MoVA-36B-A4B-4bit
# manifest sha256 87fd63cb9c93… · 26.4 GB · 14 files
$ fw verify ./K2-Horizon-MoVA-36B-A4B-4bit mlx-community/K2-Horizon-MoVA-36B-A4B-4bit
fw.pyChecks the signature and every sha256, tries each source in order, resumes.
$ python3 fw.py get https://freeweights.allternit.com/manifests/mlx-community/K2-Horizon-MoVA-36B-A4B-4bit.json --dir ./K2-Horizon-MoVA-36B-A4B-4bit $ python3 fw.py verify ./K2-Horizon-MoVA-36B-A4B-4bit ./mlx-community__K2-Horizon-MoVA-36B-A4B-4bit.json
hfThe Hugging Face CLI with one setting. Same repo id.
$ HF_ENDPOINT=https://freeweights.allternit.com hf download mlx-community/K2-Horizon-MoVA-36B-A4B-4bit --revision 923353ec7a3eb0a85576ddb92e1496a753ea8e07 --local-dir ./K2-Horizon-MoVA-36B-A4B-4bit
transformersLoad the weights in Python.
import os os.environ["HF_ENDPOINT"] = "https://freeweights.allternit.com" from transformers import AutoModelForCausalLM, AutoTokenizer tok = AutoTokenizer.from_pretrained("mlx-community/K2-Horizon-MoVA-36B-A4B-4bit", revision="923353ec7a3eb0a85576ddb92e1496a753ea8e07") model = AutoModelForCausalLM.from_pretrained("mlx-community/K2-Horizon-MoVA-36B-A4B-4bit", revision="923353ec7a3eb0a85576ddb92e1496a753ea8e07", device_map="auto")
vLLMServe an OpenAI-compatible API.
$ HF_ENDPOINT=https://freeweights.allternit.com vllm serve mlx-community/K2-Horizon-MoVA-36B-A4B-4bit --revision 923353ec7a3eb0a85576ddb92e1496a753ea8e07

License

Name
Apache License 2.0
Id
Apache-2.0
Class
Permissive
Redistribution
yes
Listing
Hosted (signed)
Decided
License as declared by the publisher. No person read it. 2026-11-15
Text in
README.md
Text sha256
308a23a2235ea70e58436f11860292a8734ac6deec041ae21d74d0b201c74a5f
Terms gate
No extra terms beyond the license.

Read the license text

Licenses are checked against the license table. A custom license passes only after a person reads it.

Provenance

From: mlx-community <huggingface.co/mlx-community>Newsgroups: alt.freeweights.textSubject: K2-Horizon-MoVA-36B-A4B-4bitDate: 2026-11-15Commit: 923353eSigned: 2DC28CC7B26A283B ✓
Upstream
mlx-community/K2-Horizon-MoVA-36B-A4B-4bit
Pinned commit
923353ec7a3eb0a85576ddb92e1496a753ea8e07
Manifest
K2-Horizon-MoVA-36B-A4B-4bit.json · .minisig
Manifest sha256
87fd63cb9c939ef665e9178566e865dd05199d5510612bc3d850f15f22816695
Signature
minisign, Ed25519, key 2DC28CC7B26A283B
Created
2026-11-15 05:15 UTC
Generator
freeweights-manifest/0.1.0
Takedowns
None.

How to verify

$ curl -O https://freeweights.allternit.com/manifests/mlx-community/K2-Horizon-MoVA-36B-A4B-4bit.json $ curl -O https://freeweights.allternit.com/manifests/mlx-community/K2-Horizon-MoVA-36B-A4B-4bit.json.minisig $ minisign -Vm K2-Horizon-MoVA-36B-A4B-4bit.json -P RWQ7KGqyx4zCLXtUFOqvfv8L3g+8fpKJ1FsuxPyOYMF+4KufbUxKq1Oq $ shasum -a 256 <file> # compare with the Files tab

A manifest whose signature fails must be rejected. A file whose size or sha256 does not match must be discarded. Verify a download

Model tree

Parent

IFM/K2-Horizon-MoVA-36B-A4B · this model is a quantization of it

No model in the catalog names this one as its parent.

Get it
Download
$ HF_ENDPOINT=https://freeweights.allternit.com hf download mlx-community/K2-Horizon-MoVA-36B-A4B-4bit
Open in Freeweights Studio

Pull, verify and run it in the Allternit app on Desktop, web or phone.

Signed manifest
minisign, key 2DC28CC7B26A283B. K2-Horizon-MoVA-36B-A4B-4bit.json. Provenance. Takedown history: none.
From: laion <huggingface.co/laion>Subject: a2-rl-e2egit_large-50-32B
From: laion <huggingface.co/laion>Subject: a3-rl-DCAgent_exp_rpt_e2egit-large-15-8B
From: laion <huggingface.co/laion>Subject: a3-rl-DCAgent_exp_rpt_e2egit-v2-10-8B
From: laion <huggingface.co/laion>Subject: a3-rl-DCAgent_exp_rpt_pymethods2test-large-80-8B
From: laion <huggingface.co/laion>Subject: a3-rl-DCAgent_exp_rpt_unitsyn-python-large-10-8B
From: laion <huggingface.co/laion>Subject: a3-rl-DCAgent_mix_h2_language_proportional-65-8B