Dweve

Inblick i Core: över 2 900 operationer fördelade på 12 backender

Hundratusentals handoptimerade kärnor. Över 2 900 operationer i 76 kategorier. 25 numeriska format och 12 backender. En inblick i Core, beräkningsgrunden...

Inblick i Core: över 2 900 operationer fördelade på 12 backender

Vad antalet operationer faktiskt säger

Matrisprodukt låter som en enda uppgift. Hur den implementeras beror på vad värdena betyder, hur de lagras, hur delresultat ackumuleras och vilken hårdvara som utför arbetet. En packad binär matris och en flyttalsmatris kan motsvara samma abstrakta operation, men kräva olika numeriska regler och olika kod.

Core är Dweves beräkningsgrund för träning och inferens. Den offentliga katalogen omfattar hundratusentals handoptimerade kärnor för över 2 900 operationer i 76 kategorier, 25 numeriska format och 12 backender. Siffrorna beskriver olika delar av systemet. En operation anger beräkningen. Ett numeriskt format definierar representationen. En backend identifierar ett exekveringsmål. En kärna implementerar en viss kombination av val.

Det är viktigare att förstå skillnaden än att se katalogen som en enda stor funktionssiffra. Utvecklaren behöver veta om den önskade kombinationen finns och vilket kontrakt den följer.

Över 2 900 operationer i 76 kategorier, 25 numeriska format och 12 backender. Hundratusentals handoptimerade kärnor implementerar de exekveringsval som stöds.

Beräkningen och dess representation hör ihop

Tänk på en reduktion: en samling värden kombineras till ett resultat. Ordet ”summa” lämnar flera frågor obesvarade. Är indata heltal med tecken, fixpunktsvärden eller flyttal? Vilken representation lagrar det ackumulerade resultatet? Vad händer när den representationen inte kan rymma nästa värde?

Core knyter dessa val till operationen. Exekveringskontraktet omfattar datatyp, bredd, packning, ackumulator, backend, instruktionsuppsättning, dispatchpolicy och determinismnivå. Om något av detta ändras kan beräkningens innebörd förändras, även om operationen har samma namn.

De 25 numeriska formaten omfattar familjer för binära och ternära tal, heltal, fixpunkt, adaptiv precision och flyttal. Familjenamnet är bara utgångspunkten för att beskriva aritmetiken. Även bredd, teckenrepresentation, skala och lagringslayout spelar roll. Katalogen bör därför läsas som en samling kombinationer som stöds, inte som ett löfte om att varje operation finns i alla tänkbara format på varje mål.

Det är också därför ett utbytesformat inte kan avgöra alla frågor om exekvering. ONNX beskriver en beräkningsgraf med typade indata, utdata och operatorer. Det ger systemen en gemensam modellbeskrivning, men körmiljön måste fortfarande implementera operatorerna. ONNX-dokumentationen om centrala begrepp förklarar skillnaden mellan grafrepresentation och exekvering.

Läs ett exekveringsval utifrån operationen, representationen, ackumulatorn, backend och reglerna för uppspelning. Diagrammet visar ett representativt urval, inte en täckningsmatris.

12 backender med tydliga exekveringsval

Cores 12 backender omfattar skalär exekvering, CPU-instruktionsuppsättningar samt GPU- och portabla mål. Den offentliga uppsättningen omfattar Scalar, SSE2, AVX2, AVX-512, NEON, SVE2, CUDA, ROCm, Metal, Vulkan, WebGPU och WASM. Namnen beskriver exekveringsvägar i Core, inte separata modellversioner.

Dispatch väljer en implementation som stöds för operationen och dess exekveringskontrakt på den aktuella värddatorn. Den valda vägen registreras tillsammans med exekveringscellen, värddatorn och orsaken. Därför går det att granska en körning utifrån de val som faktiskt gjordes.

Portabilitet har fortfarande gränser. WebAssembly-dokumentationen skiljer exempelvis mellan ett portabelt binärformat och de API:er som värdmiljön tillhandahåller. Körning i en webbläsare och körning utanför webbläsaren kan erbjuda olika gränssnitt. WebAssemblys dokumentation om portabilitet ger användbar bakgrund till skillnaden. En backendetikett räcker inte för att beskriva programmets körmiljö.

Cores plats i Dweve

Core använder biblioteket primitives för grundläggande operationer och för in dessa byggstenar i beräkningssystemet. Loom bygger på Core och använder biblioteket solvers för sitt resonemangsarbete. Därmed får varje del ett tydligt ansvar: primitives tillhandahåller grundoperationer, Core utför beräkningar och Loom bygger resonemang ovanpå den grunden.

Dweve är tjänsten. Fabric är dess API och portal, där människor och applikationer får åtkomst till tjänsten. Fabric ersätter varken Cores beräkningsroll eller Looms resonemangsroll. Gränssnittet och systemen bakom det har olika uppgifter.

Core använder biblioteket primitives. Loom bygger på Core och använder biblioteket solvers. Fabric är API och portal för tjänsten Dweve.

Börja med den exekvering du behöver

När du utvärderar ett beräkningssystem börjar du med en konkret beräkning och den representation den kräver. Fråga sedan vilken backend som ska utföra den, vilka regler som gäller för ackumulator och packning samt vilket kontrakt för uppspelning som deklareras. De frågorna gör katalogen användbar för ett team.

Cores offentliga siffror beskriver katalogens omfattning. Exekveringskontraktet förklarar hur den ska läsas. Båda behövs i samma samtal: vilket arbete systemet täcker och vad en viss implementation innebär när den används.