Numerus e la stessa risposta due volte
Il bug che esiste solo sull'altra macchina
Il bug numerico più irritante è quello che si rifiuta di comparire dove stai guardando. Il test fallisce sulla CI, non in locale. La simulazione deriva dopo un aggiornamento di una dipendenza. Il target embedded produce un risultato leggermente diverso dal server. La pipeline del modello sembra a posto finché la riproduzione non chiede lo stesso calcolo due volte e riceve due risposte abbastanza vicine da far nascere una discussione.
Vicino a volte va bene. Vicino non è sempre un contratto. Se un calcolo fa parte di un percorso di riproduzione, di un controllo di sicurezza, di una simulazione, di una decisione di prezzo, di un gemello digitale, di una traccia di audit o di un passaggio di compressione del modello, allora vicino può trasformarsi in un rischio di prodotto. La differenza può essere minima. Le differenze minime sono comunque differenze. Il software ha costruito intere carriere sull'essere offeso dalle differenze minime.
Questo è il motivo per cui Numerus esiste nello stack Dweve. La pagina di Numerus lo presenta come una base numerica open source per l'aritmetica deterministica: virgola fissa binaria e decimale, matematica adattiva a virgola variabile Dweve AXIOM, operazioni orientate agli interi, Rust, superfici compatibili con no_std, verifica rispetto a riferimenti ad alta precisione dove ha senso, e profili deterministici pensati per rendere la riproduzione più stabile sui target supportati. Il livello numerico comune condiviso sottostante è ancora più ampio: famiglie binarie, ternarie, intere, fisse, mobili e adattive AXIOM sotto un unico contratto in stile Element. I dettagli implementativi esatti contano per gli ingegneri. La lezione di prodotto è più semplice: l'aritmetica non è rumore di fondo. È infrastruttura.
Sembra ovvio finché non segui dove viaggiano i numeri. Una simulazione alimenta un gemello digitale. Il gemello alimenta una dashboard. La dashboard informa una decisione umana. La decisione viene registrata. Un mese dopo qualcuno chiede perché. Se il livello numerico non può riprodurre il calcolo, il resto della catena di prove diventa traballante. Potrebbe essere ancora difendibile, ma ora il team deve spiegare una fonte di deriva evitabile. È un hobby pessimo.
La virgola mobile non è moralmente sbagliata
Questo non è un sermone sul fatto che la virgola mobile sia malvagia. La virgola mobile è uno dei motivi per cui il calcolo moderno funziona. È veloce, compatta, ben supportata ed esattamente giusta per molti carichi di lavoro. Il problema inizia quando i team fingono che il suo comportamento sia un contratto di governance universale.
La virgola mobile vive in un mondo di modalità di arrotondamento, differenze hardware, scelte del compilatore, selezione delle istruzioni, operazioni fuse, vettorizzazione, denormali, comportamento delle librerie e dettagli specifici del target. La maggior parte delle volte è gestibile. A volte è persino invisibile. Poi ti serve una riproduzione bit-exact, o una parità tra target, o una simulazione deterministica, o una build che dovrebbe comportarsi allo stesso modo dopo essere stata spostata dal server all'edge. All'improvviso i dettagli smettono di essere accademici. Diventano una riunione.
Numerus prende una strada diversa per i carichi di lavoro in cui la ripetibilità conta più che fingere che ogni operazione sia un minuscolo sistema meteorologico. L'aritmetica solo intera rende esplicita la rappresentazione. I formati a virgola fissa definiscono dove vive il decimale. Le famiglie decimali gestiscono i valori in cui le cifre esatte contano. Dweve AXIOM offre un modo per adattare la forma dell'esponente per ogni valore senza restituire il controllo a un ambiente a virgola mobile opaco. Il punto non è una sola forma numerica per sempre. Il punto è scegliere una forma con un contratto.
Questo è importante perché i sistemi di prodotto non si limitano a calcolare. Ricordano. Riproducono. Confrontano. Spiegano. Se lo stesso calcolo produce risultati diversi tra le superfici supportate, la differenza diventa parte del prodotto, che qualcuno l'abbia pianificata o no.
Una libreria numerica è in realtà più promesse
Una base numerica non è una cosa sola. È un insieme di promesse con destinatari diversi. L'ingegnere embedded tiene a che i target vincolati possano eseguire i profili orientati agli interi pertinenti senza trascinarsi dietro un comodo runtime server. L'ingegnere di simulazione tiene a che la riproduzione possa ricreare uno stato. La persona che fa audit tiene a che il percorso della risposta possa essere spiegato. Il product owner tiene a che la cosa non si comporti come una calcolatrice nervosa quando viene spostata da un ambiente all'altro.
La pagina pubblica di Numerus mette in evidenza le famiglie che la maggior parte delle persone chiede per prime: fixed-point in formato Q, Decimal e AXIOM. Il codebase è più ampio. common/numeric contiene forme binarie XNOR e POPCNT, valori ternari, interi nativi e sub-byte, alias fixed-point, formati float piccoli e AXIOM adattivo. La facciata Numerus aggiunge poi le superfici decimali e aritmetiche rivolte al prodotto attorno a quella base. Questa divisione è importante perché evita la falsa eleganza di costringere ogni numero in un unico abito.
Questo è un tipo di ingegneria molto europeo, nel senso migliore. Meno dramma, più contratto. Il calcolo dovrebbe dichiarare cosa è. L'intervallo dovrebbe essere noto. Il comportamento decimale dovrebbe essere esplicito. I vincoli del target dovrebbero essere rispettati. Il risultato dovrebbe essere riproducibile. Nessuno ha bisogno di un keynote per questo. Hanno bisogno che funzioni.
AXIOM merita un articolo a parte perché non è solo un altro alias nella lista. È la famiglia a virgola variabile adattiva di Dweve: segno, indice di esponente e mantissa impacchettati in una rappresentazione compatta, con liste di esponenti selezionate per dati generali, densi, a grana fine o a forma di rete neurale. Questo post la colloca solo nella mappa di Numerus. La storia più profonda è come la selezione adattiva degli esponenti dia più spazio alle magnitudini variabili senza rendere di nuovo non deterministico il calcolo.
Questo evita anche di fare affermazioni eccessive. Numerus non rende facile ogni problema numerico. Non elimina la necessità di scegliere scale, intervalli, comportamento di arrotondamento, liste di esponenti, larghezze di mantissa o domini di verifica. L'aritmetica fixed-point e a virgola variabile possono entrambe essere usate male con grande entusiasmo. Il valore è che l'uso improprio diventa più visibile. Un contratto numerico esplicito ti dà qualcosa da rivedere. Un'ipotesi fluttuante nascosta ti dà un piccolo fantasma in produzione.
La verifica non è un distintivo
Ogni libreria numerica impara prima o poi che parole come corretto e preciso costano poco finché non sono agganciate a un harness. Corretto dove? Preciso rispetto a cosa? Su quale dominio di input? Con quale comportamento di arrotondamento? Su quale release? Sotto quali test?
Il materiale di Numerus mette la verifica in primo piano: CORDIC solo interi per funzioni trascendenti, confronto con un oracolo MPFR ad alta precisione, test di proprietà e controlli di release. L'affermazione esatta ha senso solo se legata a quel meccanismo. Un distintivo che dice accurato è decorazione. Un harness che confronta, riduce e fallisce è ingegneria.
Questa distinzione è importante perché i bug numerici si nascondono spesso ai bordi. Il centro del dominio si comporta bene. La demo si comporta bene. I valori ordinari si comportano bene. Poi arriva il valore al limite, con la sua cartellina sotto il braccio. Input negativi, valori prossimi allo zero, soglie di overflow, transizioni di scala, pareggi di arrotondamento, confini di liste di esponenti e operazioni ripetute: è qui che le librerie numeriche guadagnano fiducia o iniziano a scrivere narrativa.
I test di proprietà sono utili perché gli esseri umani faticano a immaginare tutti i modi in cui un numero può essere fastidioso. Un oracolo ad alta precisione è utile perché l'implementazione ha bisogno di un riferimento che non sia sé stessa. I controlli di rilascio sono utili perché un'affermazione verificata il mese scorso non è una garanzia per questo mese. Il software non rimane corretto per cortesia.
La determinismo appartiene all'architettura, non a una nota a piè di pagina
È tentazione trattare l'aritmetica deterministica come un dettaglio di basso livello della libreria. È proprio lì che molti team la perdono. Quando il prodotto ha bisogno di riproduzione, le assunzioni numeriche sono già sparse tra servizi, notebook, target embedded, strumenti di modellazione e test di integrazione. Poi il determinismo diventa un retrofit. E i retrofit sono il posto dove i budget vanno a sviluppare carattere.
Il momento giusto per decidere la postura numerica è presto. Questo carico di lavoro richiede riproduzione bit-stabile? Attraversa macchine diverse? Attraversa architetture diverse? Supporta una decisione regolamentata? Alimenta una simulazione? Diventa dati di addestramento, input di inferenza, output di compressione del modello o stato di un gemello digitale? Se sì, l'aritmetica è architetturale.
Numerus si affianca a FMI e Twin esattamente per questo motivo. FMI si occupa di kernel di simulazione deterministici e di scambio di modelli. Twin si occupa di riprodurre lo stato operativo o fisico nel tempo. Ledger registra gli eventi operativi. Trace trasporta prove di calcolo riproducibili. Questi livelli diventano più tranquilli solo quando lo strato numerico sottostante non deriva come un carrello della spesa con una ruota rotta.
Nei sistemi di IA questo diventa ancora più concreto. Quantizzazione, scoring, ranking, simulazione, vincoli, calibrazione, compressione e riproduzione usano tutti numeri. Se questi numeri si comportano diversamente tra ambienti diversi, il modello potrebbe non essere il colpevole. È semplicemente il sospetto più visibile. Comodo, ma non sempre corretto.
Le macchine piccole non sono cittadini di seconda classe
Molta architettura di IA e simulazione assume in silenzio una macchina confortevole. Ci sarà un server. Ci sarà una GPU. Ci sarà abbastanza memoria. Ci sarà un servizio cloud. Ci sarà una fattura che spinge qualcuno a inventare l'espressione investimento strategico.
I sistemi reali sono meno ordinati. Alcuni calcoli devono girare su target embedded. Alcuni vivono al confine. Alcuni stanno dentro dispositivi senza unità a virgola mobile. Alcuni richiedono compatibilità no_std. Alcuni devono continuare a funzionare quando la rete non è invitata. Se la base numerica si comporta bene solo nel caso comodo, non è una base. È un mobile.
L'aritmetica orientata agli interi aiuta in questo contesto perché riduce la dipendenza dal comportamento floating specifico della piattaforma quando il carico di lavoro può utilizzare quei profili. Le superfici compatibili con no_std aiutano perché non tutti gli ambienti dispongono dei comfort della libreria standard di un processo server. Il punto non è la nostalgia per macchine più piccole. È il controllo su quale contratto numerico arriva ai target vincolati.
Questa non è nostalgia per macchine più piccole. È controllo. Se il calcolo fa parte del prodotto, il prodotto non dovrebbe richiedere l'ambiente più confortevole solo per essere affidabile.
L'esempio noioso è quello importante
Immagina un calcolo di dosaggio, un calcolo tariffario, un passo di simulazione, un valore di sensore riprodotto o una soglia di compressione del modello. Nessuno di questi suona affascinante. Bene. Il fascino è di solito dove iniziano le approssimazioni. Gli esempi noiosi sono dove la determinismo numerico dimostra il suo valore.
Se il risultato viene usato una volta e dimenticato, una piccola deriva potrebbe non avere importanza. Se il risultato viene registrato e riprodotto, la deriva conta. Se viene confrontato tra ambienti diversi, conta. Se alimenta una decisione successiva, conta. Se un cliente, un revisore o un ingegnere può chiedere perché è apparso questo valore, allora conta di sicuro. A quel punto il calcolo non è più un dettaglio implementativo interno. È parte della storia che il prodotto racconta.
Ecco perché Numerus non è solo una libreria matematica in astratto. È un componente di un'architettura di evidenza. Offre agli altri sistemi uno strato numerico più stabile su cui appoggiarsi. Reed può analizzare il codice sorgente con ricevute. Ledger può registrare eventi. BitWeave può rendere deterministico il recupero. HEDL può rendere i dati strutturati meno dispendiosi. Numerus rende l'aritmetica meno scivolosa. Ogni pezzo elimina un punto in cui il sistema altrimenti si limiterebbe a fare spallucce.
La lezione
La lezione di Numerus è che i numeri sono comportamento di prodotto. Non solo dettaglio implementativo. Non solo matematica. Comportamento. Se lo stesso input può produrre una risposta diversa quando viene spostato in un altro ambiente supportato, quella differenza ora appartiene al prodotto.
L'aritmetica deterministica non è sempre richiesta. Quando è richiesta, dovrebbe essere progettata fin dall'inizio invece di essere implorata in un secondo momento. Scegli famiglie numeriche esplicite. Verifica con un oracolo. Testa i casi limite. Rispetta i vincoli di distribuzione. Tieni presente la riproduzione prima che il primo rapporto di incidente renda tutti improvvisamente filosofici.
Numerus è utile perché trasforma l'aritmetica in un contratto su cui il resto dello stack può fare affidamento. Binary, ternary, integer, fixed, float, Decimal e AXIOM non sono slogan. Sono modi per modellare i numeri così che la stessa risposta possa apparire due volte, di proposito. AXIOM ha la sua storia più approfondita perché è la parte in cui il punto stesso inizia a muoversi mentre il contratto rimane deterministico. Non è appariscente. È meglio che appariscente. È quel tipo di noiosità che permette ai sistemi seri di dormire sonni tranquilli.