Apple Silicon Benchmark Report - 2026-05-19

June 4, 2026 ยท View on GitHub

This report summarizes mlxcel performance on Apple Silicon using the 2026-05-19 benchmark campaign. It covers two 128 GB Apple Silicon systems:

  • Mac Studio M1 Ultra
  • MacBook Pro M5 Max

The same report also compares mlxcel against the Python reference stacks: mlx-lm for text models and mlx-vlm for vision-language models.

The short version: mlxcel is already at practical decode parity with the Python MLX stacks on most comparable models, and it completes many models that the Python baseline did not complete in this sweep. The strongest public story is same-host decode throughput and model coverage. Short-prompt prefill is reported separately because it is more prompt-shape-sensitive and, for VLMs, includes image encoder and projector work.

Headline Results

HostModeBaselineComparable pairsPrefill median vs baselineDecode median vs baselineDecode result
M5 MaxTextmlx-lm662.70x99%62/66 at >=90% parity
M1 UltraTextmlx-lm741.76x99%64/74 at >=90% parity
M5 MaxVLMmlx-vlm220.94x101%18/22 at >=90% parity
M1 UltraVLMmlx-vlm181.33x98%12/18 at >=90% parity

Ratios above use successful runs only. Baseline rows use exact CSV model identifiers and compare mlxcel and the Python stack on the same host. Decode parity is the primary comparison point because it measures steady-state generation after the KV cache is built.

The mlxcel rows use the mlxcel-bench-decode harness: the model is loaded once, a warmup pass is run, and then the measured 100-token pass is recorded in the same process. This is the benchmark method used for the current Apple Silicon results. VLM prefill remains more prompt-shape- and processor-sensitive than text prefill, so decode remains the primary VLM comparison.

Gemma 3 and Gemma 3n VLM rows are included in the M5 Max VLM table. The Gemma3n E2B and E4B 4-bit checkpoints run above mlx-vlm decode parity in this sweep, while the E4B bf16 checkpoint is successful but below parity.

Why This Matters

mlxcel is not only running close to the Python reference implementations on the common path; it is also running models that the Python baseline did not complete in this sweep. With a generated-token threshold of 5 tokens:

HostModemlxcel successful, Python baseline unavailable or failedComparable successful pairs
M5 MaxText2666
M1 UltraText2374
M5 MaxVLM1222
M1 UltraVLM2018

This is the useful public framing: mlxcel is a Rust inference engine with direct MLX bindings that is already near Python decode performance for many models, while providing broad model coverage across text, MoE, hybrid SSM, and VLM families.

Representative Text Models

All values are tokens per second. Prefill and decode are shown separately. The final column compares mlxcel decode throughput against mlx-lm on the same host.

HostModelClassmlxcel prefillmlxcel decodemlx-lm decodevs mlx-lm
M5 Maxsmollm-135m-4bitSmall dense6058.41905.24711.54127%
M5 Maxqwen2.5-7b-4bitDense 7B917.38126.36123.59102%
M5 Maxgpt-oss-120b-4bitLarge MoE334.68114.03110.35103%
M5 Maxsolar-open-100b-4bitLarge MoE210.9165.3666.3099%
M5 Maxqwen3.5-35b-a3b-4bitHybrid MoE480.89151.63152.9699%
M5 Maxnemotron-h-30b-4bitHybrid SSM/MoE414.31177.18178.8099%
M1 Ultraphi-3.5-moe-4bitMoE112.1077.7169.28112%
M1 Ultraminicpm3-4b-4bitMLA241.4480.7873.26110%
M1 Ultraqwen2.5-0.5b-4bitSmall dense1243.98349.52315.48111%
M1 Ultragpt-oss-120b-4bitLarge MoE114.1261.1957.58106%
M1 Ultracommand-r7b-4bitDense 7B81.17114.34107.75106%
M1 Ultrasolar-open-100b-4bitLarge MoE75.3736.2635.69102%

The table shows the central performance claim without cross-hardware ranking: mlxcel is already close to mlx-lm on the same machine for dense 7B models, newer hybrid MoE families, and very large MoE models such as GPT-OSS 120B.

Representative VLM Models

All values are tokens per second. VLM prefill includes vision-side work when the run uses image input, so decode is the cleaner apples-to-apples baseline comparison.

HostModelClassmlxcel prefillmlxcel decodemlx-vlm decodevs mlx-vlm
M5 Maxqwen3.5-0.8b-4bitHybrid GatedDeltaNet VLM1294.94505.94410.96123%
M5 Maxqwen3.5-35b-a3b-4bitHybrid MoE VLM355.32151.34128.80117%
M5 Maxgemma-4-e2b-it-4bitGemma 4 VLM2787.47217.32201.70108%
M5 Maxgemma3n-e2b-4bitGemma 3n VLM2893.48151.36124.63121%
M5 Maxmolmo2-4bMolmo2 vision encoder2512.3164.0166.8096%
M1 Ultrallava-interleave-qwen-0.5b-bf16SigLIP + Qwen23961.62265.57225.15118%
M1 Ultraaya-vision-8bSigLIP + Cohere2444.01113.59103.74110%
M1 Ultramolmo2-4bMolmo2 vision encoder727.2660.3160.8799%
M1 Ultraphi-3.5-vision-4bitCLIP + HD tiling991.67122.6392.53133%
M1 Ultrapixtral-12b-4bitPixtral ViT + Mistral447.9760.25--

