View in English

  • Global Nav Open Menu Global Nav Close Menu
  • Apple Developer
Search
Cancel
  • Apple Developer
  • News
  • Discover
  • Design
  • Develop
  • Distribute
  • Support
  • Account
Only search within “”

Quick Links

5 Quick Links

Videos

Abrir menú Cerrar menú
  • Colecciones
  • Temas
  • Todos los videos
  • Información

Volver a WWDC25

  • Información
  • Resumen
  • Transcripción
  • Código
  • Combina el aprendizaje automático y los gráficos de Metal 4

    Aprende a combinar sin problemas el aprendizaje automático en tus apps gráficas con Metal 4. Presentaremos el recurso tensorial y el codificador de aprendizaje automático para ejecutar modelos en la línea de tiempo del GPU junto con su trabajo de renderizado y computacional. Descubre cómo el shader de aprendizaje automático te permite integrar redes neuronales directamente para obtener efectos avanzados y mejoras en el rendimiento. También mostraremos nuevas herramientas de depuración para cargas de trabajo de aprendizaje automático de Metal 4 en acción con una app de ejemplo.

    Capítulos

    • 0:00 - Introducción
    • 2:52 - Conoce los tensores
    • 6:21 - Codifica redes de aprendizaje automático
    • 12:51 - Incorpora el aprendizaje automático en tu shader
    • 20:26 - Depura tus cargas de trabajo de aprendizaje automático

    Recursos

    • Customizing a PyTorch operation
    • Metal Developer Resources
    • Metal Performance Shaders
      • Video HD
      • Video SD

    Videos relacionados

    WWDC25

    • Descubrir Metal 4
    • Explorar juegos de Metal 4
    • Novedades del renderizado de Metal para apps inmersivas
    • Ve más allá con los juegos de Metal 4

    WWDC24

    • Accelerate machine learning with Metal
    • Train your machine learning and AI models on Apple GPUs
  • Buscar este video…

    Hola. Hola. Soy Preston Provins, ingeniero del equipo Metal Framework de Apple. Luego se unirá mi compañero Scott. Hablaré de las novedades de Metal: el aprendizaje automático y los juegos. Scott presentará herramientas de GPU para mejorar la depuración del aprendizaje automático en Metal 4. Me emociona hablarles de cómo combinar el aprendizaje automático y los gráficos de Metal 4. ¿Quieres saber más de Metal 4? Revisa la charla sobre sus fundamentos para descubrir todas sus novedades. El aprendizaje automático, o AA, transforma juegos y gráficos con mejoras, compresión de activos, mezcla de animaciones y sombreado neuronal. Estas técnicas impulsan la creatividad y la inmersión. Simulan fenómenos complejos, mejoran la fidelidad visual y agilizan la exploración de nuevos estilos y efectos. CoreML es genial para una amplia gama de tareas de AA, como segmentación, clasificación, IA generativa y más. Facilita la creación de modelos de AA. Si necesitas una estrecha integración de tu app de AA con la línea de tiempo de GPU, Metal 4 es la solución. En un cuadro típico, un juego puede personalizar vértices, rasterizar la escena y aplicar antialiazing en distintos procesos de cálculo o renderizado. El antialiazing suele hacerse con técnicas de procesamiento de imágenes, como el antialiazing temporal. Las técnicas más modernas sustituyen estos métodos tradicionales por una red de AA. Esta red optimiza la calidad de imagen, permitiendo una renderización en menor resolución y mejor rendimiento.

    También es cada vez más común ejecutar pequeñas redes neuronales en un sombreador. Por ejemplo, un sombreador de fragmentos tradicional usaría texturas, pero nuevas técnicas emplean pequeñas redes neuronales para descomprimirlas al instante, logrando mayor compresión. Esta técnica de renderizado neuronal comprime materiales al 50% del espacio de compresión en bloque. En esta sesión, hablaremos de MTLTensors, el nuevo recurso de Metal 4 para flujos de trabajo de AA. Conoceremos el nuevo MTL4MachineLearningCommandEncoder, que ejecuta redes enteras en la línea de tiempo de GPU junto con otros sorteos y envíos. Presentaremos Shader ML, que permite incrustar operaciones de AA en los propios sombreadores. Por último, te enseñaremos cómo puedes integrar ML a la perfección en tu app con Metal Debugger. Ya conoces MTLBuffers y MTLTextures. Este año, Metal 4 presenta MTLTensor, un nuevo recurso que permite aplicar AA a los datos con una facilidad sin precedentes. Este es un tipo de datos de aprendizaje automático fundamental que se puede usar para contextos de cálculo, gráficos y AA. Las cargas de trabajo de AA usan MTLTensors de forma extensiva. MTL4MachineLearningCommandEncoder usa MTLTensors para representar entradas y salidas, y Shader ML los usa para representar pesos, entradas y salidas.

    Los MTLTensors son contenedores de datos multidimensionales, descritos por rango y número de dimensiones. Su extensión de más allá de dos dimensiones permite flexibilidad para cualquier disposición de datos de AA práctica. Las MTLTextures, por ejemplo, tienen un máximo de cuatro canales y límites estrictos de extensión según su formato. En el AA, es común usar datos que tienen más de dos dimensiones, como las operaciones de convolución. Usar una representación plana de datos como MTLBuffer exigiría complicados esquemas de indexación para datos con múltiples dimensiones. Esta indexación en un MTLTensor es mucho más sencilla porque el paso y la dimensión de cada rango están integrados en el objeto y se usan automáticamente en los cálculos de indexación. Veamos el proceso de crear un MTLTensor. El rango describe cuántos ejes tiene. Este tiene un rango de dos. Contiene filas de columnas de datos. La extensión de la dimensión describe cuántos puntos de datos hay en ese eje. La propiedad dataType define qué formato de datos contiene el MTLTensor. Las propiedades de uso indican cómo se usará el MTLTensor. MachineLearning para CommandEncoder, Compute o Render para su uso dentro de los programas de sombreado. También es posible combinar usos como la propiedad Usage para texturas. Esas son las propiedades importantes del MTLTensor que se deben llenar en un objeto MTLTensorDescriptor. Ahora, hagamos uno en código. Una vez llenas las propiedades de MTLTensorDescriptor, crea un nuevo MTLTensor colocando newTensorWithDescriptor:offset:error: en un objeto MTLDevice. Los MTLTensors se crean desde MTLDevice o MTLBuffer, sin embargo, los creados a partir de MTLDevice ofrecen mejor rendimiento. Así como con las MTLTextures, crear un MTLTensor desde MTLDevice resulta en un diseño opaco optimizado para lectura y escritura. Bien, centrémonos en crear MTLTensors a partir de un MTLBuffer preexistente. A diferencia de los MTLTensors de MTLDevice, los de MTLBuffer no se supone que estén bien empaquetados, por lo que es necesario especificar sus strides. El stride más interno siempre debe ser uno. El segundo stride indica cuántos elementos se saltan cuando se incrementa el índice de fila.

    Es posible que el MTLBuffer de origen contenga relleno, como columnas sin usar al final de la fila. Se debe tener en cuenta el relleno para que MTLTensor envuelva los elementos correctos. Para crear un MTLTensor a partir del búfer subyacente, configura dataType y Usage como lo harías para uno creado a partir de MLTDevice. Luego, configura strides del MTLTensorDescriptor para que el MTLTensor resultante ajuste apropiadamente el contenido del MTLBuffer. Por último, usa newTensorWithDescriptor:offset:error: en el MTLBuffer de origen. Como ya sabemos asignar y crear MTLTensors, exploremos el nuevo codificador de AA para agregar trabajo de ML a la línea de tiempo de GPU. Metal 4 facilita agregar comandos de cálculo y renderizado a la línea de tiempo de GPU, con MTL4ComputeCommandEncoder y MTL4RenderCommandEncoder, respectivamente. Este año, unificamos más: ¡agregamos tareas de aprendizaje automático a la línea de tiempo GPU! MTL4MachineLearningCommandEncoder permite que modelos completos se ejecuten y sincronicen con otros comandos de Metal en el GPU, garantizando así una integración fluida. Es un nuevo codificador de AA con una interfaz similar a los codificadores de computación y renderizado. Las primitivas de sincronización de Metal 4 funcionan con comandos de AA, computación y renderizado. La sincronización controla la coordinación del trabajo y facilita la paralelización para alto rendimiento. El flujo de trabajo de MTL4MachineLearningCommandEncoder tiene dos partes: fuera de línea y ejecución. La parte fuera de línea del flujo de trabajo ocurre antes de iniciar la app, la ejecución, durante su vida útil, como en medio de un fotograma. Comencemos con la parte fuera de línea: la creación de un MTLPackage. Un MTLPackage es un contenedor de funciones que representan redes ML, usadas en Metal para ejecutar tareas de aprendizaje automático. Está optimizado para la carga y ejecución con Metal. Para crear un MTLPackage, necesitas tener un paquete CoreML. Aquí usamos el convertidor CoreML para convertir la estructura ML en la que se creó la red, como PyTorch o Tensorflow, en un paquete CoreML. Este es un ejemplo de exportación de un modelo PyTorch con la biblioteca CoreML Tools en Python. Solo debes importar las herramientas y ejecutar convert en el modelo para exportarlo. Por último, guárdala como un MLPackage. Hay algo que me gustaría destacar aquí: no todos los paquetes CoreML son programas AA y solo se admiten programas AA. Si tu paquete CoreML se exportó a un SO anterior, consulta este artículo para saber cómo exportar esos modelos como MLPackage. Una vez creado el paquete, basta con ejecutar la línea de comandos metal-package-builder en el modelo guardado para generar un MTLPackage. Esto convierte el paquete CoreML a un formato eficiente para cargar en ejecución. Eso es todo para crear un MTLPackage. La parte fuera de línea del flujo de trabajo está completa, el resto es en tiempo de ejecución. Para compilar la red, primero abre MTLPackage como MTLLibrary. Crea un functionDescriptor usando el nombre de la función que representa la red en el paquete. En este caso, la función principal. Para compilar la red, crea un MTL4MachineLearningPipelineState. Esto se hace usando un MTL4MachineLearningPipelineStateDescriptor con el descriptor de función. Si la red tiene entradas dinámicas, especifica el tamaño de cada una en MTL4MachineLearningPipelineStateDescriptor. Compila la red para el dispositivo específico creando MTL4MachineLearningPipelineState con el Descriptor.

    Así se crea un objeto MTL4MachineLearningPipelineState. El siguiente paso es crear MTL4MachineLearningCommandEncoder y realizar el trabajo de codificación. Analicemos el uso del MTL4MachineLearningCommandEncoder para distribuir trabajo en la línea de tiempo de GPU. Solo crea el MTL4MachineLearningCommandEncoder, tal como creas un codificador para calcular o renderizar. Configura el MTL4MachineLearningPipelineState creado y vincula las entradas y salidas que se usarán. Por último, envía el trabajo con el método dispatchNetworkWithIntermediatesHeap.

    El codificador de aprendizaje automático usa ese método para almacenar datos intermedios entre operaciones y, en vez de crear y liberar búferes, permite reusar de recursos en diferentes envíos. Para crear este MTLHeap, crea un MTLHeapDescriptor y configura type en MTLHeapTypePlacement. Puedes obtener el tamaño de memoria dinámica mínimo para la red revisando el intermediateHeapSize del proceso y configura size para que sea mayor o igual a ese. Después de codificar los envíos de tu red, finaliza la codificación y envía tus comandos para ejecutarlos en la línea de tiempo de GPU.

    Como mencionamos, las primitivas de sincronización de Metal4 funcionan con comandos de AA, computación y renderizado. El trabajo que no depende de la salida del AA puede realizarse en paralelo si se sincroniza correctamente.

    Solo el trabajo que consume la salida de la red debe esperar a que concluya el trabajo de AA programado.

    Para sincronizar los envíos de MTL4MachineLearningCommandEncoder, puedes usar primitivas de sincronización estándar de Metal 4, como MTLBarriers y MTLFences. El nuevo MTLStageMachineLearning se usa para identificar cargas de trabajo de AA en barreras. Por ejemplo, para hacer que tu renderizado espere las salidas producidas por una red, podrías usar una barrera entre la etapa de renderizado adecuada y la etapa de AA. Veamos MTL4MachineLearningCommandEncoder en acción. En este ejemplo, se usa para enviar una red completamente convolucional para predecir valores de oclusión por pixel. Evaluar esto requiere una sincronización cuidadosa. El búfer de profundidad y las normales del espacio de visualización se completan antes de iniciar la carga de trabajo de ML. Mientras la red procesa los datos, el renderizador envía otras tareas relacionadas con el renderizado en paralelo y espera los resultados neuronales antes de componer el fotograma final. El MTL4MachineLearningCommandEncoder no solo procesa información de fotogramas completos para juegos. Puede usarse para cualquier red que encaje en un presupuesto de tiempo real, aprovechando las primitivas de sincronización de Metal 4 para una mejor integración. Así MTL4MachineLearningCommandEncoder de Metal 4 facilita la ejecución de grandes cargas de trabajo de AA en la línea de tiempo de GPU. En resumen: El AA se une al cálculo y al renderizado en Metal 4 a través de MTL4MachineLearningCommandEncoder. MTL4MachineLearningCommandEncoder permite que redes enteras se ejecuten en la línea de tiempo de GPU. Los recursos son compartibles con otros comandos de GPU y las primitivas de sincronización de Metal 4 permiten capacidades de AA de alto rendimiento. Metal 4 también presenta Shader ML para integrar operaciones de AA más pequeñas dentro de tus núcleos y sombreadores existentes. Los juegos más modernos adoptan el AA para reemplazar los algoritmos de renderizado tradicionales. Las técnicas basadas en AA pueden ofrecer soluciones para iluminación global, sombreado de materiales, compresión de geometría, compresión de materiales y más. Estas a menudo pueden mejorar el rendimiento o reducir el uso de memoria. Como ejemplo, la compresión de material neuronal, una técnica que permite hasta un 50% de compresión frente a formatos comprimidos en bloque. Con materiales tradicionales, se toman muestras de texturas de materiales, como mapas de albedo y normales. Luego usas los valores muestreados para realizar el sombreado. Con la compresión de material neuronal, tomarás muestras de datos de textura latente, realizarás inferencias usando los valores muestreados y usarás la salida de la red para realizar el sombreado.

    Dividir cada paso es ineficaz, requiere sincronizar tensores con la memoria del dispositivo, operar y sincronizar las salidas para operaciones posteriores.

    Para obtener el mejor rendimiento, tu app debe combinar estos pasos en un único envío de sombreador. Con Shader ML, Metal te permite ejecutar tu red ML dentro de tu sombreador de fragmentos, sin tener que revisar la memoria del dispositivo entre pasos. Puedes inicializar tensores de entrada, ejecutar tu red y sombrear solo los pixeles necesarios en cada fotograma. Esto mejora el uso de memoria en tiempo de ejecución y el espacio en disco de tu juego. Veamos la evaluación del material neuronal con más detalle. La inicialización de los MTLTensors de entrada se puede dividir en dos partes: cargar los pesos de la red y construir la funcionalidad de entrada. La funcionalidad de entrada MTLTensor se crea muestreando texturas enlazadas con una coordenada UV para el fragmento.

    La inferencia es donde la característica de entrada se transforma mediante matrices de peso aprendidas para extraer características, calcular activaciones y propagar información a través de capas. Esta evaluación se repite para múltiples capas y el resultado es un material descomprimido. Por último, los materiales descomprimidos se usan para los cálculos de sombreado del fragmento.

    Veamos cómo inicializar los MTLTensors de entrada con Shader ML. Primero, declaremos un sombreador de fragmentos que usará Shader ML y pasará pesos de red. Comienza incluyendo el nuevo encabezado metal_tensor. Usaremos el tipo MTLTensor para acceder a los pesos de la red. Los MTLTensors están vinculados al sombreador mediante ranuras de vinculación de búfer. También es posible pasarlos usando búferes de argumentos. El tipo MTLTensor está basado en plantillas. El primer argumento de plantilla es el dataType. Estos MTLTensors se crearon en la memoria del dispositivo, por lo que usamos el calificador de espacio de dirección del dispositivo. El segundo argumento representa las dimensiones del MTLTensor y el tipo que se usará para la indexación en el MTLTensor. Aquí usamos dextents para definir un tensor de rango dos con extensiones dinámicas. Y así nuestro sombreador de fragmentos está configurado. Implementemos el algoritmo de compresión de material neuronal. Con los pesos de la red pasados, podemos crear el MTLTensor de entrada muestreando cuatro texturas latentes. Los MTLTensor no son solo un recurso que se puede vincular: también puedes crear MTLTensor en línea dentro de tus sombreadores. Crea un MTLTensor que envuelva los valores muestreados y úsalo para la evaluación de la red. Se supone que los MTLTensors en línea están empaquetados de forma compacta, por lo que no es necesario pasar strides al crearlos. Con esto, la inicialización de la entrada MTLTensors está completa y estamos listos para inferir valores de la red neuronal. La evaluación transforma las entradas usando parámetros aprendidos que luego se activan. Las activaciones pasan a capas posteriores y las de la capa final forman el material descomprimido.

    Este año, Metal presenta Metal Performance Primitives para hacer que las operaciones de MTLTensor sean accesibles en el lenguaje de sombreado. Esta biblioteca es un conjunto de API de alto rendimiento que permiten soluciones portátiles de alto rendimiento en MTLTensors. Proporciona operaciones de multiplicación y convolución de matrices. La multiplicación de matrices es el núcleo de la evaluación de redes neuronales. Usaremos la implementación de matmul2d de Metal Performance Primitives para implementar una rutina de evaluación de red portátil de rendimiento. Para comenzar, agrega el encabezado MetalPerformancePrimitives en tu sombreador Metal. Los parámetros de tu multiplicación de matrices se configuran usando matmul2d_descriptor. El primer conjunto de parámetros de plantilla especifica el tamaño del problema de la multiplicación de matrices. El siguiente controla si las entradas a la multiplicación de matrices deben transponerse al realizar la operación. Y el último controla tus requisitos de precisión.

    Además del descriptor, la operación matmul2d debe estar especializada con la cantidad de subprocesos que participarán en la operación. Aquí, ya que estamos en un sombreador de fragmentos, usaremos execution_thread para indicar que este hilo realizará la multiplicación de la matriz completa. Luego, ejecuta la multiplicación de matrices con esa configuración.

    Por último, activa cada elemento del resultado de la multiplicación de matrices con la función de activación ReLU. Este proceso se repite para la segunda capa para evaluar completamente nuestra red en nuestro sombreador. Una vez finalizada la evaluación, los materiales descomprimidos están disponibles para ser usados para sombrear. El MTLTensor de salida contiene información del canal que luego puede usarse como cualquier otro valor muestreado de una textura. Esta una demostración en tiempo real de la compresión de material neuronal en comparación con materiales tradicionales. No se ve ninguna pérdida de calidad al usar materiales neuronales, sobre todo cuando están sombreados. Este es el color base de forma aislada. Todavía es muy difícil notar diferencias entre los materiales neuronales y los tradicionales, sin embargo, los materiales neuronales usan la mitad de la memoria y ocupan la mitad del espacio en disco.

    Las operaciones de MTLTensor no son exclusivas de los sombreadores de fragmentos. Se pueden usar dentro de todas las funciones y todas las etapas del sombreador. Si un simdgroup o threadgroup completo va a realizar las mismas operaciones en los mismos datos, puedes aprovechar el hardware a tu favor eligiendo un grupo de ejecución más grande. Pero si tus operaciones de MTLTensor son divergentes con respecto a los datos o exhiben un flujo de control no uniforme en el sitio de llamada de la operación de MTLTensor, debes usar un solo grupo de ejecución de hilo. Otros esquemas de ejecución suponen que no hay divergencia y un flujo de control uniforme para el grupo de ejecución. En resumen, ahora puedes realizar operaciones ML como multiplicación de matrices y convolución en tus propios sombreadores. Shader ML facilita la realización de múltiples operaciones AA en un solo sombreador. Esto es amigable con el caché, requiere menos envíos y usa menos ancho de banda de memoria, sobre todo cuando usas redes más pequeñas. Además, Shader ML te brinda el control detallado que necesitas para crear operaciones personalizadas. Nunca fue tan fácil implementar técnicas de ML de vanguardia en tus apps de Metal. Y así es como puedes usar Shader ML para integrar redes neuronales en tu programa de sombreado. Ahora, hablemos con Scott para que muestre cómo las nuevas herramientas de depuración de Metal 4 hacen que depurar cargas de trabajo de AA sea muy fácil. Hola, soy Scott Moyers, ingeniero de software en el equipo de GPU Tools. Antes, Preston te mostró una app que usa el AA para calcular la oclusión ambiental. Esta codifica una red de AA directamente en su proceso de renderizado de Metal. Mientras ayudaba a desarrollar esta app, descubrí que la salida tenía algunos artefactos graves. Habilitaré solo el paso de oclusión ambiental para resaltar el problema que tuve. Debería haber sombras en las esquinas de los objetos, pero en cambio hay mucho ruido y la estructura de la escena apenas es visible. Te mostraré cómo usé las nuevas herramientas para solucionarlo. Primero, capturemos un rastro de GPU de la app en Xcode. Para hacer eso haré clic en el ícono de Metal en la parte inferior de la pantalla, luego en el botón de captura.

    Una vez que está lista, puedo encontrar el fotograma capturado disponible en el resumen. El navegador de depuración de la izquierda ofrece la lista de comandos que la app usó para construir el fotograma. Por ejemplo, el búfer de comandos fuera de pantalla contiene muchos codificadores, incluido el paso del búfer G. Y el siguiente contiene mi MTL4MachineLearningCommandEncoder. Usar Metal 4 me permitió tener un control preciso sobre la sincronización y, aunque fui cuidadoso al configurar barreras y eventos entre pases dependientes, me pregunté si un problema de sincronización podría estar causando estos problemas. Para comprobarlo, recurrí al Dependency Viewer, una herramienta útil para obtener una descripción general de la estructura de la app Metal. Haré clic en el ícono Dependencies en la parte superior izquierda.

    Con esta interfaz, puedo ver todos los comandos de la app junto con cualquier primitiva de sincronización, como barreras y eventos. Al ampliar el codificador de comandos se revelan aún más detalles. Aquí está la finalización de mi primer búfer de comando.

    El siguiente comando copia las normales en un MTLTensor. Luego hay una barrera seguida de un MTL4MachineLearningCommandEncoder. Volveré a alejar la imagen para poder revisar la estructura general. Mi nuevo pase de oclusión ambiental está en el búfer de comandos a la derecha. Antes de agregar este paso, la app funcionaba bien, por lo que puedo asumir que las dependencias dentro del búfer de comando superior e inferior son correctas. Veamos el nuevo búfer de comando que contiene MTL4MachineLearningCommandEncoder.

    Antes de poder iniciar el búfer de comando, hay una espera por una señal de evento compartida. Luego, al final hay una señal para desbloquear el siguiente. Así que no puede haber ningún otro comando ejecutándose en paralelo con este búfer de comandos. Y dentro del búfer de comandos hay barreras entre cada codificador asegurando que cada comando se ejecute uno tras otro. Aquí estaba bastante seguro de que no había problemas de sincronización, al menos dentro de este fotograma. Una vez descartado esto, decidí revisar MTL4MachineLearningCommandEncoder. Al hacer clic en la llamada de envío para la red de oclusión ambiental, me lleva a sus recursos vinculados. A la derecha, el editor asistente muestra el MTLTensor de salida. Puedo ver que tiene los mismos artefactos que la app en ejecución, esto es un problema. Haré doble clic en el MTLTensor de entrada para mostrarlo junto a la salida. La entrada tiene lo que esperaría de las normales del espacio de visión, los objetos que miran en una dirección diferente tienen diferentes intensidades de componentes. Entonces el problema debe estar dentro de mi red de AA. Regresemos a nuestra vista de recursos enlazados y esta vez haré doble clic en Network para abrirla en el nuevo ML Network Debugger. Esta herramienta es esencial para comprender qué sucede dentro del modelo.

    Este gráfico representa la estructura de mi red de oclusión ambiental. Lo escribí en PyTorch, y en las fases de compilación de mi objetivo hago lo que Preston sugirió, lo exporto como un paquete CoreML y luego lo convierto a un MTLPackage. Los cuadros son las operaciones y las conexiones muestran el flujo de datos a través del modelo de izquierda a derecha. Quería saber qué operación era responsable de introducir los artefactos. Sabía que la salida final tenía un error y que la entrada no, así que decidí dividir el gráfico en dos para reducir las posibilidades. Elijamos una operación del medio. Al seleccionar una operación se muestra su descripción a la derecha, junto con sus atributos, entradas y salidas. Además, puedo inspeccionar los datos intermedios del MTLTensor que genera cualquier operación. Haré clic en la vista previa para abrirla en el visor MTLTensor. Puedo ver que los artefactos ya están presentes aquí, así que revisaré una operación anterior.

    Esta operación también tiene artefactos en la salida. Revisemos la entrada.

    Sin embargo, este MTLTensor parece estar resaltando los bordes en la escena, eso está bien, la entrada a nuestra red son los bordes extraídos de nuestro búfer de profundidad. Entonces algo debe estar fallando en esta región de la red.

    Esta región cosida se puede expandir haciendo clic en las flechas en la parte superior izquierda de la operación.

    Por el orden y los tipos de estas operaciones, reconozco que esta es mi función SignedSmoothstep. Primero toma el valor absoluto de la entrada y luego fija el valor entre 0 y 1. Pero luego eleva el resultado a su propia potencia. Eso no está bien, no recuerdo que hubiera una operación de potencia en la función SignedSmoothstep. Vayamos al código Python para descubrir qué ocurre. Detendré la sesión de depuración y volveré al código fuente.

    El modelo que estoy ejecutando está en esta clase llamada LightUNet. Navegaré hasta su función de propagación hacia adelante para verificar que está haciendo lo que espero.

    La primera operación personalizada que realiza es SignedSmoothstep, que es la región unida que vi en ML Network Debugger. Pasaré a su función de propagación hacia adelante.

    Esta debería ser una operación sencilla en la que mantengo el signo de la entrada. Pero, en esta línea puedo ver el error, escribí demasiados asteriscos y ahora mi multiplicación es un operador de potencia. Eliminemos ese extra e intentemos ejecutarlo nuevamente.

    Y listo, una implementación funcional de oclusión ambiental neuronal usando MTL4MachineLearningCommandEncoder integrado de Metal 4.

    En esta demostración te mostré cómo usé Metal Debugger para depurar una app de AA de Metal 4. Primero, el visor de dependencias me ayudó a validar la sincronización. Después de eso inspeccioné las entradas y salidas de la red usando el visor MTLTensor, esto verificó que el problema estaba dentro de la red. Por último, usé ML Network Debugger para recorrer las operaciones en la red y localizar el problema.

    Estas herramientas son parte de una familia más grande de herramientas disponibles para depurar y optimizar aplicaciones de Metal. Recapitulemos lo que hablamos hoy. Metal 4 presenta MTLTensor, un nuevo recurso multidimensional diseñado específicamente para datos de AA. Los MTLTensors son flexibles para estructuras de datos complejas más allá de dos dimensiones. Con información de dimensión y paso incorporada, simplifican enormemente la indexación. Las nuevas características de Metal 4 permiten combinar cargas de trabajo de AA en tus procesos de metal. MTL4MachineLearningCommandEncoder permite que redes completas de AA se ejecuten directamente en la línea de tiempo de GPU. Esto permite una integración y sincronización perfecta con tu trabajo de procesamiento y renderizado. Para redes más pequeñas, Shader ML y la biblioteca Metal Performance Primitives te permiten integrar operaciones de AA directamente en los sombreadores. Por último, Metal Debugger te brinda una visibilidad increíble de lo que sucede en tu app Metal 4. El nuevo ML Network Debugger facilita la comprensión de tu red y cómo se ejecuta en el dispositivo. Este tipo de conocimiento es esencial para garantizar la corrección y optimizar el rendimiento. Para los próximos pasos, puedes probar MTL4MachineLearningCommandEncoder y Shader ML de Metal 4 instalando el último SO y Xcode. Para saber cómo las herramientas de desarrollo de Metal te ayudan, visita el sitio web de Apple Developer. Y para aprovechar al máximo tu app Metal 4, recuerda consultar otras charlas de Metal 4. Nos emociona ver lo que construirás con estas nuevas funciones. Gracias.

    • 8:13 - Exporting a Core ML package with PyTorch

      import coremltools as ct
      
      # define model in PyTorch
      # export model to an mlpackage
      
      model_from_export = ct.convert(
          custom_traced_model,
          inputs=[...],
          outputs=[...],
          convert_to='mlprogram',
          minimum_deployment_target=ct.target.macOS16,
      )
      
      model_from_export.save('model.mlpackage')
    • 9:10 - Identifying a network in a Metal package

      library = [device newLibraryWithURL:@"myNetwork.mtlpackage"];
      
      functionDescriptor = [MTL4LibraryFunctionDescriptor new]
      functionDescriptor.name = @"main";
      functionDescriptor.library = library;
    • 9:21 - Creating a pipeline state

      descriptor = [MTL4MachineLearningPipelineDescriptor new];
      descriptor.machineLearningFunctionDescriptor = functionDescriptor;
      
      [descriptor setInputDimensions:dimensions
                       atBufferIndex:1];
      
      pipeline = [compiler newMachineLearningPipelineStateWithDescriptor:descriptor
                                                                   error:&error];
    • 9:58 - Dispatching a network

      commands = [device newCommandBuffer];
      [commands beginCommandBufferWithAllocator:cmdAllocator];
      [commands useResidencySet:residencySet];
      
      /* Create intermediate heap */
      /* Configure argument table */
      
      encoder = [commands machineLearningCommandEncoder];
      [encoder setPipelineState:pipeline];
      [encoder setArgumentTable:argTable];
      [encoder dispatchNetworkWithIntermediatesHeap:heap];
    • 10:30 - Creating a heap for intermediate storage

      heapDescriptor = [MTLHeapDescriptor new];
      heapDescriptor.type = MTLHeapTypePlacement;
      heapDescriptor.size = pipeline.intermediatesHeapSize;
              
      heap = [device newHeapWithDescriptor:heapDescriptor];
    • 10:46 - Submitting commands to the GPU timeline

      commands = [device newCommandBuffer];
      [commands beginCommandBufferWithAllocator:cmdAllocator];
      [commands useResidencySet:residencySet];
      
      /* Create intermediate heap */
      /* Configure argument table */
      
      encoder = [commands machineLearningCommandEncoder];
      [encoder setPipelineState:pipeline];
      [encoder setArgumentTable:argTable];
      [encoder dispatchNetworkWithIntermediatesHeap:heap];
      
      [commands endCommandBuffer];
      [queue commit:&commands count:1];
    • 11:18 - Synchronization

      [encoder barrierAfterStages:MTLStageMachineLearning
                beforeQueueStages:MTLStageVertex
                visibilityOptions:MTL4VisibilityOptionDevice];
    • 15:17 - Declaring a fragment shader with tensor inputs

      // Metal Shading Language 4
      
      #include <metal_tensor>
      
      using namespace metal;
       
      [[fragment]]
      float4 shade_frag(tensor<device half, dextents<int, 2>> layer0Weights [[ buffer(0) ]],
                        tensor<device half, dextents<int, 2>> layer1Weights [[ buffer(1) ]],
                        /* other bindings */)
      {
          // Creating input tensor
          half inputs[INPUT_WIDTH] = { /* four latent texture samples + UV data */ };
      
          auto inputTensor = tensor(inputs, extents<int, INPUT_WIDTH, 1>());
          ...
      }
    • 17:12 - Operating on tensors in shaders

      // Metal Shading Language 4
      
      #include <MetalPerformancePrimitives/MetalPerformancePrimitives.h>
      
      using namespace mpp;
      
      constexpr tensor_ops::matmul2d_descriptor desc(
                    /* M, N, K */ 1, HIDDEN_WIDTH, INPUT_WIDTH,
             /* left transpose */ false,
            /* right transpose */ true,
          /* reduced precision */ true);
      
      tensor_ops::matmul2d<desc, execution_thread> op;
      op.run(inputTensor, layerN, intermediateN);
      
      for (auto intermediateIndex = 0; intermediateIndex < intermediateN(0); ++intermediateIndex)
      {
          intermediateN[intermediateIndex, 0] = max(0.0f, intermediateN[intermediateIndex, 0]);
      }
    • 18:38 - Render using network evaluation

      half3 baseColor          = half3(outputTensor[0,0], outputTensor[1,0], outputTensor[2,0]);
      half3 tangentSpaceNormal = half3(outputTensor[3,0], outputTensor[4,0], outputTensor[5,0]);
      
      half3 worldSpaceNormal = worldSpaceTBN * tangentSpaceNormal;
      
      return baseColor * saturate(dot(worldSpaceNormal, worldSpaceLightDir));
    • 0:00 - Introducción
    • Presentamos Metal 4, con mejoras en la integración del aprendizaje automático (ML) en juegos y gráficos. Metal 4 permite técnicas como aumento de escala, compresión de activos y combinación de animaciones con redes ML, y así mejora el rendimiento y la fidelidad visual. Las funcionalidades clave son “MTLTensors” para flujos de trabajo de ML, “MTL4MachineLearningCommandEncoder” para ejecutar redes en la línea de tiempo del GPU, Shader ML para integrar operaciones de ML en sombreadores y herramientas de depuración mejoradas. CoreML es óptimo para crear modelos de ML, y puedes lograr una integración perfecta de ML en las apps con Metal Debugger.

    • 2:52 - Conoce los tensores
    • Metal 4 presenta “MTLTensor”, un nuevo recurso diseñado específicamente para cargas de datos de aprendizaje automático. Los “MTLTensors” son contenedores de datos multidimensionales que permiten una representación eficiente de los diseños de datos complejos utilizados comúnmente en el aprendizaje automático, como los necesarios para las operaciones de convolución. Simplifican la indexación de datos multidimensionales en comparación con representaciones planas como “MTLBuffers”. Un “MTLTensor” se define por su rango (número de ejes), extensiones (número de puntos de datos a lo largo de cada eje), tipo de datos y propiedades de uso. Estas propiedades se especifican en un objeto “MTLTensorDescriptor”. Puedes crear “MTLTensors” desde un objeto “MTLDevice”, que ofrece un rendimiento optimizado con un diseño opaco, o desde un objeto “MTLBuffer” existente, donde debes especificar los pasos para tener en cuenta el posible relleno.

    • 6:21 - Codifica redes de aprendizaje automático
    • La versión más reciente de Metal también presenta “MTL4MachineLearningCommandEncoder”, y permite que el trabajo de aprendizaje automático se integre perfectamente en la línea de tiempo del GPU junto con los comandos de cálculo y renderizado. Con este nuevo codificador, los modelos ML completos se ejecutan en el GPU y se sincronizan con otros comandos de Metal con operaciones primitivas de sincronización estándar como barreras y cercas. El flujo de trabajo consta de dos partes principales: fuera de línea y ejecución. Cuando está fuera de línea, el sistema convierte un paquete CoreML en un “MTLPackage” optimizado con la herramienta de línea de comandos “metal-package-builder”. Durante la ejecución, el sistema compila “MTLPackage” en un “MTL4MachineLearningPipelineState” y crea el “MTL4MachineLearningCommandEncoder” ・€・ configurado con el estado del proceso, las entradas y las salidas ・€・ y luego envía comandos codificados al GPU. El codificador utiliza un “MTLHeap” para almacenar datos intermedios, y así optimiza el uso de recursos. Esto permite la ejecución paralela de tareas no dependientes, y mejora el rendimiento. Las capacidades de sincronización de Metal 4 garantizan que las salidas de ML que consumen trabajo esperen a que la red se complete, lo que lo hace adecuado para diversas apps en tiempo real, no solo para juegos.

    • 12:51 - Incorpora el aprendizaje automático en tu shader
    • Con Shader ML, presentado por Metal 4, los desarrolladores podrán integrar operaciones de aprendizaje automático directamente en los sombreadores. Esto mejora el rendimiento y reduce el uso de memoria ya que elimina la necesidad de sincronizar tensores entre la memoria del dispositivo y los sombreadores. Un ejemplo es la compresión de material neuronal, una técnica específica de ML. Comprime las texturas de los materiales hasta en un 50% en comparación con los formatos tradicionales de compresión en bloque. Con Shader ML, todo el proceso de evaluación de material neuronal ・€・ desde la inicialización de los tensores de entrada hasta la realización de la inferencia y el sombreado ・€・ se puede combinar en un único envío de sombreadores. Metal Performance Primitives está integrado en Shader ML y ofrece algunas API de alto rendimiento como multiplicación de matrices y convolución. Así podrá implementar rutinas de evaluación de redes neuronales de manera eficiente dentro de sombreadores de fragmentos, lo que da como resultado aplicaciones en tiempo real sin pérdida de calidad percibida, pero con un uso de memoria y espacio en disco significativamente reducidos.

    • 20:26 - Depura tus cargas de trabajo de aprendizaje automático
    • En el ejemplo se observa que al utilizar las nuevas herramientas de GPU en Xcode puedes depurar una carga de trabajo de aprendizaje automático que está causando artefactos graves en el cálculo de oclusión ambiental de una aplicación. Puedes capturar el seguimiento del GPU y usar el Visor de Dependencias para inspeccionar la sincronización de los buffers de comandos, y así descartar cualquier problema. Luego, examinas los tensores de entrada y salida de “MTL4MachineLearningCommandEncoder” y así confirmas que el problema está dentro de la propia red de aprendizaje automático. A continuación, puedes abrir la red en el nuevo ML Network Debugger, una herramienta visual que representa la estructura del modelo (escrito en PyTorch y convertido a CoreML y MTLPackage), lo que te permite identificar la operación específica responsable de introducir los artefactos. Al inspeccionar el gráfico, los artefactos están presentes tanto en la salida como en la entrada de una operación anterior, lo que indica un problema dentro de la red. Se identifica como el área problemática la función “SignedSmoothstep”. Al revisar el código Python, se descubre un error: un asterisco adicional hace que el sistema interprete una operación de multiplicación como una operación de potencia. Al corregir este error se resuelve el problema y la implementación de oclusión ambiental neuronal con “MTL4MachineLearningCommandEncoder” de Metal 4 se depura correctamente.

