Dentro Core: oltre 2.900 operazioni su 12 backend
Cosa ci dice il numero di operazioni
La moltiplicazione di matrici sembra un’unica operazione. La sua implementazione dipende dal significato dei valori, da come vengono memorizzati, da come si accumulano i risultati parziali e dall’hardware che esegue il calcolo. Una matrice binaria impacchettata e una matrice in virgola mobile possono condividere un’operazione astratta, pur richiedendo regole numeriche e codice diversi.
Core è la base di calcolo di Dweve per l’addestramento e l’inferenza. Il catalogo pubblico comprende centinaia di migliaia di kernel ottimizzati a mano per oltre 2.900 operazioni in 76 categorie, 25 formati numerici e 12 backend. Queste cifre descrivono aspetti diversi del sistema. Un’operazione identifica il calcolo, un formato numerico ne definisce la rappresentazione, un backend individua la destinazione di esecuzione e un kernel implementa una specifica combinazione di scelte.
Capire questa distinzione è più utile che considerare il catalogo come un unico grande conteggio di funzionalità. Chi sviluppa deve sapere se la combinazione necessaria è disponibile e quale contratto segue.
Calcolo e rappresentazione vanno considerati insieme
Consideriamo una riduzione: si prende un insieme di valori e li si combina in un risultato. La parola «somma» lascia aperte diverse domande. Gli input sono interi con segno, valori a virgola fissa o a virgola mobile? Quale rappresentazione contiene il risultato accumulato? Cosa succede quando non può contenere il valore successivo?
Core associa queste scelte all’operazione. Il contratto di esecuzione specifica tipo di dato, larghezza, impacchettamento, accumulatore, backend, set di istruzioni, criterio di dispatch e modalità di determinismo. Modificarne una può cambiare il significato del calcolo, anche se il nome dell’operazione resta invariato.
I 25 formati numerici comprendono famiglie binarie, ternarie, intere, a virgola fissa, adattive e a virgola mobile. Il nome della famiglia è solo il punto di partenza per descrivere l’aritmetica: contano anche larghezza, segno, scala e disposizione in memoria. Il catalogo va quindi letto come un insieme di combinazioni supportate, non come la promessa che ogni operazione esista in qualsiasi formato e su qualsiasi destinazione.
Ecco perché un formato di interscambio non può risolvere ogni questione di esecuzione. ONNX descrive un grafo computazionale con input, output e operatori tipizzati. Offre ai sistemi una descrizione condivisa del modello, ma spetta comunque al runtime implementare gli operatori. La documentazione sui concetti di ONNX spiega la distinzione tra rappresentazione del grafo ed esecuzione.
12 backend, scelte di esecuzione esplicite
I 12 backend di Core comprendono l’esecuzione scalare, set di istruzioni CPU e destinazioni GPU e portabili. L’insieme pubblico include Scalar, SSE2, AVX2, AVX-512, NEON, SVE2, CUDA, ROCm, Metal, Vulkan, WebGPU e WASM. Questi nomi indicano percorsi di esecuzione all’interno di Core, non versioni separate del modello.
Il dispatch seleziona sul sistema corrente un’implementazione supportata per l’operazione e il relativo contratto di esecuzione. Il percorso scelto viene registrato insieme alla cella di esecuzione, all’host e al motivo della scelta. È così possibile esaminare le decisioni effettivamente adottate durante un’esecuzione.
Anche la portabilità ha dei limiti. Per esempio, la documentazione di WebAssembly distingue il formato binario portabile dalle API fornite dall’ambiente host. L’esecuzione nel browser e quella al di fuori possono esporre interfacce diverse. La documentazione sulla portabilità di WebAssembly offre un utile contesto per questa distinzione. Il nome del backend, da solo, non descrive l’ambiente operativo di un’applicazione.
Il ruolo di Core in Dweve
Core usa la libreria primitives per le operazioni fondamentali e integra queste basi nel sistema di calcolo. Loom si basa su Core e usa la libreria solvers per le attività di ragionamento. Ogni componente ha così una responsabilità precisa: primitives fornisce le operazioni di base, Core esegue i calcoli e Loom costruisce il ragionamento su queste fondamenta.
Dweve è il servizio. Fabric ne è l’API e il portale attraverso cui persone e applicazioni vi accedono. Fabric non sostituisce il ruolo di calcolo di Core né quello di ragionamento di Loom: l’interfaccia e i sistemi che la supportano hanno funzioni diverse.
Parti dall’esecuzione di cui hai bisogno
Per valutare un sistema di calcolo, parti da un’operazione concreta e dalla rappresentazione che richiede. Poi chiediti quale backend la eseguirà, quali regole si applicano ad accumulatore e impacchettamento e quale contratto di riproducibilità è dichiarato. Sono queste domande a rendere utile un catalogo per un team.
I dati pubblici di Core descrivono l’ampiezza del catalogo; il contratto di esecuzione spiega come interpretarlo. Vanno considerati insieme: quali attività copre il sistema e cosa comporta usare una specifica implementazione.