AIHealth
Piattaforma clinica on-premise con LLM locali, RAG su dati FHIR/DICOM, supporto alla diagnosi, follow-up remoto. Architettura progettata per il percorso MDR.
Scopri AIHealth →
Intelligenza Artificiale
Consulenza EU AI Act: classificazione dei sistemi, policy, governance AI, formazione.
Scopri →Dal contesto: perché Metal
Fino al 2014 le piattaforme Apple usavano OpenGL/OpenGL ES per il rendering e OpenCL per il calcolo GPU — API pensate negli anni 90 con modelli di driver ad alto overhead, gestione degli stati implicita e submission seriali. Sulle GPU mobili dell’epoca, il costo di ogni draw call era significativo rispetto alle risorse disponibili.
Apple annuncia Metal alla WWDC 2014 (2 giugno 2014) come API grafica low-overhead per iOS 8 sugli A7/A8. L’obiettivo tecnico dichiarato: ridurre il costo CPU della submission, rendere esplicita la gestione di stato e resource, avvicinare il modello a quello di Vulkan e Direct3D 12 (poi rilasciati nel 2015-2016).
Architettura Metal
Metal espone un modello di programmazione basato su oggetti espliciti:
- MTLDevice — la GPU
- MTLCommandQueue / MTLCommandBuffer — coda e batch di comandi
- MTLRenderCommandEncoder / MTLComputeCommandEncoder / MTLBlitCommandEncoder — encoder per i tre tipi di workload
- MTLRenderPipelineState / MTLComputePipelineState — pipeline pre-compilate, immutabili
- MTLBuffer / MTLTexture / MTLHeap — risorse con storage mode espliciti (shared, managed, private, memoryless)
La submission è esplicita: l’app costruisce command buffer, li commit alla queue, gestisce la sincronizzazione via fence, event, shared event. Niente driver che “indovina” stati.
Metal Shading Language (MSL)
MSL è il linguaggio per gli shader, derivato da C++14 con estensioni GPU. È lo stesso linguaggio per vertex, fragment, tile, compute e mesh shader (introdotti con Metal 3). Il compilatore è Metal Compiler (metal), basato su LLVM, che produce binari intermedi AIR (Apple Intermediate Representation) impacchettati in metallib. A runtime, il driver genera il codice macchina specifico della GPU target.
kernel void saxpy(
device const float* x [[buffer(0)]],
device float* y [[buffer(1)]],
constant float& a [[buffer(2)]],
uint i [[thread_position_in_grid]])
{
y[i] = a * x[i] + y[i];
}
Metal 2 (2017) e Metal 3 (2022)
- Metal 2 — WWDC 2017 (macOS High Sierra, iOS 11). Aggiunge Argument Buffers (binding di grandi set di risorse in un singolo buffer), Raster Order Groups, supporto GPU esterne (eGPU) e integrazione con il Metal Performance Shaders framework.
- Metal 3 — WWDC 6 giugno 2022 (macOS Ventura, iOS 16). Introduce MetalFX Upscaling (spatial e temporal, analogo a DLSS/FSR), mesh shaders, Fast Resource Loading (caricamento asincrono direttamente dal file system alle texture), Offline Shader Compilation per ridurre gli stutter al primo uso.
Metal Performance Shaders e MPSGraph
Metal Performance Shaders (MPS) è un framework di kernel di calcolo ottimizzati per ciascuna famiglia di GPU Apple: convoluzioni, matrici, FFT, filtri immagine, reti neurali. Sopra di esso, MPSGraph è un’API di calcolo basata su grafo, dedicata al machine learning — equivalente di alto livello a XLA o a cuDNN + TensorRT.
Lo stack ML Apple si appoggia a MPS/MPSGraph:
- Core ML usa MPS come backend per l’esecuzione su GPU
- PyTorch espone il device
mpsdal 2022 (collaborazione Apple + Meta), che mappa le operazioni su MPSGraph - TensorFlow ha un backend tensorflow-metal su MPS
- JAX su Apple Silicon tramite IREE/MPS (sperimentale)
Compute e ML su Apple Silicon
Con il passaggio a Apple Silicon (M1 a novembre 2020, poi M2, M3, M4, più varianti Pro/Max/Ultra), la memoria è unificata: CPU, GPU e Neural Engine accedono allo stesso pool DRAM senza copie espliciti. In Metal, le risorse con storage mode shared risiedono in memoria unificata; private abilita copie in VRAM interna. La presenza del Neural Engine (NPU separata) crea una divisione del lavoro ML: kernel generici su GPU via MPS, kernel supportati nel Neural Engine via Core ML.
Per LLM a precisione ridotta (INT4/INT8, GGUF), llama.cpp ha un backend Metal dal 2023: su un M2/M3 Max con 64-128 GB di memoria unificata, è praticabile inferenza locale di modelli 30-70B quantizzati — caso d’uso di rilievo per laboratori e workstation AI senza GPU discreta.
Confronto con Vulkan e Direct3D 12
Metal condivide con Vulkan e Direct3D 12 la filosofia low-overhead e explicit state. Differenze pratiche:
- Metal è platform-locked (solo Apple). Vulkan è cross-vendor su Linux, Android, Windows; D3D12 è Windows/Xbox.
- MSL è più vicino a C++ standard di HLSL e GLSL/SPIR-V; però SPIR-V è IR binario interscambiabile.
- La gestione sincronizzazione di Metal è considerata più ergonomica rispetto a Vulkan (più nascosta al dev).
Progetti come MoltenVK (KhronosGroup) e DXVK / D3DMetal traducono Vulkan e D3D12 su Metal in userspace, abilitando giochi Windows/Linux su macOS.
Contesto noze
noze valuta Apple Silicon come piattaforma di inferenza locale per modelli medi e come ambiente di sviluppo: la memoria unificata rende le workstation M2/M3 Max/Ultra adatte a prototipare pipeline LLM senza GPU discreta. In produzione sanitaria, tuttavia, lo stack di riferimento resta CUDA/NVIDIA: Apple non offre soluzioni server, il porting da CUDA a Metal richiede riscrittura dei kernel custom e non esistono GPU Apple in configurazioni data-center con InfiniBand o NVLink equivalenti.
Riferimenti: Metal annunciato alla WWDC del 2 giugno 2014 (iOS 8). Metal 2 annunciato WWDC 5 giugno 2017 (macOS High Sierra, iOS 11). Metal 3 annunciato WWDC 6 giugno 2022 (macOS Ventura, iOS 16). Apple M1 annunciato 10 novembre 2020. PyTorch con backend mps da PyTorch 1.12 (giugno 2022). Fonti: Apple Developer Documentation (Metal, Metal Shading Language, Metal Performance Shaders), keynote WWDC.