PyTorch 2.15: LLM en Mac 6,5× más rápido con MPS

Un modelo de mezcla de expertos (MoE) de 35.000 millones de parámetros pasó de generar 9,4 a 61,3 tokens por segundo en un Mac con M3 Ultra. No cambió el hardware: cambió el software. PyTorch 2.15 llega con una reescritura profunda del backend MPS que el equipo de PyTorch de Hugging Face desarrolló junto a los mantenedores del framework, y el resultado es que un Mac con Apple Silicon deja de ser un banco de pruebas y empieza a parecerse a una estación de inferencia real.

Qué cambia en PyTorch 2.15 para los Mac con Apple Silicon

El backend MPS es la capa que permite a PyTorch usar la GPU de un Mac. Hasta ahora, buena parte de las operaciones pasaban por MPSGraph, la API de Apple, con dos consecuencias conocidas por cualquiera que haya entrenado o inferido en local: operaciones no soportadas que obligaban a hacer rodeos, caídas de rendimiento en ciertos tamaños de tensor y un crecimiento de memoria difícil de explicar.

La estrategia de 2.15 es reemplazar MPSGraph por kernels de Metal dedicados en las operaciones que más pesan. El equipo probó modelos reales del Hub de Hugging Face en lenguaje, imagen y video, encontró dónde fallaba MPS y lo arregló aguas arriba en PyTorch.

Leíste lo que hace la IA. ¿Y en tu negocio?

En CAR, dueños de empresa arman en 7 días su primer sistema funcionando: que ningún cliente se les escape, o que el informe del lunes salga solo. Con otros emprendedores al lado.

👥 Probar 7 días

Dos requisitos cambian: MPS ahora pide macOS 15 o superior y PyTorch 2.15 requiere Python 3.11 o superior. Si el sistema operativo es viejo o no hay GPU Metal disponible, la comprobación de disponibilidad de MPS ahora explica el motivo en lugar de fallar en silencio.

MoE y decodificación: de 9,4 a 61,3 tokens por segundo

Todo modelo de lenguaje tiene dos fases: prefill y decode. En decode, cada token nuevo atraviesa el modelo como una sola fila, así que las grandes multiplicaciones de matrices se convierten en productos matriz-vector. Ahí es donde 2.15 mueve la aguja.

  • F.linear ahora usa los kernels GEMV que ya existían para torch.mm desde 2.14. Sobre 96 formas de capa BF16 de modelos reales, la mejora es de 1,23× en media geométrica, con las ganancias más grandes en proyecciones pequeñas como las compuertas de los modelos MoE.
  • Grouped matmul tiene implementación nativa en MPS. Antes los offsets de grupo se copiaban a la CPU y se iteraba grupo por grupo; ahora los kernels de Metal leen los offsets directamente en la GPU, con un kernel propio para grupos pequeños, que es el caso típico durante la decodificación.
  • Softmax y log_softmax corren en kernels de Metal. Un softmax FP32 sobre una fila de logits de [1, 128256] baja de 57 µs a 7 µs, unas 8 veces más rápido.

El resultado agregado en un M3 Ultra con torch.compile: los modelos MoE generan entre 5 y 6,5 veces más tokens por segundo que en 2.14. Qwen3.6-35B-A3B pasa de 9,4 a 61,3 tokens/s y LFM2.5-8B-A1B de 23,6 a 123,6 tokens/s. Los modelos densos también se benefician, aunque menos.

FP8 en el Mac: la mitad de memoria para los mismos pesos

PyTorch 2.15 añade tensores torch.float8e4m3fn en MPS: un byte por valor, la mitad del almacenamiento de FP16 o BF16. Se multiplican con F.scaledmm, que soporta escalado por tensor (tensorwise) y por fila (rowwise).

Para quien corre modelos que apenas entran en la memoria unificada de su Mac, esta es la palanca más directa: cuantizar los pesos a FP8 libera memoria sin tocar el resto del pipeline. El blog incluye un ejemplo completo de cuantización con una escala por tensor y salida en bfloat16.

Video e imagen: el bug que rompía las ediciones en ComfyUI

Dos resultados de esta versión importan a quien genera video o edita imágenes en local.

El primero es de memoria. La decodificación del VAE de Wan2.2 hacía 8.764 llamadas de padding en un decode completo de 28 tiles, y el padding pasaba por MPSGraph. Con el padding movido a Metal, el pico de memoria del driver cae de 270 GiB a 8 GiB. El pico de asignación de tensores apenas cambia (de 4,422 a 4,095 GiB): lo que se desploma es la memoria que el driver reservaba por el camino.

El segundo es de corrección, y es más grave. En 2.14, el encoder VAE de Qwen-Image-2.1 corrompía imágenes en MPS de forma silenciosa, lo que rompía los flujos de edición de imagen reportados en ComfyUI. El mismo cambio de padding lo arregla: un ciclo encode-decode ahora coincide con CPU a 29,95 dB de PSNR, frente a los 10,06 dB anteriores.

Álgebra lineal, audio y control desde Python

