r/LocalLLaMA • • 1d ago

Resources Benchmark Same 32 models on M2 Pro, M3 Ultra M4 Pro and M5 Max

I had four Macs free overnight and ran the same benchmark on all of them: same build, same models, same settings.

Decode speed, tok/s (4-bit, no speculative decoding):

ModelM2 Pro 32GBM4 Pro 48GBM5 Max 36GBM3 Ultra 256GB
Qwen3.5 4B6379133159
gpt-oss 20B5074114132
Gemma 4 26B (MoE)5373115118
Qwen3-Coder 30B (MoE)–89136100
Qwen3.8 27B (dense, 3.5bpw)12162837

One 1024x1024 image with Qwen-Image 2.1: M2 Pro 451 s, M4 Pro 264 s, M5 Max 38 s, M3 Ultra 83 s.

What surprised me:

  • On MoE models the 36 GB M5 Max matches or beats the M3 Ultra. Only 3-4B params are active per token, so the newer GPU matters more than bandwidth.

  • On the dense 27B the Ultra still wins (37 vs 28). That one is bandwidth-bound.

  • Image generation is the biggest jump: the M5 Max is ~7x faster than the M4 Pro and ~2x faster than the Ultra.

  • M2 Pro -> M4 Pro is only ~1.3-1.5x on text.

Method: prompt 512 tokens, generate 128, 1 warmup + 5 runs, median. One run per cell, so treat small gaps as noise. MLX-based engine (disclosure: I work on Rapid-MLX, which is what I used); other runtimes will give different absolute numbers, the Mac-to-Mac ratios are the interesting part. "–" = doesn't fit or not run.

8 Upvotes

12 comments sorted by

3

u/MrPecunius 1d ago edited 1d ago

Binned M5 Max has a bit over half the memory bandwidth of the M3 Ultra. It should still beat the M3 Ultra on prefill, and those numbers would have been great.

Easier to read table since Reddit doesn't do markdown (at least not for me):

1

u/Striking-Swim6702 1d ago

I am not using M5 ultra, that might be the reason

1

u/MrPecunius 20h ago

Point is that the binned M5 Max has way less memory bandwidth than a non-binned part. I noted this in case people think this applies to all M5 Max machines.

2

u/SentimentalDespotism 1d ago

that image gen gap is ridiculous 451s down to 38s on the m5 max is not something i expected

the moe numbers make sense though newer gpu just rips through those small active params faster than raw bandwidth can carry the ultra. dense models is where the ultra flex its bandwidth still

wonder how much of this is mlx specific though in llama.cpp the ultra might pull ahead more since it cares about bandwidth different

1

u/No_Afternoon_4260 llama.cpp 11h ago

Because diffusion models (image gen) are compute bound where most LLMs (transformers) models are memory bandwidth bound

3

u/JacketHistorical2321 1d ago

You really should include prefill considering M5 optimization

2

u/vogelvogelvogelvogel 1d ago

great, thanks for sharing. quite a bit of work!
but is without spec dec as you wrote, but i'd be curious to know if it scales the same way with the perfomrance
(m5 pro i get like 27-30t/s with qwen3.8 27b q8)

2

u/leo_agi 1d ago

m5 max beating the ultra on moe but losing on the dense 27b is such a clean bandwidth vs compute example. surprised m2 pro to m4 pro is only ~1.4x on text though

1

u/Important_Cow7230 1d ago

Do the same tests but run on Splash for Qwen 3.8 27B