AISubHub/Noticias de IA
Desarrolladores

Análisis en profundidad · Unos 8 min de lectura

PyTorch MPS: decodificación, corrección y memoria del controlador requieren mediciones separadas

El equipo de PyTorch de Hugging Face explica los cambios de MPS para la candidata 2.15, con evidencias distintas sobre decodificación agrupada, almacenamiento FP8, relleno y trabajo futuro de 2.16.

Publicado aquí
Fecha de la fuente
Fuente revisada

Un artículo técnico del 20 de octubre, escrito por colaboradores de PyTorch en Hugging Face, explica cómo los kernels Metal dedicados modifican el trabajo del backend MPS en Apple silicon. Ofrece una vía de instalación de la candidata a lanzamiento de PyTorch 2.15 y un adelanto separado de 2.16. Su aportación útil es identificar cuellos de botella y mediciones concretas, no una aceleración aplicable a todas las cargas de un Mac.

Escucha las noticias

Escucha este artículo o continúa con las noticias.

PyTorch MPS: decodificación, corrección y memoria del controlador requieren mediciones separadas

Preparando la lectura…

Voz del dispositivo

El navegador o dispositivo procesa la voz. AISubHub no envía el texto a una API de audio. Las voces y la reproducción con pantalla bloqueada dependen del dispositivo.

Al continuar puede repetirse una frase breve.

Resumen

  • El entorno documentado requiere Apple silicon, macOS 15 o posterior y Python 3.11 o posterior. El artículo presenta 2.15 como candidata a lanzamiento y separa el trabajo de 2.16 disponible en versiones nightly o aún en revisión.
  • Una especialización de decodificación para multiplicación matricial agrupada alcanza alrededor de 1.3 veces el rendimiento en los experimentos mostrados con M3 Ultra y torch.compile. Otro gráfico de softmax mide microsegundos de una sola operación, no la latencia de una respuesta completa.
  • En una decodificación VAE de Wan2.2 con 28 teselas, el pico de memoria total del controlador comunicado baja de 270.135 a 8.108 GiB, mientras el pico reservado por el asignador sigue en 8.070 GiB. Son métricas de memoria diferentes.

1. Primero, la versión y la parte de la ejecución que cambia

Los autores se presentan como el equipo de PyTorch de Hugging Face, que trabaja en el proyecto de origen con mantenedores y colaboradores de PyTorch. Su explicación se centra en sustituir determinadas rutas de MPSGraph por kernels Metal dedicados. Es ingeniería del backend: los modelos pueden beneficiarse sin convertirse en nuevos lanzamientos de modelos, y un kernel más rápido no demuestra mejores respuestas. La configuración indicada exige un Mac con Apple silicon, macOS 15 o posterior y Python 3.11 o posterior.

El artículo invita expresamente a probar una candidata 2.15 en un entorno separado. Más adelante trata cambios de 2.16 que pueden estar en versiones nightly o seguir en revisión. AISubHub no ha comprobado de forma independiente el estado de posteriores versiones estables. Para una comparación reproducible, hay que anotar la compilación exacta, el dispositivo, el dtype, la configuración del compilador y la carga antes de pasar de una sección a otra. De lo contrario, una optimización futura puede confundirse fácilmente con una función de la versión probada.

2. La especialización de decodificación cambia una operación pequeña y repetida

Durante el prellenado, un modelo procesa un bloque de entrada; durante la decodificación procesa repetidamente una entrada pequeña para obtener el siguiente token. El artículo conecta F.linear con kernels existentes de multiplicación matriz-vector y con la fusión de sumas de sesgo cuando son compatibles. En 96 formas de capas BF16, comunica una aceleración de media geométrica de 1.23 veces. Las proyecciones pequeñas ganan más, mientras las capas grandes ya cercanas al límite de ancho de banda se mantienen cerca de una vez. Es un conjunto de mediciones por capa, no un promedio del modelo completo.

Para la ejecución de mezclas de expertos, la multiplicación matricial agrupada nativa lee los desplazamientos de grupo en la GPU, en lugar de copiarlos a la CPU y recorrer los grupos. El gráfico de especialización de decodificación utiliza un M3 Ultra con torch.compile: Qwen3.6-35B-A3B pasa de 38.7 a 51.7 tokens por segundo con contexto 512, y de 36.8 a 48.7 con contexto 2048. Por separado, el artículo comunica comparaciones mayores entre versiones completas frente a 2.14. Estas comparaciones, la comparación de kernel de aproximadamente 1.3 veces y las mediciones posteriores de 2.16 tienen bases diferentes; no deben combinarse ni multiplicarse.

3. El almacenamiento FP8 y el tiempo de softmax responden a preguntas distintas

