Text Generation
MLX
English
diffusion_gemma
nvfp4
diffusion-gemma
diffusion-lm
structured-output
decision-making
conversational
modelopt
Instructions to use GenbaLabs/super-decider-mlx with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- MLX
How to use GenbaLabs/super-decider-mlx with MLX:
# Make sure mlx-lm is installed # pip install --upgrade mlx-lm # Generate text with mlx-lm from mlx_lm import load, generate model, tokenizer = load("GenbaLabs/super-decider-mlx") prompt = "Write a story about Einstein" messages = [{"role": "user", "content": prompt}] prompt = tokenizer.apply_chat_template( messages, add_generation_prompt=True ) text = generate(model, tokenizer, prompt=prompt, verbose=True) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- LM Studio
- Pi
How to use GenbaLabs/super-decider-mlx with Pi:
Start the MLX server
# Install MLX LM: uv tool install mlx-lm # Start a local OpenAI-compatible server: mlx_lm.server --model "GenbaLabs/super-decider-mlx"
Configure the model in Pi
# Install Pi: npm install -g @earendil-works/pi-coding-agent # Add to ~/.pi/agent/models.json: { "providers": { "mlx-lm": { "baseUrl": "http://localhost:8080/v1", "api": "openai-completions", "apiKey": "none", "models": [ { "id": "GenbaLabs/super-decider-mlx" } ] } } }Run Pi
# Start Pi in your project directory: pi
- MLX LM
How to use GenbaLabs/super-decider-mlx with MLX LM:
Generate or start a chat session
# Install MLX LM uv tool install mlx-lm # Interactive chat REPL mlx_lm.chat --model "GenbaLabs/super-decider-mlx"
Run an OpenAI-compatible server
# Install MLX LM uv tool install mlx-lm # Start the server mlx_lm.server --model "GenbaLabs/super-decider-mlx" # Calling the OpenAI-compatible server with curl curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "GenbaLabs/super-decider-mlx", "messages": [ {"role": "user", "content": "Hello"} ] }' - Hermes Agent
How to use GenbaLabs/super-decider-mlx with Hermes Agent:
Start the MLX server
# Install MLX LM: uv tool install mlx-lm # Start a local OpenAI-compatible server: mlx_lm.server --model "GenbaLabs/super-decider-mlx"
Configure Hermes
# Install Hermes: curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash hermes setup # Point Hermes at the local server: hermes config set model.provider custom hermes config set model.base_url http://127.0.0.1:8080/v1 hermes config set model.default GenbaLabs/super-decider-mlx
Run Hermes
hermes
- Atomic Chat
- OpenClaw
How to use GenbaLabs/super-decider-mlx with OpenClaw:
Start the MLX server
# Install MLX LM: uv tool install mlx-lm # Start a local OpenAI-compatible server: mlx_lm.server --model "GenbaLabs/super-decider-mlx"
Configure OpenClaw
# Install OpenClaw: npm install -g openclaw@latest # Register the local server and set it as the default model: openclaw onboard --non-interactive --mode local \ --auth-choice custom-api-key \ --custom-base-url http://127.0.0.1:8080/v1 \ --custom-model-id "GenbaLabs/super-decider-mlx" \ --custom-provider-id mlx-lm \ --custom-compatibility openai \ --custom-text-input \ --accept-risk \ --skip-health
Run OpenClaw
openclaw agent --local --agent main --message "Hello from Hugging Face"
|
Download README.md from GenbaLabs/super-decider-mlx: direct link, hf CLI and curl.
- Browser
- Download file 6.59 kB
-
https://huggingface.co/GenbaLabs/super-decider-mlx/resolve/main/README.md
- Command line
-
hf download hf://GenbaLabs/super-decider-mlx/README.md
-
curl -L -o README.md https://huggingface.co/GenbaLabs/super-decider-mlx/resolve/main/README.md
6.59 kB
| library_name: mlx | |
| license: apache-2.0 | |
| language: | |
| - en | |
| pipeline_tag: text-generation | |
| base_model: | |
| - google/diffusiongemma-26B-A4B-it | |
| - nvidia/diffusiongemma-26B-A4B-it-NVFP4 | |
| - Singularity-Compute/super-decider | |
| tags: | |
| - mlx | |
| - nvfp4 | |
| - diffusion-gemma | |
| - diffusion-lm | |
| - structured-output | |
| - decision-making | |
| # super-decider-mlx | |
| `Singularity-Compute/super-decider` — an NVFP4 4-bit 26B-A4B DiffusionGemma fine-tune for | |
| multiple-choice decision tasks — converted to run on Apple silicon under MLX, with the | |
| checkpoint's 4-bit experts preserved bit for bit and no quality loss from re-quantisation. | |
| Text only. MLX only. Expects single-token labels. | |
| ## What is in the box | |
| | | | | |
| |---|---| | |
| | Parameters | 25.82 B total (22.8 B of them expert weights at 4 bits) | | |
| | Size on disk | 18.8 GB — 8 safetensors shards, 1167 tensors | | |
| | Experts | NVFP4: packed uint32 codes, one E4M3 scale per 16 inputs, one F32 `global_scale` per expert matrix | | |
| | Everything else | BF16 — attention, router, dense MLP, embeddings, `lm_head` | | |
| | Architecture | 30 layers, 128 experts, top-8, hidden 2816, vocab 262144, bidirectional per-question blocks | | |
| | Vision tower | **removed** (the text path never reads it) | | |
| The experts arrive **pre-stacked and gate/up-fused**, exactly as the model consumes them: | |
| ``` | |
| model.decoder.layers.<i>.experts.gate_up_proj.{weight,scales,global_scale} | |
| model.decoder.layers.<i>.experts.down_proj.{weight,scales,global_scale} | |
| ``` | |
| so loading copies nothing and `mx.gather_qmm` takes the tensors directly. `global_scale` is the | |
| checkpoint's own per-expert scale (`448 * 6 * weight_scale_2`). `manifest.json` records the | |
| shard list, the tensor → shard map and the conversion's verification result. | |
| **This layout is not loadable by `transformers`.** Use the code in this repo (below). | |
| `transformers` is used only to read the tokenizer. | |
| ## Fidelity | |
| - **Weights are bit-exact.** The conversion copies the NVFP4 codes and E4M3 block scales byte | |
| for byte and keeps each expert's `global_scale`; the round-trip error is zero, and the | |
| dequantisation check over all 30 layers reports a worst relative error of `9.0e-08`. | |
| - **The forward pass matches the reference implementation numerically.** `tests/test_parity_tiny.py` | |
| builds a tiny random DiffusionGemma in `transformers` 5.21.0, loads the same state dict into | |
| this MLX model, and compares: denoiser logits (plain and self-conditioned), encoder hidden | |
| states (causal and with per-question bidirectional blocks), final token ids of a multi-canvas | |
| `generate()` including EOS and adaptive stopping, the NVFP4 expert path, the BF16 GPU path, | |
| and the real checkpoint's configs, RoPE tables and tensor names. 68 tests pass. | |
| - Note where the resemblance ends: the reference deployment serves with vLLM on an L40S | |
| (Marlin W4A16, FP8 KV cache, FP8 dense). This is the same arithmetic class on different | |
| kernels, so it is not bit-identical to that deployment. **The published JevBench scores were | |
| measured on the vLLM deployment, not on this port**, and have not been re-run here. | |
| ## Quickstart | |
| ```bash | |
| pip install -r requirements.txt | |
| hf download <this-repo> --local-dir ./sdc # ~19 GB | |
| cd ./sdc && MODEL=$(pwd) PY=python3 bash runtime/run.sh | |
| # engine :8000 (FastAPI, vLLM-compatible subset), decision server :8011 | |
| ``` | |
| Talk to the decision server. It takes a state and a map of questions whose answers are | |
| single-token labels. | |
| ```bash | |
| curl -s 127.0.0.1:8011/v1/systemone -H 'content-type: application/json' -d '{ | |
| "state": "Invoice VAT DE811907980, 1.234,00 EUR, reverse charge noted.", | |
| "questions": { | |
| "vat": {"type": "noul", "instructions": "Is VAT correctly applied?", | |
| "criteria": {"true": "reverse charge applied", "false": "VAT charged or missing"}}, | |
| "tone": {"type": "choice", "instructions": "Tone?", | |
| "criteria": {"formal": "bureaucratic", "neutral": "plain", "warm": "friendly"}}, | |
| "risk": {"type": "score", "instructions": "Risk?", | |
| "criteria": ["none", "low", "medium", "high"]} | |
| } | |
| }' | |
| ``` | |
| `criteria` shape depends on the type: `noul` a `{true, false}` object, `choice` an | |
| option-name → description object, `score` an ordered list of levels, `span` omitted. A wrong | |
| shape is a `422` that names the question. Question ids must be single tokens, and the | |
| instruction text is part of the prompt — a label you never mention in the state still has to | |
| be named in `criteria`. `span` questions return character offsets and are less proven than the | |
| label types. | |
| ## Performance (M5 Pro, 48 GB, macOS) | |
| | | | | |
| |---|---| | |
| | Load | ~2 s, 17.5 GiB resident, one copy of the weights | | |
| | Prefill | 1.8 s @ 2 k tokens, 11 s @ 6 k (attention grows quadratically) | | |
| | One decision read | ~0.23 s — a single denoiser step over a 128-slot canvas | | |
| | 8 draws of one read | 1 forward, not 8 (the canvases batch); identical answers to 8 serial reads | | |
| | Repeated state, new questions | instruction prefix KV is reused; ~0.5 s warm vs ~1.4 s cold for a 1.6 k-token prompt | | |
| `SD_LOG=1` prints a line per read: prompt tokens, reused prefix, canvas, draws, encode and | |
| denoise seconds. If `reused=` stays at 0 your prompts share no prefix and every request pays | |
| full prefill. | |
| ## Limits, stated plainly | |
| - **Text only.** Images are rejected, not silently ignored. | |
| - **One request at a time.** A single mutex around the engine: MLX is not thread-safe and the | |
| prompt prefix is cached in one slot. Concurrency above one just queues. | |
| - **Canvas ≤ 128, prompt ≤ 12288 tokens** (`--max-prompt`, default in `run.sh`; the model | |
| itself claims 262144, but prefill cost and KV size make that impractical here). Over the cap | |
| you get a real HTTP 400 that says so. | |
| - **Prefix-cache reuse is not bit-exact across requests.** Re-encoding a suffix over a shorter | |
| key dimension shifts the last BF16 bits: label probabilities move ~0.02 median / ~0.05 worst | |
| in 14 draws at 1.5 k tokens, with the top label unchanged. `SD_PREFIX_CACHE=0` disables it and | |
| costs a full prefill per request. | |
| - **Designed for one label at a time.** The decision path reads one token per question slot. It | |
| is not a general chat model; `generate()` exists for the thought channel and is slower and | |
| less exercised. | |
| ## Attribution | |
| Apache-2.0. Converted from `Singularity-Compute/super-decider`, which is a fine-tune of | |
| `google/diffusiongemma-26B-A4B-it` (Google DeepMind) merged into NVIDIA's | |
| `nvidia/diffusiongemma-26B-A4B-it-NVFP4` ModelOpt checkpoint. `runtime/structured_server.py` | |
| is derived from [mmastrac/djev](https://github.com/mmastrac/djev). See `NOTICE`. | |