Nemotron on Apple Silicon
NVIDIA's Nemotron 3 is a hybrid: it interleaves Mamba2 state-space blocks with a handful of full-attention layers, and the MoE variants add a sparse expert mixture. In the 4B (dense), only four of the 42 backbone blocks are true attention; the rest are linear-attention SSM or MLP. The 30B-A3B routes through 128 experts at ≈3 B active parameters per token. The Super 120B-A12B goes further: a 512-expert MoE (22 active) that, at 2-bit, runs on a 36 GB Mac by streaming its experts off SSD. All load through mlx-lm's built-in nemotron_h class.
Nemotron 3.5 Lightning
Lightning-30B-A3B is the newer generation: the same Mamba-attention hybrid, now with a 128-expert MoE and 6 experts active per token. 22.8 GB on disk, down from 65.8 GB, and the MTP speculative head is preserved in the sidecar.
| Metric | Score | |||
|---|---|---|---|---|
| NVIDIA-Nemotron-3.5-Lightning-30B-A3B-OptiQ-4bit | 22.8 GB | 73.94 | n/a | Newest · 128-expert MoE, MTP head preserved |
| MMLU (5-shot, 969 samples) | 78.9% | |||
| GSM8K (1000 samples) | 85.5% | |||
| IFEval (full set, strict) | 68.4% | |||
| BFCL-V3 simple (200 calls) | 83.0% | |||
| HumanEval (164 problems, pass@1) | 87.8% | |||
| HashHop (long-context retrieval) | 40.0% | |||
| Capability Score (mean of 6) | 73.94 |
The routed experts carry most of the weight, so that is where the bits come from: every 4-bit assignment in the model is an expert tensor, with the rest of the stack at 8-bit. Code generation is its strength; long-context multi-hop retrieval is the weak spot, which is what a hybrid with few attention layers predicts.
At 22.8 GB it will not sit resident on a 24 GB machine. Stream the experts from SSD instead:
$ optiq serve --model mlx-community/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-OptiQ-4bit --stream-expertsMeasured on a 26 GB M4 Pro: 4.2 GB resident, 6.0 GB load peak, against a resident load that runs out of memory.
The quants
| Model | Size on disk | Capability Score | vs uniform-4 | Best for |
|---|---|---|---|---|
| NVIDIA-Nemotron-3-Super-120B-A12B-OptiQ-2bit | 47.5 GB | n/a | n/a | Super · 2-bit, SSD-streamed on a 36 GB Mac |
| NVIDIA-Nemotron-3-Nano-30B-A3B-OptiQ-4bit | 20.6 GB | 72.32 | +2.02 | Strongest of the two, math, code, long context |
| NVIDIA-Nemotron-3-Nano-4B-OptiQ-4bit | 2.9 GB | 66.68 | +0.24 | Small dense assistant, hybrid-SSM experimentation |
static build (47.5 GB) that runs on a 36 GB Mac: ~14 GB resident (the Mamba blocks, attention and shared experts stay in RAM), and the 34 GB of routed experts stream off the SSD, ~3 tok/s. There is no Capability Score for it: at 2-bit that number is not meaningful, so it ships with a coherence check instead: it still writes working code at 2-bit. Read the write-up.
Per-benchmark breakdown, 30B-A3B
| Benchmark | uniform-4 | OptiQ-4 (mixed) | Δ |
|---|---|---|---|
| MMLU (5-shot, 1000) | 74.8% | 76.2% | +1.3 |
| GSM8K (3-shot CoT) | 78.5% | 81.6% | +3.1 |
| IFEval (strict) | 67.5% | 69.1% | +1.7 |
| BFCL V3 (simple AST) | 74.0% | 74.0% | 0.0 |
| HumanEval (pass@1) | 86.0% | 89.0% | +3.0 |
| HashHop (overall) | 22.0% | 25.0% | +3.0 |
Per-benchmark breakdown, 4B
| Benchmark | uniform-4 | OptiQ-4 (mixed) | Δ |
|---|---|---|---|
| MMLU (5-shot, 1000) | 63.3% | 64.0% | +0.7 |
| GSM8K (3-shot CoT) | 79.9% | 81.5% | +1.6 |
| IFEval (strict) | 56.0% | 56.2% | +0.2 |
| BFCL V3 (simple AST) | 75.5% | 75.5% | 0.0 |
| HumanEval (pass@1) | 80.5% | 77.4% | -3.1 |
| HashHop (overall) | 25.0% | 27.0% | +2.0 |
Hello world
from mlx_lm import load, generate model, tok = load("mlx-community/NVIDIA-Nemotron-3-Nano-4B-OptiQ-4bit") prompt = tok.apply_chat_template( [{"role": "user", "content": "Explain why hybrid Mamba+attention models scale to long contexts."}], tokenize=False, add_generation_prompt=True, ) print(generate(model, tok, prompt=prompt, max_tokens=300))
Hybrid KV cache
Only the four full-attention layers carry a KV cache, the Mamba2 blocks keep recurrent state instead, which is what gives the architecture its flat long-context memory profile. The repo ships a kv_config.json from a real sensitivity pass that covers just those attention layers: three at 4-bit, one at 8-bit, 5.0 average KV bits. Point optiq serve at it for mixed-precision KV.
mixer (not self_attn) and skips MLP layers in the prompt cache. optiq kv-cache classifies each layer as attention / SSM / MLP and maps cache slots to the right layer indices.
Serving
$ optiq serve --model mlx-community/NVIDIA-Nemotron-3-Nano-4B-OptiQ-4bit \ --kv-config kv_config.json --port 8000 # From any OpenAI-compatible client: $ curl -s http://localhost:8000/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{"model":"mlx-community/NVIDIA-Nemotron-3-Nano-4B-OptiQ-4bit", "messages":[{"role":"user","content":"What is 17 * 23?"}]}'