Economics12 min read10 sections2,329 words

Mac Metal MLX vs Linux CUDA: Perf per Watt Deep Dive

How Apple Silicon's unified memory and MLX stack stack up against NVIDIA H100/RTX 5090 on tokens per joule for local LLM inference.

Published May 27, 2026
TL;DR
  • Apple M3 Ultra delivers up to 192 GB unified memory at ~600 GB/s, enabling 70B+ models without quantization at 45-80W system draw, unmatched VRAM-per-watt.
  • NVIDIA H100 SXM achieves 3-5x raw tokens/sec on 70B models but draws 700W+, yielding 2-3x better perf/watt only at batch sizes >4; at batch=1, Mac often wins on energy per token.
  • MLX on Metal uses Apple's GPU efficiently but lacks FlashAttention-3, PagedAttention, and tensor parallelism across nodes, capping throughput on long-context workloads.
  • Linux CUDA with vLLM, TensorRT-LLM, and FlashAttention-2/3 achieves 4-8x higher throughput than MLX on the same model size, but at 5-10x the power budget.
  • For single-user interactive inference (batch=1, context < 8K), Mac M3 Ultra with MLX is the most energy-efficient option; for production serving with high concurrency, H100/B200 dominates perf/watt.
  • Strix Halo (AMD Ryzen AI Max) with 128 GB unified memory and 256 GB/s bandwidth could challenge Mac in perf/watt for mid-size models, but software stack maturity lags.
01

The New Battleground: Energy Efficiency at the Edge

The AI hardware conversation has shifted. For the first time in a decade, raw FLOPs and memory bandwidth are no longer the sole arbiters of value. Power draw, and by extension, performance per watt, has become the critical metric for anyone running LLMs locally. Whether you are building a personal coding assistant on a MacBook Pro, deploying a private chatbot on a workstation, or running a small-scale inference server in a colo, the cost of electricity and thermal management directly impacts your total cost of ownership.

This article pits two dominant ecosystems against each other: Apple's Metal MLX stack running on Apple Silicon (M3 Ultra, M4 Max) versus the Linux CUDA stack running on NVIDIA GPUs (H100, RTX 5090, A100). We will measure not just tokens per second, but tokens per joule, the true measure of efficiency for always-on inference. We will also examine the emerging AMD Strix Halo (Ryzen AI Max 300 series) as a potential dark horse, though its software maturity remains unproven.

The thesis is nuanced: For single-user interactive workloads with models up to 70B parameters, Apple Silicon with MLX can deliver comparable or better energy efficiency than a 700W H100. For batch inference or serving multiple users, NVIDIA's mature software stack and massive parallelism still win on perf/watt by a factor of 2-3x. The choice depends on your workload profile, not on raw specs alone.

Note

Performance per watt is the new FLOPs. For local inference, energy cost often exceeds hardware depreciation over a 3-year lifespan.

02

Hardware Under the Microscope: Memory Bandwidth, Capacity, and Power

Let us ground the discussion in real numbers. The Apple M3 Ultra (2024) packs up to 192 GB of unified memory with a bandwidth of approximately 800 GB/s (LPDDR5-8533). The entire system, CPU, GPU, NPU, memory, draws between 45W (idle) and 80W (sustained GPU load). That is remarkable. You get 192 GB of high-bandwidth memory for the same power budget as a single RTX 4090 (450W) or one-eighth of an H100 (700W).

On the NVIDIA side, the H100 SXM5 offers 80 GB of HBM3 at 3.35 TB/s bandwidth, drawing 700W (TDP). The upcoming B200 (Blackwell) pushes to 192 GB of HBM3e at 8 TB/s but at a staggering 1000W TDP. For the desktop, the RTX 5090 (expected 2025) will likely offer 32 GB GDDR7 at ~1.5 TB/s, drawing 600W. The A100 80 GB (2.0 TB/s, 400W) remains a workhorse for inference.

AMD's MI300X offers 192 GB HBM3 at 5.2 TB/s with a 750W TDP, but the software stack (ROCm) still lags CUDA in ease of use for LLM inference, especially for frameworks like vLLM and TensorRT-LLM. The Strix Halo APU (Ryzen AI Max 300) is the most interesting competitor to Apple: up to 128 GB unified memory (LPDDR5X-8000) at ~256 GB/s, with a 55-120W TDP. The bandwidth is a fraction of Apple's, but the capacity is competitive for 70B models at 4-bit quantization.