La lista de operaciones que se mueven a Metal es larga:

  • Álgebra lineal compleja: factorización LU, LU solve y triangular solve para complex64 corren en MPS, lo que habilita determinantes complejos y sus gradientes.
  • Matrices pequeñas: lotes de matrices FP32 de hasta 4×4 se invierten en un único kernel de Metal que combina factorización y resolución, útil para geometría de cámara y transformaciones de imagen.
  • QR usa actualizaciones por bloques y los triangular solves convierten buena parte de su trabajo en multiplicaciones de matrices.
  • Audio y video: conv1d forward tiene kernels especializados, el padding por reflexión y replicación pasa a Metal y corrige el backward, y el backward de upsampling usa un kernel de gather.
  • Control: torch.mps.Stream y el context manager torch.mps.stream permiten elegir en qué stream corre el trabajo desde Python, con Tensor.record_stream para que el asignador siga el uso de un tensor en otro stream.

También se suman torch.frexp, torch.logspace, torch.take y Tensor.put, torch.heaviside, torch.special.laguerrepolynomial_l y las comparaciones de enteros sin signo. Y hay un arreglo de corrección en la implementación matemática de scaled dot-product attention, que ahora maneja bien el broadcasting de batch y heads.

¿Qué significa esto para tu startup?

Si tu equipo corre inferencia o fine-tuning en Macs, 2.15 cambia el cálculo de costo por token local. Tres movimientos concretos:

  • Mide antes de decidir. Instala la release candidate en un entorno separado con uv pip install torch==2.15.0 --index-url https://download.pytorch.org/whl/test/cpu y compara tokens/s de tu propio modelo contra tu versión actual. Los números del blog son de M3 Ultra; tu cuello de botella puede ser otro.
  • Revisa el parque de máquinas. macOS 15 y Python 3.11 son requisitos duros. Si tienes Macs con sistemas anteriores en el equipo de ML, esa actualización entra en el plan del trimestre.
  • Prueba FP8 si la memoria es tu límite. Si tus modelos entran justos en la memoria unificada, cuantizar pesos a FP8 con F.scaled_mm puede ser la diferencia entre correr en local o pagar GPU en la nube.

Vale la pena mirar el contexto de hardware: según TechRepublic, el Mac Studio con M5 Ultra se puede configurar con hasta 512 GB de memoria unificada y 1,2 TB/s de ancho de banda, con precios desde US$2.499 en la versión M5 Max y US$5.499 en la M5 Ultra. Ese es el otro extremo de la ecuación: si el software ya no es el freno, la decisión entre local y nube se vuelve una cuenta de amortización.

Lo que viene en PyTorch 2.16

Parte del trabajo de 2.16 ya está en los nightlies. Lo más relevante:

  • Atención completamente en Metal. Scaled dot-product attention deja MPSGraph por completo. En un M5 Pro, la decodificación con grouped-query attention (32 heads de query, 8 de KV, head dim 80, contexto de 4K) baja de 465 µs a 65 µs, y un prefill de 4K × 4K con head dim 40 pasa de 42 ms a 6 ms.
  • Command buffer cada 16 kernels. Cuando el camino de decode ya no tiene operaciones de MPSGraph, la GPU esperaba a que la CPU terminara de codificar todos los kernels. Con el cambio, en decodificación BF16 compilada a contexto de 2048 tokens, LFM2.5-8B-A1B pasa de 108,8 a 126,0 tokens/s (+16%), Qwen3.6-35B-A3B de 52,9 a 62,8 (+19%) y Qwen3.8-27B de 12,1 a 12,6 (+4%).
  • Binarios más chicos. Los shaders se compilan para Metal 3.1 por defecto, lo que reduce libtorch_cpu.dylib de 384 MiB a 287 MiB, un 25% menos.

Conclusión

PyTorch 2.15 no es una actualización de mantenimiento: es el punto en el que el backend MPS deja de ser una capa de compatibilidad y empieza a tener kernels propios donde importa. Para un founder, la lectura es simple: la inferencia local en Mac acaba de volverse entre 5 y 6,5 veces más rápida en los modelos que más se usan hoy, con FP8 como palanca extra de memoria y un bug de corrupción de imagen resuelto. Si tu roadmap asumía que el Mac era solo para prototipar, vale la pena volver a hacer esa cuenta.

Fuentes

Leíste lo que hace la IA. ¿Y en tu negocio?

En CAR, dueños de empresa arman en 7 días su primer sistema funcionando: que ningún cliente se les escape, o que el informe del lunes salga solo. Con otros emprendedores al lado.

👥 Probar 7 días

Daily Shot: Tu ventaja táctica

Lo que pasó en las últimas 24 horas, resumido para que tú no tengas que filtrarlo.

Suscríbete para recibir cada mañana la curaduría definitiva del ecosistema startup e inversionista. Sin ruido ni rodeos, solo la información estratégica que necesitas para avanzar:

  • Venture Capital & Inversiones: Rondas, fondos y movimientos de capital.
  • IA & Tecnología: Tendencias, Web3 y herramientas de automatización.
  • Modelos de Negocio: Actualidad en SaaS, Fintech y Cripto.
  • Propósito: Erradicar el estancamiento informativo dándote claridad desde tu primer café.

📡 El Daily Shot Startupero

Noticias del ecosistema startup en 2 minutos. Gratis, todos los días.

Share to...