Numerus și același răspuns de două ori
Bug-ul care există doar pe celălalt calculator
Cel mai enervant bug numeric este cel care refuză să apară acolo unde te uiți. Testul eșuează pe CI, nu local. Simularea deviază după o actualizare de dependențe. Ținta încorporată produce un rezultat ușor diferit față de server. Pipeline-ul de model pare în regulă până când replay-ul cere același calcul de două ori și primește două răspunsuri suficient de apropiate ca să pornească o discuție.
Aproape e uneori în regulă. Aproape nu e întotdeauna un contract. Dacă un calcul face parte dintr-o cale de replay, o verificare de siguranță, o simulare, o decizie de preț, un digital twin, un jurnal de audit sau un pas de compresie a modelului, atunci „aproape” se poate transforma într-un risc de produs. Diferența poate fi minusculă. Diferențele minuscule tot diferențe sunt. Software-ul a construit cariere întregi din a fi jignit de diferențe minuscule.
Acesta este motivul pentru care Numerus există în stiva Dweve. Pagina Numerus îl prezintă ca pe o fundație numerică open-source pentru aritmetică deterministă: punct fix binar și zecimal, matematică adaptivă cu virgulă variabilă Dweve AXIOM, operații orientate pe numere întregi, Rust, suprafețe compatibile cu no_std, verificare față de referințe de înaltă precizie acolo unde are sens și profiluri deterministe menite să facă replay-ul mai calm pe țintele suportate. Stratul numeric comun partajat dedesubt este și mai larg: familiile binare, ternare, întregi, fixe, flotante și adaptive AXIOM sub un singur contract de tip Element. Detaliile exacte de implementare contează pentru ingineri. Lecția de produs e mai simplă: aritmetica nu e zgomot de fundal. Este infrastructură.
Sună evident până urmărești unde călătoresc numerele. O simulare alimentează un digital twin. Twin-ul alimentează un dashboard. Dashboard-ul informează o decizie umană. Decizia este înregistrată. O lună mai târziu cineva întreabă de ce. Dacă stratul numeric nu poate reproduce calculul, restul lanțului de dovezi devine șubred. Poate fi în continuare apărabil, dar acum echipa trebuie să explice o sursă de deviație care putea fi evitată. Acesta e un hobby prost.
Virgula flotantă nu este greșită din punct de vedere moral
Acesta nu este un discurs despre virgula flotantă ca fiind rea. Virgula flotantă este unul dintre motivele pentru care calculul modern funcționează. Este rapidă, compactă, bine suportată și exact potrivită pentru multe sarcini de lucru. Problema începe când echipele se prefac că comportamentul ei este un contract universal de guvernanță.
Virgula flotantă trăiește într-o lume a modurilor de rotunjire, diferențelor hardware, alegerilor compilatorului, selecției instrucțiunilor, operațiilor fuzionate, vectorizării, denormalelor, comportamentului bibliotecilor și detaliilor specifice țintei. De cele mai multe ori acest lucru este gestionabil. Uneori este chiar invizibil. Apoi ai nevoie de replay exact pe biți, sau de paritate între ținte, sau de simulare deterministă, sau de un build care ar trebui să se comporte la fel după ce a fost mutat de pe server la edge. Dintr-o dată detaliile nu mai sunt academice. Devin o ședință.
Numerus urmează o altă cale pentru sarcinile de lucru unde repetabilitatea contează mai mult decât prefăcătoria că fiecare operație este un mic sistem meteorologic. Aritmetica doar cu numere întregi face reprezentarea explicită. Formatele cu punct fix definesc unde locuiește virgula zecimală. Familiile zecimale gestionează valorile unde pozițiile exacte contează. Dweve AXIOM oferă o modalitate de a adapta forma exponentului per valoare fără a preda controlul înapoi unui mediu flotant opac. Ideea nu este o singură formă numerică pentru totdeauna. Ideea este alegerea unei forme cu un contract.
Acest lucru contează pentru că sistemele de produs nu doar calculează. Ele își amintesc. Redau. Compară. Explică. Dacă același calcul produce rezultate diferite pe suprafețele acceptate, diferența devine parte a produsului, indiferent dacă cineva a planificat-o sau nu.
O singură bibliotecă numerică este, de fapt, mai multe promisiuni
O fundație numerică nu este un singur lucru. Este un set de promisiuni cu audiențe diferite. Inginerul de embedded își dorește ca platformele cu resurse limitate să poată rula profilele relevante orientate pe numere întregi, fără să atragă un runtime de server confortabil. Inginerul de simulare își dorește ca redarea să poată reproduce o stare. Persoana de audit își dorește ca traseul răspunsului să poată fi explicat. Proprietarul de produs își dorește ca lucrul respectiv să nu se comporte ca un calculator nervos atunci când este mutat dintr-un mediu în altul.
Pagina publică Numerus evidențiază familiile despre care întreabă majoritatea oamenilor mai întâi: fixed-point în format Q, Decimal și AXIOM. Codul este mai amplu. common/numeric conține forme binare XNOR și POPCNT, valori ternare, numere întregi native și sub-byte, aliasuri fixed-point, formate float mici și AXIOM adaptiv. Fațada Numerus adaugă apoi suprafețele orientate spre produs, pentru zecimale și aritmetică, în jurul acelei fundații. Această diviziune contează pentru că evită eleganța falsă de a forța fiecare număr într-un singur costum.
Acesta este un tip de inginerie foarte european, în cel mai bun sens. Mai puțin dramatism, mai mult contract. Calculul ar trebui să spună ce este. Domeniul ar trebui să fie cunoscut. Comportamentul zecimal ar trebui să fie explicit. Constrângerile țintei ar trebui respectate. Rezultatul ar trebui să fie reproductibil. Nimeni nu are nevoie de un keynote pentru asta. Au nevoie să funcționeze.
AXIOM merită propriul articol pentru că nu este doar un alt alias în listă. Este familia adaptivă cu virgulă variabilă a Dweve: semn, indice de exponent și mantisă împachetate într-o reprezentare compactă, cu liste de exponenți selectate pentru date generale, dense, cu granulație fină sau în formă de rețea neurală. Această postare doar îl plasează în harta Numerus. Povestea mai profundă este cum selecția adaptivă a exponenților oferă mai mult spațiu magnitudinilor în schimbare, fără a face aritmetica non-deterministă din nou.
De asemenea, previne supra-promisiunile. Numerus nu face fiecare problemă numerică ușoară. Nu elimină nevoia de a alege scale, domenii, comportament de rotunjire, liste de exponenți, lățimi de mantisă sau domenii de verificare. Aritmetica fixed-point și cea cu virgulă variabilă pot fi ambele folosite greșit cu mare entuziasm. Valoarea este că utilizarea greșită devine mai vizibilă. Un contract numeric explicit îți oferă ceva de revizuit. O presupunere ascunsă de tip floating îți oferă un mic fantomă în producție.
Verificarea nu este o insignă
Fiecare bibliotecă numerică învață în cele din urmă că vorbe precum corect și precis sunt ieftine până când sunt atașate unui harness. Corect unde? Preciz față de ce? Pe ce domeniu de intrare? Cu ce comportament de rotunjire? Pe ce versiune? Sub ce teste?
Materialul Numerus pune verificarea în prim-plan: CORDIC doar cu numere întregi pentru funcții transcendentale, comparație împotriva unui oracol MPFR de înaltă precizie, teste de proprietăți și verificări de lansare. Afirmația exactă are sens doar atunci când este legată de acel mecanism. O insignă care spune precis este decor. Un harness care compară, micșorează și eșuează este inginerie.
Această distincție contează pentru că erorile numerice se ascund adesea la margini. Mijlocul domeniului se comportă corect. Demo-ul se comportă corect. Valorile obișnuite se comportă corect. Apoi sosește valoarea de la graniță, cu clipboard-ul în mână. Intrările negative, valorile aproape de zero, granițele de depășire, tranzițiile de scară, egalitățile la rotunjire, granițele listelor de exponenți și operațiile repetate sunt locurile în care bibliotecile numerice fie câștigă încredere, fie încep să scrie ficțiune.
Testele de proprietăți sunt utile pentru că oamenii sunt slabi la a-și imagina toate modurile în care un număr poate fi enervant. Un oracol de înaltă precizie este util pentru că implementarea are nevoie de o referință care nu este ea însăși. Verificările de lansare sunt utile pentru că o afirmație verificată luna trecută nu este o garanție pentru luna aceasta. Software-ul nu rămâne corect din politețe.
Determinismul ține de arhitectură, nu de o notă de subsol
Este tentant să tratezi aritmetica deterministă ca pe un detaliu de bibliotecă de nivel scăzut. Așa o pierd multe echipe. Până când produsul are nevoie de redare, ipotezele numerice sunt deja răspândite peste servicii, notebook-uri, ținte încorporate, instrumente de model și teste de integrare. Apoi determinismul devine o modernizare ulterioară. Modernizările ulterioare sunt locul unde bugetele își dezvoltă caracterul.
Momentul potrivit pentru a decide postura numerică este devreme. Are această sarcină nevoie de redare stabilă la nivel de bit? Traversează mașini? Traversează arhitecturi? Susține o decizie reglementată? Alimentează o simulare? Devine date de antrenament, intrare de inferență, ieșire de compresie a modelului sau stare de geamăn digital? Dacă da, aritmetica este arhitecturală.
Numerus se potrivește lângă FMI și Twin exact din acest motiv. FMI se ocupă de nuclee de simulare deterministe și de schimb de modele. Twin se ocupă de redarea stării operaționale sau fizice în timp. Ledger înregistrează evenimente operaționale. Trace transportă dovezi de calcul redabile. Acele straturi devin mai calme doar când stratul numeric de dedesubt nu se abate ca un cărucior de cumpărături cu o roată stricată.
În sistemele de AI acest lucru devine și mai concret. Cuantizarea, scorarea, clasarea, simularea, constrângerile, calibrarea, compresia și redarea folosesc toate numere. Dacă acele numere se comportă diferit între medii, modelul s-ar putea să nu fie partea vinovată. Este pur și simplu suspectul cel mai vizibil. Convenabil, dar nu întotdeauna corect.
Mașinile mici nu sunt cetățeni de mâna a doua
O mulțime de arhitecturi de AI și simulare presupun în liniște o mașină confortabilă. Va exista un server. Va exista un GPU. Va exista suficientă memorie. Va exista un serviciu cloud. Va exista o factură care face pe cineva să inventeze expresia investiție strategică.
Sistemele reale sunt mai puțin ordonate. Unele calcule trebuie să ruleze pe ținte încorporate. Unele trăiesc la margine. Unele stau în dispozitive fără unitate în virgulă mobilă. Unele au nevoie de compatibilitate no_std. Unele trebuie să continue să funcționeze când rețeaua nu este invitată. Dacă fundația numerică se comportă corect doar în cazul confortabil, nu este o fundație. Este mobilier.
Artimetica pe numere întregi ajută aici, deoarece reduce dependența de comportamentul specific virgulei mobile al platformei țintă, acolo unde volumul de lucru poate folosi aceste profiluri. Suprafețele compatibile cu no_std ajută, deoarece nu orice mediu are luxurile bibliotecii standard ale unui proces de server. Ideea nu este nostalgia pentru mașini mai mici. Este controlul asupra contractului numeric care ajunge pe țintele cu constrângeri.
Nu este vorba despre nostalgie pentru mașini mai mici. Este vorba despre control. Dacă calculul face parte din produs, produsul nu ar trebui să necesite cel mai confortabil mediu doar pentru a fi demn de încredere.
Exemplul plictisitor este cel important
Imaginați-vă un calcul de dozare, un calcul tarifar, un pas de simulare, o valoare de senzor redată sau un prag de compresie a modelului. Niciunul nu sună spectaculos. Bine. Spectacolul este de obicei locul unde începe vorba goală. Exemplele plictisitoare sunt cele unde determinismul numeric își dovedește utilitatea.
Dacă rezultatul este folosit o dată și uitat, o mică abatere poate să nu conteze. Dacă rezultatul este înregistrat și redat, contează. Dacă este comparat între medii, contează. Dacă alimentează o decizie ulterioară, contează. Dacă un client, un auditor sau un inginer poate întreba de ce a apărut această valoare, cu siguranță contează. În acel moment, calculul nu mai este un detaliu intern de implementare. Face parte din povestea pe care o spune produsul.
De aceea, Numerus nu este doar o bibliotecă de matematică în abstract. Este o componentă într-o arhitectură a dovezilor. Oferă altor sisteme un strat numeric mai calm pe care să se sprijine. Reed poate analiza sursa cu chitanțe. Ledger poate înregistra evenimente. BitWeave poate face regăsirea deterministă. HEDL poate face datele structurate mai puțin risipitoare. Numerus face aritmetica mai puțin alunecoasă. Fiecare piesă elimină un loc în care sistemul ar da altfel din umeri.
Lecția
Lecția lui Numerus este că numerele sunt comportament de produs. Nu doar detaliu de implementare. Nu doar matematică. Comportament. Dacă aceeași intrare poate produce un răspuns diferit atunci când este mutată într-un alt mediu acceptat, acea diferență aparține acum produsului.
Aritmetica deterministă nu este întotdeauna necesară. Când este necesară, ar trebui proiectată de la început, nu cerută mai târziu cu insistență. Alegeți familii numerice explicite. Verificați față de un oracol. Testați cazurile limită. Respectați constrângerile de implementare. Țineți cont de redare înainte ca primul raport de incident să îi facă pe toți brusc filozofi.
Numerus este util pentru că transformă aritmetica într-un contract de care restul stivei se poate baza. Binary, ternary, integer, fixed, float, Decimal și AXIOM nu sunt sloganuri. Sunt modalități de a modela numerele astfel încât același răspuns să poată apărea de două ori, intenționat. AXIOM are propria poveste mai profundă, deoarece este partea în care punctul însuși începe să se miște, în timp ce contractul rămâne determinist. Nu este spectaculos. Este mai bun decât spectaculos. Este genul de plictiseală care le permite sistemelor serioase să doarmă liniștite noaptea.