Key takeaway: Apple's advantage is not raw bandwidth, it is the combination of large unified memory and extremely low power draw. For a model that fits in 192 GB (e.g., Llama 3 70B at 4-bit uses ~40 GB, FP16 uses ~140 GB), the Mac can run it without any data movement over PCIe, consuming less than 100W. An H100 can run it faster, but at 7x the power.

text
System                  Memory       Bandwidth    TDP      Price (approx)
M3 Ultra (192 GB)       192 GB LPDDR5  800 GB/s     80 W     $7,000
H100 SXM5 (80 GB)        80 GB HBM3   3350 GB/s    700 W    $30,000
RTX 5090 (32 GB)         32 GB GDDR7  1500 GB/s    600 W    $2,000 (est)
A100 SXM4 (80 GB)        80 GB HBM2e  2039 GB/s    400 W    $15,000
Strix Halo (128 GB)     128 GB LPDDR5X 256 GB/s    120 W    $1,500 (est)
03

Software Stack Showdown: MLX vs. CUDA Ecosystem

Hardware is only half the story. The software stack determines how efficiently you can translate those raw specs into tokens per second. On the Linux CUDA side, the ecosystem is vast and battle-tested. vLLM with PagedAttention, FlashAttention-2/3, TensorRT-LLM with plugin-based kernels, and ExLlamaV2 with highly tuned GPTQ/AWQ kernels all leverage NVIDIA's CUTLASS and cuBLAS libraries. For multi-GPU setups, tensor parallelism (via NCCL) and pipeline parallelism are mature. The result: near-100% GPU utilization on dense models like Llama 3 70B, achieving 40-60 tokens/sec on a single H100 at batch size 1, and over 200 tokens/sec at batch size 32.