Developer Footer

  • Videos
  • WWDC25
  • Combina el aprendizaje automático y los gráficos de Metal 4
  • Open Menu Close Menu
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    Open Menu Close Menu
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • Icon Composer
    • SF Symbols
    Open Menu Close Menu
    • Accessibility
    • Accessories
    • App Store
    • Audio & Video
    • Augmented Reality
    • Business
    • Design
    • Distribution
    • Education
    • Fonts
    • Games
    • Health & Fitness
    • In-App Purchase
    • Localization
    • Maps & Location
    • Machine Learning & AI
    • Open Source
    • Security
    • Safari & Web
    Open Menu Close Menu
    • Documentation
    • Sample Code
    • Tutorials
    • Downloads
    • Forums
    • Videos
    Open Menu Close Menu
    • Support Articles
    • Contact Us
    • Bug Reporting
    • System Status
    Open Menu Close Menu
    • Apple Developer
    • App Store Connect
    • Certificates, IDs, & Profiles
    • Feedback Assistant
    Open Menu Close Menu
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program
    • News Partner Program
    • Video Partner Program
    • Security Bounty Program
    • Security Research Device Program
    Open Menu Close Menu
    • Meet with Apple
    • Apple Developer Centers
    • App Store Awards
    • Apple Design Awards
    • Apple Developer Academies
    • WWDC
    Get the Apple Developer app.
    Copyright © 2025 Apple Inc. All rights reserved.
    Terms of Use Privacy Policy Agreements and Guidelines