În interiorul Core: peste 2.900 de operațiuni pe 12 backend-uri
Ce ne spune numărul de operațiuni
Înmulțirea matricelor pare o singură sarcină. Implementarea ei depinde de semnificația valorilor, de modul în care sunt stocate, de felul în care se acumulează rezultatele intermediare și de hardware-ul care execută operația. O matrice binară compactată și una în virgulă mobilă pot reprezenta aceeași operație abstractă, dar pot necesita reguli numerice și cod diferite.
Core este fundația de calcul a Dweve pentru antrenare și inferență. Catalogul public cuprinde sute de mii de kerneluri optimizate manual pentru peste 2.900 de operațiuni, în 76 de categorii, 25 de formate numerice și 12 backend-uri. Aceste cifre descriu componente diferite ale sistemului. O operațiune numește calculul. Un format numeric definește reprezentarea. Un backend indică ținta de execuție. Un kernel implementează o anumită combinație de opțiuni.
Este mai important să înțelegem această distincție decât să tratăm catalogul ca pe un singur total de funcționalități. Un dezvoltator trebuie să știe dacă există combinația de care are nevoie și ce contract respectă.
Calculul și reprezentarea merg împreună
Să luăm o reducere: o colecție de valori este combinată într-un rezultat. Cuvântul „sumă” lasă mai multe întrebări fără răspuns. Intrările sunt întregi cu semn, valori în virgulă fixă sau în virgulă mobilă? Ce reprezentare păstrează rezultatul acumulat? Ce se întâmplă când reprezentarea nu mai poate cuprinde următoarea valoare?
Core păstrează aceste opțiuni atașate operațiunii. Contractul de execuție include tipul de date, lățimea, împachetarea, acumulatorul, backend-ul, setul de instrucțiuni, politica de selectare a implementării și modul de determinism. Schimbarea oricăruia dintre aceste elemente poate modifica sensul calculului, chiar dacă numele operațiunii rămâne același.
Cele 25 de formate numerice includ familii binare, ternare, întregi, în virgulă fixă, adaptive și în virgulă mobilă. Numele unei familii este doar punctul de plecare pentru descrierea aritmeticii. Contează și lățimea, semnul, scara și organizarea stocării. Catalogul trebuie citit ca o colecție de combinații acceptate, nu ca o promisiune că fiecare operațiune există în orice format imaginabil și pe orice țintă.
De aceea, un format de schimb nu poate clarifica toate întrebările despre execuție. ONNX descrie un graf de calcul cu intrări, ieșiri și operatori tipizați. Astfel, sistemele au o descriere comună a modelului; runtime-ul trebuie totuși să implementeze operatorii. Documentația ONNX despre concepte explică distincția dintre reprezentarea grafului și execuție.
12 backend-uri, opțiuni de execuție explicite
Cele 12 backend-uri Core acoperă execuția scalară, seturi de instrucțiuni CPU, precum și ținte GPU și portabile. Lista publică include Scalar, SSE2, AVX2, AVX-512, NEON, SVE2, CUDA, ROCm, Metal, Vulkan, WebGPU și WASM. Aceste denumiri descriu căi de execuție din Core, nu versiuni diferite ale unui model.
Mecanismul de selectare a implementării alege pe gazda curentă o variantă acceptată pentru operațiune și contractul ei de execuție. Calea selectată este înregistrată împreună cu celula de execuție, gazda și motivul alegerii. Astfel, o rulare poate fi inspectată prin opțiunile pe care le-a folosit efectiv.
Portabilitatea are totuși limite. De exemplu, documentația WebAssembly distinge un format binar portabil de API-urile furnizate de mediul gazdă. Execuția în browser și cea din afara lui pot oferi interfețe diferite. Documentația WebAssembly despre portabilitate oferă un context util pentru această distincție. Numele unui backend nu explică, de unul singur, mediul de funcționare al unei aplicații.
Locul Core în Dweve
Biblioteca primitives este folosită de Core pentru operațiunile fundamentale. Core aduce aceste fundații în sistemul de calcul. Loom este construit pe Core și folosește biblioteca solvers pentru raționament. Fiecare componentă are o responsabilitate clară: primitives oferă operațiuni de bază, Core execută calcule, iar Loom construiește raționamentul pe această fundație.
Dweve este serviciul. Fabric este API-ul și portalul său, prin care oamenii și aplicațiile accesează serviciul. Fabric nu înlocuiește rolul de calcul al Core sau rolul de raționament al Loom. Interfața și sistemele din spatele ei au scopuri diferite.
Pornește de la execuția de care ai nevoie
Când evaluezi un sistem de calcul, începe cu un calcul concret și reprezentarea necesară. Apoi întreabă-te ce backend îl va executa, ce reguli se aplică acumulatorului și împachetării și ce contract de reluare este declarat. Aceste întrebări transformă catalogul într-un instrument util pentru echipă.
Cifrele publice ale Core descriu amploarea catalogului. Contractul de execuție explică modul în care trebuie citit. Ambele aspecte trebuie discutate împreună: ce sarcini acoperă sistemul și ce înseamnă o anumită implementare atunci când o folosești.