Core van binnenuit: 2.900+ bewerkingen op 12 backends
Wat zegt het aantal bewerkingen?
Matrixvermenigvuldiging klinkt als één taak. Maar de implementatie hangt af van de betekenis van de waarden, hun opslag, de manier waarop tussenresultaten worden opgeteld en de hardware die de berekening uitvoert. Een matrix met verpakte binaire waarden en een matrix met zwevendekommagetallen kunnen dezelfde abstracte bewerking gebruiken, terwijl ze andere rekenregels en andere code vereisen.
Core vormt binnen Dweve de rekenbasis voor training en inferentie. De openbare catalogus omvat honderdduizenden handmatig afgestemde kernels voor 2.900+ bewerkingen in 76 categorieën, 25 numerieke formaten en 12 backends. Die cijfers beschrijven verschillende onderdelen. Een bewerking benoemt de berekening. Een numeriek formaat bepaalt de representatie. Een backend geeft aan waar de berekening wordt uitgevoerd. Een kernel implementeert een specifieke combinatie van die keuzes.
Voor een ontwikkelaar telt vooral of de benodigde combinatie beschikbaar is en welke afspraken daarvoor gelden. Daarvoor moet je de onderdelen van de catalogus uit elkaar kunnen houden.
Berekening en representatie horen bij elkaar
Neem een reductie: je voegt een verzameling waarden samen tot één resultaat. Het woord ‘som’ laat nog veel open. Zijn de invoerwaarden gehele getallen met een teken, vastekommagetallen of zwevendekommagetallen? In welke representatie wordt het tussenresultaat bijgehouden? Wat gebeurt er als de volgende waarde daar niet meer in past?
Core houdt deze keuzes bij de bewerking. Het uitvoeringscontract legt het datatype, de breedte, de verpakking, de accumulator, de backend, de instructieset, het dispatchbeleid en de determinismemodus vast. Een wijziging in een van die keuzes kan de betekenis van de berekening veranderen, ook als de naam van de bewerking gelijk blijft.
De 25 numerieke formaten omvatten binaire en ternaire getallen, gehele getallen, vastekommagetallen, adaptieve formaten en zwevendekommagetallen. Zo'n familienaam is het begin van de beschrijving van de rekenregels. Ook de breedte, het teken, de schaal en de opslagindeling doen ertoe. Lees de catalogus daarom als een verzameling ondersteunde combinaties. Je kunt er niet uit afleiden dat iedere bewerking in elk denkbaar formaat op elk uitvoeringsdoel beschikbaar is.
Een uitwisselingsformaat beantwoordt evenmin alle vragen over de uitvoering. ONNX beschrijft een rekengraaf met getypeerde invoer, uitvoer en operatoren. Daarmee hebben systemen een gemeenschappelijke modelbeschrijving; de runtime moet de operatoren nog steeds implementeren. De documentatie over ONNX-concepten licht dit onderscheid tussen graafrepresentatie en uitvoering toe.
12 backends, expliciete uitvoeringskeuzes
De 12 backends van Core omvatten scalaire uitvoering, CPU-instructiesets, GPU-doelen en draagbare uitvoeringsdoelen. De openbare lijst bestaat uit Scalar, SSE2, AVX2, AVX-512, NEON, SVE2, CUDA, ROCm, Metal, Vulkan, WebGPU en WASM. Het gaat om uitvoeringspaden binnen Core, niet om afzonderlijke versies van een model.
Dispatch selecteert op de huidige host een ondersteunde implementatie voor de bewerking en haar uitvoeringscontract. Core registreert het gekozen pad, de uitvoeringscel, de host en de reden voor de keuze. Zo kun je achteraf nagaan welke keuzes een berekening daadwerkelijk heeft gevolgd.
Draagbaarheid kent wel grenzen. De documentatie van WebAssembly maakt bijvoorbeeld onderscheid tussen een draagbaar binair formaat en de API's die de hostomgeving aanbiedt. Binnen en buiten de browser kunnen verschillende interfaces beschikbaar zijn. De documentatie over de draagbaarheid van WebAssembly biedt hiervoor nuttige context. Alleen de naam van een backend vertelt je nog niet in welke omgeving een toepassing draait.
De plaats van Core binnen Dweve
Core gebruikt de bibliotheek met primitives voor fundamentele bewerkingen en brengt die samen in het rekensysteem. Loom is gebouwd op Core en gebruikt de solversbibliotheek voor zijn redeneerwerk. Elk onderdeel heeft daarmee een eigen taak: primitives leveren basisbewerkingen, Core voert berekeningen uit en Loom bouwt daarop voort om te redeneren.
Dweve is de dienst. Fabric is de API en het portaal waarmee mensen en toepassingen toegang krijgen tot die dienst. Fabric neemt de rekentaak van Core of de redeneertaak van Loom niet over. De interface en de achterliggende systemen hebben elk hun eigen functie.
Begin bij de berekening die je nodig hebt
Wie een rekensysteem beoordeelt, kan het beste beginnen bij een concrete berekening en de vereiste representatie. Vraag vervolgens welke backend haar uitvoert, welke regels voor de accumulator en de verpakking gelden en welk contract voor herhaling is vastgelegd. Met die vragen wordt een catalogus bruikbaar voor een team.
De openbare cijfers van Core beschrijven de omvang van de catalogus. Het uitvoeringscontract helpt je die te lezen. Beide zijn nodig: welke bewerkingen het systeem omvat, en wat een specifieke implementatie betekent wanneer je haar gebruikt.