-
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
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
-
Buscar este video…
-
-
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.