Paris99's picture
Card: Python 3.11+ (mlx-lm 0.32 requires it)
a980dd1 verified
|
Raw History Blame Contribute Delete
4.52 kB
metadata
license: apache-2.0
base_model: sensenova/SenseNova-Loop-9B-Preview
base_model_relation: quantized
library_name: mlx
pipeline_tag: text-generation
tags:
  - mlx
  - sensenova
  - sensenova-loop
  - looped-transformer
  - mhc
  - qwen3_5
  - apple-silicon

SenseNova-Loop-9B-Preview — MLX 8-bit

An 8-bit MLX conversion (affine, group size 64) of sensenova/SenseNova-Loop-9B-Preview (revision 9937e91, released 30 October 2026) for Apple Silicon. 9.6 GB of weights. Text model; image input is not part of this build yet. Practically identical to SenseNova's original weights; the recommended build.

Published by NetProjects (Internet Projects Ltd). Not affiliated with SenseTime / SenseNova.

A faithful port of the looped architecture

SenseNova-Loop is a Qwen3.5-based model with two additions, and this build runs both exactly as SenseNova's own code does:

  • Looped execution: layers 0–3 run once, layers 4–27 run twice with shared weights, then layers 28–31: 56 layer passes per token. Every pass has its own cache slot (KV cache for full attention, conv and recurrent state for Gated DeltaNet).
  • Two-stream mHC on layers 4–27: the hidden state is split into two residual streams that are routed by small float32 routers (pre / post gates and a 2×2 Sinkhorn mixing matrix, 20 iterations). The 96 router tensors stay in float32 and are never quantized.

The model code is sensenova_loop.py, included in this repo and loaded by mlx-lm through trust_remote_code=True. Source, converter, parity and benchmark scripts: github.com/internet-projects/sensenova-loop-mlx.

Results (MacBook Pro M5 Max, 128 GB, 7 November 2026)

Agreement with SenseNova's own PyTorch code (Transformers 5.18, bf16) on 16 prompts, every position:

8-bit 6-bit 4-bit
Same top token as the reference 97.6% 97.2% 89.2%
KL divergence at the last token 0.0011 0.0037 0.064
Size 9.6 GB 7.3 GB 5.1 GB

Short public benchmark (same harness for every build; first 300 ARC-Challenge test questions, log-likelihood over the 4 choices; first 50 GSM8K test questions, chat template, thinking off, greedy):

bf16 8-bit 6-bit 4-bit
ARC-Challenge acc / acc_norm 48.7 / 51.0 48.7 / 50.3 47.7 / 49.0 45.7 / 45.0
GSM8K (50) – 94.0 88.0 92.0

GSM8K on 50 questions moves 2 points per question.

Decode speed for this build: about 18 tokens/s on the M5 Max (short run). The loop doubles the work of the middle 24 layers, so it is slower than a plain 9B model; that is the cost of the extra depth.

Use

Needs Python 3.11 or newer and mlx-lm 0.32 or newer (the macOS system Python 3.9 only gets an older mlx-lm that can't load this model).

pip install -U "mlx-lm>=0.32"
from mlx_lm import load, generate

model, tokenizer = load("netprojects/SenseNova-Loop-9B-Preview-MLX-8bit", trust_remote_code=True)
messages = [{"role": "user", "content": "Explain in two sentences why the sky is blue."}]
prompt = tokenizer.apply_chat_template(messages, add_generation_prompt=True, enable_thinking=False)
print(generate(model, tokenizer, prompt=prompt, max_tokens=256))

Set enable_thinking=True for thinking mode. Server: mlx_lm.server --model netprojects/SenseNova-Loop-9B-Preview-MLX-8bit --trust-remote-code.

Other sizes: 6-bit (7.3 GB) · 4-bit (5.1 GB)

License

SenseNova-Loop-9B-Preview is released by SenseNova under the Apache License 2.0 (LICENSE included). This repository contains converted and quantized weights of that model (modified from the original: converted to MLX format and quantized to 8-bit) and an MLX implementation of its architecture, distributed under the same license.

Credits: SenseNova / SenseTime (SenseNova-Loop-9B-Preview), Qwen team (Qwen3.5), Apple MLX and mlx-lm. Conversion and MLX port by Paris Michalas, Partner at NetProjects. Not affiliated with SenseTime / SenseNova.

More NetProjects MLX builds: NetProjects MLX builds collection · all models at huggingface.co/netprojects