PyTorch 2.15 Turns Your Mac Into a Real ML Rig
Faster MoE decoding, FP8 weights, and a fix for a silent image-corruption bug that plagued Apple Silicon users for months.
By The ai-compute Desk

PyTorch 2.15 lands with a stack of MPS improvements that change what an Apple Silicon Mac can do for local AI work. Mixture-of-experts models now decode 5–6.5× faster than in 2.14: on an M3 Ultra with torch.compile, Qwen3.6-35B-A3B goes from 9.4 to 61.3 tokens/s. [1]
The gains come from replacing MPSGraph operations with dedicated Metal kernels. Dense LLMs benefit from matrix-vector paths wired directly into F.linear, and softmax over the vocabulary is now about 8× faster. Video generation sees the most dramatic memory reduction: Wan2.2's tiled VAE decode used to push driver memory to 270 GiB and now peaks at about 8 GiB. [1]
The release also patches a silent corruption bug that had been destroying Qwen-Image-2.1 image edits on Apple Silicon. The VAE encoder's encode→decode round-trip returned 10.06 dB PSNR on MPS — flat regions filled with broadband noise, edges embossed, and the palette shifted to a desaturated olive — while the fixed workflow now matches CPU at 29.95 dB PSNR. No error or warning was emitted, so users blamed their prompts. [1][2]
The root cause was an MPSGraph padding defect in AvgDown3D: F.pad zeroed out an entire rank-five tensor on the GPU. Replacing it with torch.cat reduced reconstruction MAE from 0.285301 to 1.77e-7. The fix ships in PyTorch 2.15; in the meantime, --cpu-vae remains a working workaround. [1][2]
The pattern here is one of methodical ground-up work: identify the real bottleneck, rewrite it closer to the metal, ship the numbers. That discipline — rather than feature announcements — is what quietly makes a platform worth trusting.
FP8 tensor support also arrives in 2.15, storing values in half the memory of BF16, with scaled matrix multiplication running directly on the GPU. PyTorch 2.16 is already in progress, with attention moving entirely onto Metal and libtorch_cpu.dylib shrinking by about 25%, from 384 MiB to 287 MiB. [1]
At the start of 2026, running even small models on MPS often meant working around unsupported operations, performance cliffs and unexpected memory growth.PyTorch team at Hugging Face