On Apple Silicon, MLX (Apple's machine learning framework) provides a NumPy-like API with JIT compilation and unified memory access. It is built on Metal Performance Shaders (MPS) and MetalFX. MLX is impressively efficient for its power envelope. For Llama 3 8B (4-bit), MLX achieves ~50 tokens/sec on an M3 Ultra, drawing ~30W GPU power. For Llama 3 70B (4-bit), it delivers ~8-12 tokens/sec at ~60W. That is competitive on a perf/watt basis for single-user inference.

However, MLX lacks several critical optimizations found in the CUDA ecosystem. There is no FlashAttention-3 (only a basic fused attention kernel), no PagedAttention for efficient KV cache management, and no built-in tensor parallelism across multiple Macs (though you can hack it with MPI). Long-context inference (32K+ tokens) suffers significantly, the attention kernel is memory-bound and does not tile efficiently. MLX does not support speculative decoding or Medusa-style tree attention out of the box.

MLC-LLM (on Metal) and llama.cpp (with Metal backend) are alternatives, but they generally trail MLX in performance for Apple Silicon. The gap is narrowing, but as of mid-2026, the CUDA stack is 2-4x more efficient in terms of tokens per watt of GPU power (not system power) on equivalent memory bandwidth.

bash
# Example: Running Llama 3 70B Q4_K_M on Mac M3 Ultra with MLX
python -m mlx_lm.generate --model mlx-community/Llama-3-70B-4bit \
  --max-tokens 512 --temp 0.7 --prompt "Explain quantum computing"
# Expected output: ~10 tokens/sec, total system power ~65W

# Equivalent on Linux with vLLM + H100
python -m vllm.entrypoints.openai.api_server \
  --model meta-llama/Meta-Llama-3-70B \
  --quantization awq --dtype half --max-model-len 4096
# Expected output: ~50 tokens/sec (batch=1), GPU power ~450W
04

Perf per Watt: Batch Size 1 (Interactive Inference)

For the most common local use case, a single user chatting with a model, batch size is 1. Here, the memory bandwidth bottleneck dominates, not compute. The H100's 3.35 TB/s bandwidth is 4x that of the M3 Ultra's 800 GB/s, but the H100 draws 700W vs. 80W for the Mac. That is an 8.75x power difference. If we normalize tokens per second per watt, the Mac often wins.

Concrete numbers for Llama 3 70B (4-bit, context length 2048): - M3 Ultra (MLX): 10 tokens/sec, 65W system power → 0.154 tokens/sec per watt. - H100 (vLLM, FP8): 50 tokens/sec, 450W GPU power (plus ~100W system) → 0.091 tokens/sec per watt. - RTX 5090 (exptd, 4-bit): 35 tokens/sec, 500W system → 0.07 tokens/sec per watt. - A100 (80 GB, 4-bit): 30 tokens/sec, 400W system → 0.075 tokens/sec per watt.

At batch size 1, the Mac delivers 1.7x better perf/watt than the H100. The gap widens for smaller models. For Llama 3 8B (4-bit): - M3 Ultra: 50 tokens/sec, 35W → 1.43 tokens/sec per watt. - H100: 250 tokens/sec, 400W → 0.625 tokens/sec per watt. - RTX 4090: 120 tokens/sec, 350W → 0.34 tokens/sec per watt.

Apple Silicon is 2-4x more energy efficient for single-user interactive inference. This is why many developers are switching to MacBooks for local LLM experimentation, you get decent speed with negligible power and heat.

Tip

For batch=1 interactive use, Mac M3 Ultra with MLX offers the best tokens per joule of any shipping hardware as of mid-2026.

05

Perf per Watt: Batch Inference (Production Serving)

When you increase batch size to 8, 16, or 32, the game changes completely. NVIDIA GPUs with high memory bandwidth and massive compute units can process multiple sequences in parallel, amortizing the overhead of loading model weights. The H100's 3.35 TB/s and 18432 CUDA cores allow it to achieve near-linear scaling up to batch 32 for dense models.

For Llama 3 70B (4-bit, batch=32): - H100 (vLLM, FP8): 800 tokens/sec, 700W system → 1.14 tokens/sec per watt. - M3 Ultra (MLX): 60 tokens/sec, 80W → 0.75 tokens/sec per watt. - RTX 5090 (batch=16, due to 32 GB VRAM): 300 tokens/sec, 600W → 0.50 tokens/sec per watt.

At batch=32, the H100 now leads perf/watt by 1.5x over the M3 Ultra. For Mixture-of-Experts models like Mixtral 8x7B or GPT-4-class MoEs, the advantage grows because NVIDIA's sparse kernels (e.g., from TensorRT-LLM) can skip inactive experts, while MLX lacks such optimizations.

Furthermore, for serving multiple users concurrently, the H100 can handle dozens of simultaneous requests with PagedAttention and continuous batching, while a single Mac is limited to one or two concurrent generations before latency spikes. The Mac's unified memory is a bottleneck here, the CPU and GPU share the same bandwidth, and heavy inference starves the rest of the system.

python
# vLLM continuous batching on H100 (simplified)
from vllm import LLM, SamplingParams

llm = LLM(model="meta-llama/Meta-Llama-3-70B", quantization="awq", max_num_seqs=32)
params = SamplingParams(temperature=0.7, max_tokens=512)
outputs = llm.generate(["Prompt 1", "Prompt 2", ...] * 16, params)
# Throughput: ~800 tokens/sec at batch=32
06

Long Context and Memory Wall: Where Each Platform Struggles

Long-context inference (32K, 128K, 1M tokens) exposes the memory wall brutally. The KV cache grows linearly with context length and batch size. For a 70B model at 4-bit, each token's KV cache requires ~800 KB (for key and value, assuming 128 dimensions per head, 64 heads, 4-bit). At 128K context, that is 100 GB of KV cache alone, exceeding the H100's 80 GB VRAM. You must offload to CPU memory or use KV cache compression (e.g., sliding window, H2O, or quantization).

The Mac M3 Ultra with 192 GB unified memory can hold the entire KV cache for 128K context (100 GB) plus model weights (40 GB) with headroom. However, the attention computation becomes memory-bandwidth-bound. MLX's attention kernel (a naive implementation) achieves only ~30% of the theoretical bandwidth on long sequences. FlashAttention-3 on H100 achieves >70% of HBM bandwidth. The result: for 128K context, the H100 might still deliver 5 tokens/sec (after offloading some KV cache to CPU) while the Mac delivers 2 tokens/sec, but the H100 draws 700W vs 80W. Perf/watt is roughly equal at these extremes.

For context lengths beyond 1M (e.g., for retrieval-augmented generation with massive document stores), only systems with very large memory capacity can avoid offloading. The Mac's 192 GB unified memory is a unique asset here. No NVIDIA GPU (except the Grace Hopper with 480 GB of unified memory, but at ~2000W for the full system) can match that capacity without PCIe transfers. For long-context RAG on a single machine, the Mac is the only practical option if you want to avoid offloading latency.

Warning

MLX lacks FlashAttention-3 and PagedAttention, making long-context inference 2-3x slower per watt than CUDA with optimized kernels.

07

Quantization and Precision: How Bits Affect Perf/Watt

Quantization is the great equalizer. Running models at 4-bit (GPTQ, AWQ, GGUF Q4_K_M) reduces memory footprint and bandwidth requirements by 4x compared to FP16, with minimal accuracy loss. Both MLX and CUDA support 4-bit inference, but the implementation details matter.

On CUDA, TensorRT-LLM and ExLlamaV2 use highly tuned group-wise quantization kernels that leverage INT4 tensor cores on Ada Lovelace and Hopper architectures. These kernels achieve close to 100% utilization of the INT4 compute throughput. For Llama 3 70B at 4-bit, an H100 can process tokens at a rate limited by memory bandwidth, not compute, meaning the 3.35 TB/s is fully utilized.

On MLX, 4-bit quantization is implemented via lookup tables and dequantization on the fly. The Metal GPU does not have native INT4 tensor cores (Apple's ANE has some, but MLX does not use them for LLM inference). As a result, MLX spends a significant fraction of time on dequantization overhead. For 70B models, this overhead reduces effective bandwidth utilization to ~60% of the theoretical 800 GB/s. The Mac is still efficient because its power draw is so low, but it leaves performance on the table.

Newer quantization formats like IQ4_NL (from llama.cpp) and AQLM (Additive Quantization of Language Models) promise better quality-per-bit, but they are computationally heavier. On CUDA, these can still be fast due to tensor cores; on Metal, they may be slower than simple 4-bit. The choice of quantization method directly impacts tokens per joule, and the optimal format differs per platform.

bash
# GGUF quantization on Mac with llama.cpp (Metal backend)
./quantize models/llama-3-70b-f16.gguf Q4_K_M models/llama-3-70b-Q4_K_M.gguf
# Then run inference:
./main -m models/llama-3-70b-Q4_K_M.gguf -p "Hello" -n 512 -ngl 99
# On M3 Ultra: ~8 tokens/sec, ~60W
08

Multi-Node and Scalability: Where CUDA Leaves Metal in the Dust

If you need to scale beyond a single machine, the choice is clear: Linux CUDA. NVIDIA's NCCL (NVIDIA Collective Communications Library) enables tensor parallelism across multiple GPUs with minimal overhead. With NVLink (900 GB/s per GPU on H100) or even PCIe Gen 5 (128 GB/s per direction), multi-GPU inference is practical and efficient. Frameworks like vLLM, TensorRT-LLM, and even PyTorch with FSDP can split a 70B model across 2-4 GPUs with near-linear scaling.

Apple Silicon has no equivalent. There is no hardware interconnect between Macs for low-latency GPU memory access. You could use Thunderbolt 5 (80 GB/s theoretical, ~40 GB/s real) for distributed inference, but the latency and bandwidth are orders of magnitude worse than NVLink. MLX does not support distributed tensor parallelism out of the box. You would need to use MPI or gRPC to coordinate, and the overhead would kill throughput. For a single user, you might get away with it, but for any production scenario, it is a non-starter.

AMD's Strix Halo and MI300X face similar challenges. ROCm's NCCL equivalent (RCCL) is improving, but the ecosystem is smaller. For multi-node inference, NVIDIA remains the only viable option as of 2026.

Warning

Macs cannot be clustered for LLM inference, no NVLink, no tensor parallelism across nodes. For multi-GPU setups, Linux CUDA is the only game in town.

09

The Strix Halo Wildcard: AMD's Unified Memory Play

AMD's Strix Halo (Ryzen AI Max 300 series) is the most direct competitor to Apple Silicon for unified memory AI. It offers up to 128 GB of LPDDR5X-8000 memory with ~256 GB/s bandwidth, integrated RDNA 3.5 GPU (up to 40 Compute Units), and XDNA 2 NPU. The TDP ranges from 55W to 120W. On paper, it looks promising for running 70B models at 4-bit (40 GB weights + 20 GB KV cache = 60 GB) within its 128 GB pool.

However, the software stack is immature. AMD's ROCm for Windows (via DirectML) and Linux (ROCm 6.x) supports PyTorch and ONNX Runtime, but ML frameworks specifically optimized for unified memory are lacking. There is no MLX equivalent for AMD. Projects like MLC-LLM and llama.cpp have Vulkan and HIP backends, but performance is 30-50% lower than Apple Metal on equivalent bandwidth. The NPU (XDNA 2) is powerful for small models (<7B) but cannot run 70B models due to limited SRAM.

If AMD invests in a first-party ML framework (like Apple did with MLX), Strix Halo could become a strong contender for perf/watt, especially in laptops. But as of mid-2026, the software gap is too wide. For now, Mac remains the unified memory champion.

python
# Hypothetical Strix Halo inference with llama.cpp Vulkan backend (not yet optimized)
# ./main -m models/llama-3-70b-Q4_K_M.gguf -p "Hello" -n 512 -ngl 99 --vulkan
# Expected: ~5 tokens/sec at 90W (vs Mac's 10 tokens/sec at 65W)
10

Conclusion: Choose Your Weapon Based on Workload, Not Hype

There is no universal winner. The choice between Mac Metal MLX and Linux CUDA for local LLM inference depends entirely on your workload profile.

Choose Mac Metal MLX if: - You run single-user interactive inference (batch size 1). - You need to run 70B+ models without quantization, or with light quantization, and want to keep power under 100W. - You value a quiet, cool desktop or laptop environment. - Your context lengths are moderate (<32K) and you do not need FlashAttention-level performance.

Choose Linux CUDA (NVIDIA) if: - You serve multiple users or need high throughput (batch size > 4). - You need long-context inference with optimized attention kernels. - You plan to scale to multiple GPUs or nodes. - You rely on the mature ecosystem of vLLM, TensorRT-LLM, and speculative decoding.

For the serious AI builder, the ideal setup might be both: a Mac for interactive development and experimentation, and a Linux box with H100s for production serving. The perf/watt analysis shows that each platform has a regime where it excels. Ignore the hype, measure your own workload, and choose accordingly.

Note

The best perf/watt platform depends on batch size and concurrency. Measure your own workload, do not rely on vendor benchmarks.

Pitfalls and common misconceptions

  • 1Assuming peak TOPS equals inference speed, memory bandwidth is the real bottleneck for LLMs, and Mac's 800 GB/s is competitive with H100's 3.35 TB/s when normalized for power.
  • 2Believing MLX is a drop-in replacement for CUDA, MLX lacks production features like PagedAttention, FlashAttention-3, and multi-node support, making it unsuitable for serving.
  • 3Thinking that unified memory eliminates all data movement, the CPU and GPU share bandwidth, and heavy inference can starve the rest of the system, causing UI lag.
  • 4Overlooking the cost of quantization overhead on Metal, MLX's lack of INT4 tensor cores means dequantization eats into performance, especially for large models.
  • 5Assuming Strix Halo will match Mac perf out of the box, the software stack for AMD unified memory is 1-2 years behind Apple's MLX.
References

Further reading

Affiliate disclosure: Hardware references in this article may link to Amazon via our Associate tag fredoline-20. As an Amazon Associate, MyAIHardware.com earns from qualifying purchases at no extra cost to you. Citations and primary sources (papers, vendor docs, repos) are non-affiliate. See About / disclosures for the full policy.

Stay Ahead of the AI Curve

Get weekly AI hardware news, benchmark updates, and deals in your inbox. Founding-subscriber list, be one of the first.

&check; No spam&check; Weekly digest&check; Unsubscribe anytime