La incorporación de FP8 consiste en admitir tensores torch.float8_e4m3fn, con un byte por valor frente a dos en FP16 o BF16. F.scaled_mm admite escalado por tensor y por fila. Esto puede reducir el espacio ocupado por los tensores compatibles, pero no divide por dos la memoria de una aplicación completa: siguen existiendo otros tensores, búferes de trabajo y asignaciones del entorno de ejecución. La cuantización del ejemplo y el dtype de salida también importan para el comportamiento numérico. El artículo presenta la multiplicación matricial FP8 nativa como base de futuro trabajo con shaders Metal; por tanto, el soporte actual de almacenamiento no equivale a una afirmación universal de velocidad del hardware.

El gráfico de softmax es otro experimento. Para una fila de logits FP32 con vocabulario de 128,256 elementos, muestra 57.4 microsegundos con MPSGraph y 7.1 con el kernel Metal; el texto los redondea a 57 y 7. Un softmax aproximadamente ocho veces más rápido puede acortar un paso del muestreo de tokens, pero el resto del trabajo sigue determinando el tiempo total de generación. Análisis de AISubHub: medir el recorrido completo además de la operación costosa y conservar las unidades, para que los microsegundos por llamada no se conviertan en una afirmación infundada sobre segundos por respuesta.

4. El relleno revela memoria fuera del asignador de tensores

El ejemplo de Wan2.2 corresponde específicamente a Wan-AI/Wan2.2-TI2V-5B-Diffusers y realiza 8,764 llamadas de relleno constante en una decodificación VAE de 28 teselas. Pasar el relleno a Metal cambia el pico comunicado de memoria total del controlador de 270.135 a 8.108 GiB. Sin embargo, el pico reservado por el asignador es de 8.070 GiB en ambas configuraciones, y el pico de asignación actual de tensores solo cambia de 4.422 a 4.095 GiB. Una métrica del asignador por sí sola ocultaría la mayor parte de este problema concreto. El resultado no significa que todos los modelos de vídeo necesiten ahora solo ocho GiB.

La corrección es un beneficio distinto. En un recorrido de codificación y decodificación del VAE de Qwen-Image-2.1, los autores comunican que la concordancia con la referencia de CPU pasa de 10.06 a 29.95 dB de PSNR tras corregir el relleno. Se refiere al flujo de reconstrucción probado, no a una puntuación general de calidad de generación de imágenes. Otros cambios enumerados incluyen álgebra lineal de valores complejos, rutas de cálculo hacia atrás y broadcasting de atención. Por eso, una comprobación útil de actualización debe incluir salidas numéricas y pico de memoria del controlador junto al rendimiento, usando el mismo modelo y las mismas formas de operación.

5. Mantener visibles el trabajo futuro y la validación local

El adelanto de 2.16 incluye cambios en el envío de búferes de comandos, atención ejecutada íntegramente en Metal y más migraciones desde MPSGraph. Los autores advierten que parte del trabajo sigue en revisión. Sus ejemplos futuros de atención también usan un M5 Pro y dimensiones de cabeza concretas, a diferencia del gráfico de decodificación en M3 Ultra. Ni esas cifras ni la reducción de tamaño de una biblioteca incluida deben presentarse como un beneficio medido de instalar la candidata 2.15 en cualquier Mac.

Los streams públicos de MPS y el soporte de registro de streams de tensores dan más control de planificación a los programas Python, pero el ejemplo sigue sincronizando antes de leer el resultado. El artículo también enumera límites de operaciones pendientes y trabajo en curso para eliminar interrupciones del grafo de compilación. La interpretación práctica de AISubHub es probar un entorno separado con los dtype, formas, sincronización y tolerancias de salida reales de la aplicación. Leímos el artículo completo y sus tres gráficos; no instalamos PyTorch, ejecutamos sus ejemplos, inspeccionamos los pull requests enlazados ni reprodujimos resultados de tiempo, calidad o memoria.

Por qué importa

Análisis de AISubHub: las actualizaciones del backend deben evaluarse con registros separados del rendimiento de decodificación completo, tiempos de operaciones, corrección de las salidas y picos de memoria del controlador. Así se identifica qué cambio comunicado coincide con un cuello de botella real sin convertir un resultado de kernel en una afirmación universal sobre modelos.

Límites y disponibilidad

Todas las mediciones se atribuyen a los colaboradores de PyTorch de Hugging Face y a sus configuraciones indicadas. El artículo describe una candidata 2.15 y distingue el trabajo de 2.16; no se comprobó de forma independiente la disponibilidad estable posterior. AISubHub no instaló ni ejecutó el software, reprodujo benchmarks o inspeccionó las implementaciones enlazadas. De ello no se desprende ninguna garantía universal de velocidad, encaje en memoria o calidad numérica.

Fuentes y pruebas

Hugging Face PyTorch team: MPS in PyTorch 2.15

Fecha de la fuente: · Fuente revisada:

Contenido editorial asistido por IA y contrastado con fuentes primarias. Las afirmaciones del proveedor se atribuyen; la inclusión no implica recomendación.