-
Combinez l’apprentissage automatique et les graphismes de Metal 4
Découvrez comment combiner l'apprentissage automatique dans vos applications graphiques à l'aide de Metal 4. Nous présenterons la ressource tensorielle et l'encodeur ML pour exécuter des modèles sur la chronologie de carte graphique parallèlement à votre travail de rendu et de calcul. Découvrez comment Shader ML vous permet d'intégrer des réseaux neuronaux directement dans vos shaders pour obtenir des effets avancés et des gains de performances. Nous montrerons également de nouveaux outils de débogage pour les charges de travail Metal 4 ML en action à l'aide d'un exemple d'app.
Chapitres
- 0:00 - Introduction
- 2:52 - Découvrez les tenseurs
- 6:21 - Encodage des réseaux ML
- 12:51 - Intégrer ML dans votre shader
- 20:26 - Déboguer vos charges de travail ML
Ressources
Vidéos connexes
WWDC25
- Allez plus loin avec les jeux Metal 4
- Découvrez Metal 4
- Explorez les jeux Metal 4
- Nouveautés du rendu Metal pour les apps immersives
WWDC24
-
Rechercher dans cette vidéo…
-
-
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 - Introduction
Nous sommes ravis de présenter Metal 4, qui améliore l’intégration de l’apprentissage automatique dans les jeux et les graphismes. Metal 4 permet d’utiliser des techniques telles que l’upscaling, la compression des ressources et le mélange d’animations à l’aide de réseaux d’apprentissage automatique, ce qui améliore les performances et la fidélité visuelle. Les principales fonctionnalités comprennent MTLTensors pour les workflows d’apprentissage automatique, MTL4MachineLearningCommandEncoder pour l’exécution de réseaux sur la timeline GPU, Shader ML pour l’intégration d’opérations d’apprentissage automatique dans les shaders, ainsi que des outils de débogage améliorés. CoreML est idéal pour créer des modèles d’apprentissage automatique Vous pouvez également intégrer facilement l’apprentissage automatique dans vos apps à l’aide du débogueur Metal.
- 2:52 - Découvrez les tenseurs
Metal 4 présente MTLTensor, une nouvelle ressource spécialement conçue pour les charges de travail liées à l’apprentissage automatique. Les MTLTensors sont des conteneurs de données multidimensionnels qui permettent de représenter efficacement les structures de données complexes couramment utilisées dans l’apprentissage automatique, telles que celles requises pour les opérations de convolution. Ils simplifient l’indexation des données multidimensionnelles par rapport aux représentations plates telles que les MTLBuffers. Un MTLTensor est défini par son rang (nombre d’axes), ses étendues (nombre de points de données le long de chaque axe), son type de données et ses propriétés d’utilisation. Ces propriétés sont spécifiées dans un objet MTLTensorDescriptor. Vous pouvez créer des MTLTensors à partir d’un objet MTLDevice, qui offre des performances optimisées avec une disposition opaque, ou à partir d’un objet MTLBuffer existant, où vous devez spécifier les pas pour tenir compte du remplissage potentiel.
- 6:21 - Encodage des réseaux ML
La dernière version de Metal introduit également le MTL4MachineLearningCommandEncoder, qui permet d’intégrer de manière transparente le travail d’apprentissage automatique dans la timeline du GPU, parallèlement aux commandes de calcul et de rendu. Ce nouvel encodeur permet d’exécuter des modèles d’apprentissage automatique complets sur le GPU, en synchronisation avec d’autres commandes Metal à l’aide de primitives de synchronisation standard telles que les barrières et les clôtures. Le flux de travail comprend deux parties principales : hors ligne et en cours d’exécution. Hors ligne, le système convertit un package CoreML en un MTLPackage optimisé à l’aide de l’outil de ligne de commande metal-package-builder. Lors de l’exécution, le système compile MTLPackage en MTL4MachineLearningPipelineState et crée le MTL4MachineLearningCommandEncoder configuré avec l’état du pipeline, les entrées et les sorties, puis distribue les commandes encodées au GPU. L’encodeur utilise un MTLHeap pour stocker les données intermédiaires, ce qui optimise l’utilisation des ressources. Cela permet l’exécution parallèle de tâches non dépendantes, améliorant ainsi les performances. Les capacités de synchronisation de Metal 4 garantissent que les tâches utilisant les résultats d’un modèle d’apprentissage automatique attendent que celui-ci ait terminé son exécution, ce qui le rend adapté à de nombreuses apps en temps réel, et pas seulement aux jeux.
- 12:51 - Intégrer ML dans votre shader
Metal 4 introduit Shader ML, qui permet aux développeurs d’intégrer des opérations d’apprentissage automatique directement dans les shaders. Cela améliore les performances et réduit l’empreinte mémoire en éliminant la nécessité de synchroniser les tenseurs entre la mémoire de l’appareil et les shaders. La compression de textures de matériaux à l’aide de réseaux neuronaux, une technique spécifique de l’apprentissage automatique, en est un exemple. Cette technique compresse les textures des matériaux jusqu’à 50 % par rapport aux formats traditionnels compressés par blocs. Avec Shader ML, l’ensemble du processus d’évaluation des matériaux neuronaux, de l’initialisation des tenseurs d’entrée à l’inférence et à l’ombrage, peut être regroupé en un seul appel de shader. Metal Performance Primitives est intégré à Shader ML, fournissant des API hautes performances telles que la multiplication matricielle et la convolution. Cela vous permet de mettre en œuvre efficacement des routines d’évaluation de réseaux neuronaux dans des shaders de fragments, ce qui se traduit par des apps en temps réel sans perte de qualité perceptible, mais avec une réduction significative de l’utilisation de la mémoire et de l’espace disque.
- 20:26 - Déboguer vos charges de travail ML
Dans l’exemple fourni, vous pouvez utiliser les nouveaux outils GPU de Xcode pour déboguer une charge de travail d’apprentissage automatique qui provoque des artefacts visuels marqués dans le calcul de l’occlusion ambiante d’une app. Vous pouvez capturer la trace GPU et utiliser le visualiseur de dépendances pour inspecter la synchronisation des tampons de commandes, ce qui permet d’écarter tout problème. Vous examinerez ensuite les tenseurs d’entrée et de sortie du MTL4MachineLearningCommandEncoder afin de confirmer que le problème provient bien du réseau d’apprentissage automatique en soi. Ensuite, vous pouvez ouvrir le réseau dans le nouveau débogueur ML Network Debugger, un outil visuel qui représente la structure du modèle (écrit en PyTorch et converti en CoreML et MTLPackage), afin d’identifier l’opération spécifique responsable de l’introduction des artefacts. En examinant le graphique, on constate que les artefacts sont présents à la fois dans la sortie et dans l’entrée d’une opération précédente, ce qui indique un problème au sein du réseau. La fonction SignedSmoothstep est identifiée comme étant la source du problème. Après avoir examiné le code Python, un bug a été découvert : un astérisque en trop qui faisait interpréter au système une opération de multiplication comme une opération de puissance. La correction de cette erreur résout le problème, et l’implémentation de l’occlusion ambiante neuronale utilisant le MTL4MachineLearningCommandEncoder » de Metal 4 est ainsi déboguée avec succès.