The VLM data is most compelling as a coverage and decode-throughput story: mlxcel runs many VLM paths in the same benchmark matrix, and its comparable decode results sit near mlx-vlm median parity on both Apple Silicon hosts.

Where mlxcel Looks Strongest

  • Steady-state decode: M5 Max text decode is within 1% of mlx-lm median parity and VLM decode reaches mlx-vlm median parity. M1 Ultra shows the same pattern, with 99% text median parity and 98% VLM median parity.
  • Short-prompt text prefill: mlxcel prefill is 2.70x mlx-lm median on M5 Max text and 1.76x mlx-lm median on M1 Ultra text. Representative M5 Max values include gpt-oss-120b at 334.68 tok/s and nemotron-h-30b at 414.31 tok/s.
  • Large MoE practicality: GPT-OSS 120B reaches 114.03 tok/s on M5 Max and 61.19 tok/s on M1 Ultra, both at or slightly above mlx-lm parity on the same host. Solar-Open 100B reaches 65.36 tok/s (M5 Max) / 36.26 tok/s (M1 Ultra), also at mlx-lm parity.
  • Model coverage: mlxcel completes many runs where the Python baseline fails or is unavailable in the same benchmark matrix. This is especially visible for VLM wrappers, Gemma 4 variants, ERNIE, Hunyuan, ExaOne4, and several newer hybrid/MoE families.

Speculative Decoding (MTP)

Added 2026-06-04 on Apple M5 Max (128 GB). Unlike the rows above, this compares mlxcel against itself, classic decode versus MTP speculative decode on the same target, rather than against a Python baseline.

Target (family)Drafterblockclassic tok/sMTP tok/sspeedup
gemma-4-12b-it-4bit (Gemma 4 Unified)gemma-4-12B-it-assistant-4bit4~39~74~1.87x

Output is byte-identical at temperature 0 (MTP is exactness-preserving). The Gemma 4 Unified target cannot batch, so the scheduler runs its B=1 MTP path by default. See Benchmarks, Speculative decoding (MTP) for the measurement method and the Gemma 4 31B batched-window notes.

Reading the Numbers Correctly

  • Decode tok/s is the headline metric. It measures autoregressive token generation after prefill and is the fairest cross-runtime comparison.
  • Prefill tok/s is shown because it affects time-to-first-token, but this campaign uses short prompts. Long-context prefill should be benchmarked separately before making public claims about long-prompt throughput.
  • VLM prefill may include image preprocessing, vision encoder, and projector overhead. Compare VLM prefill numbers only when the image path and processor setup are the same.
  • Baseline failures are sweep-specific. A FAIL in this report means the referenced checkout and local model directory did not complete this run. It should not be read as a permanent limitation of mlx-lm or mlx-vlm.

Benchmark Method

ItemM1 UltraM5 Max
HardwareMac Studio M1 Ultra, 128 GB RAMMacBook Pro M5 Max, 128 GB RAM
OSmacOS 26.4macOS 26.4
mlxcel0.0.280.1.0
MLX pin84961223 via mlxcel-core84961223 via mlxcel-core
Bench harnessmlxcel-bench-decode: one process loads the model, runs a 20-token warmup, then a 100-token measured passmlxcel-bench-decode: one process loads the model, runs warmup, then a 100-token measured pass
Text promptHello, how are you today?Hello, how are you today?
VLM promptWhat is in this image?What is in this image?
Max generated tokens100 (measured), 20 (warmup)100 (measured)
Oversize policy>65 GB skipped on both mlxcel and Python baselinesame benchmark campaign policy

The M5 Max benchmark campaign ran as one continuous campaign across calendar midnight. For public reporting it is grouped under 2026-05-19. CSV filenames still reflect the date of each sub-sweep.

Source Data

Source-of-truth CSVs:

  • benchmarks/metal_m1ultra_2026-05-19.csv
  • benchmarks/metal_m1ultra_vlm_2026-05-19.csv
  • benchmarks/pylm_m1ultra_2026-05-19.csv
  • benchmarks/pylm_m1ultra_vlm_2026-05-19.csv
  • benchmarks/metal_m5max_2026-05-19.csv
  • benchmarks/metal_m5max_vlm_2026-05-19.csv
  • benchmarks/metal_m5max_vlm_2026-05-20.csv
  • benchmarks/pylm_m5max_2026-05-18.csv
  • benchmarks/pylm_m5max_vlm_2026-05-18.csv

Full per-hardware details: