Numerus ja sama vastaus kahdesti
Bug, joka esiintyy vain toisella koneella
Ärsyttävin numeerinen bugi on sellainen, joka ei suostu ilmestymään sinne, minne katsot. Testi kaatuu CI:ssä, ei paikallisesti. Simulaatio ajautuu harhaan riippuvuuspäivityksen jälkeen. Sulautettu kohde tuottaa hieman erilaisen tuloksen kuin palvelin. Malliputki näyttää hyvältä, kunnes toisto pyytää samaa laskentaa kahdesti ja saa kaksi vastausta, jotka ovat tarpeeksi lähellä toisiaan aloittaakseen väittelyn.
Lähellä on joskus riittävää. Lähellä ei ole aina sopimus. Jos laskenta on osa toistopolkua, turvatarkistusta, simulaatiota, hinnoittelupäätöstä, digitaalista kaksosta, auditointijälkeä tai mallin pakkausvaihetta, lähellä voi muuttua tuoteriskiksi. Ero voi olla pieni. Pienet erot ovat silti eroja. Ohjelmisto on tehnyt kokonaisia uria siitä, että se loukkaantuu pienistä eroista.
Tästä syystä Numerus on olemassa Dweve-pinossa. Numerus-sivu kuvaa sen avoimen lähdekoodin numeerisena perustana deterministiselle aritmetiikalle: binääri- ja desimaalikiintoluku, Dweve AXIOM -adaptiivinen muuttuvapisteinen matematiikka, kokonaislukupainotteinen toiminta, Rust, no_std-kykenevät pinnat, varmennus korkean tarkkuuden referenssejä vasten silloin kun se on mielekästä, sekä deterministiset profiilit, joiden tarkoitus on tehdä toistosta rauhallisempaa tuetuilla kohteilla. Jaettu yhteinen numeerinen kerros alla on vielä laajempi: binääri-, kolmio-, kokonaisluku-, kiinto-, liukuluku- ja adaptiiviset AXIOM-perheet yhden Element-tyylisen sopimuksen alla. Tarkat toteutusyksityiskohdat ovat insinööreille tärkeitä. Tuoteopetus on yksinkertaisempi: aritmetiikka ei ole taustakohinaa. Se on infrastruktuuria.
Se kuulostaa itsestäänselvyydeltä, kunnes seuraat, minne luvut kulkevat. Simulaatio ruokkii digitaalista kaksosta. Kaksonen ruokkii kojelautaa. Kojelauta informoi ihmisen päätöstä. Päätös tallennetaan. Kuukautta myöhemmin joku kysyy miksi. Jos numeerinen kerros ei pysty toistamaan laskentaa, muu todistusketju alkaa horjua. Se voi silti olla puolustettavissa, mutta nyt tiimin on selitettävä vältettävissä oleva ajautumisen lähde. Se on huono harrastus.
Liukuluku ei ole moraalisesti väärin
Tämä ei ole saarna siitä, että liukuluku olisi pahasta. Liukuluku on yksi syistä, miksi moderni tietojenkäsittely toimii. Se on nopea, kompakti, hyvin tuettu ja täsmälleen oikea moneen työkuormaan. Ongelma alkaa, kun tiimit teeskentelevät, että sen käyttäytyminen on universaali hallintasopimus.
Liukuluku elää maailmassa, jossa on pyöristystiloja, laitteistoeroja, kääntäjävalintoja, käskyvalintaa, fuusioituja operaatioita, vektorointia, denormaaleja, kirjastokäyttäytymistä ja kohdekohtaisia yksityiskohtia. Suurimman osan ajasta tämä on hallittavissa. Joskus se on jopa näkymätöntä. Sitten tarvitset bittitarkan toiston, tai ristiinkohtaisen pariteetin, tai deterministisen simulaation, tai buildin, jonka pitäisi käyttäytyä samoin siirrettäessä palvelimelta reunalle. Yhtäkkiä yksityiskohdat lakkaavat olemasta akateemisia. Niistä tulee palaveri.
Numerus ottaa erilaisen polun työkuormille, joissa toistettavuus on tärkeämpää kuin teeskentely, että jokainen operaatio on pieni sääjärjestelmä. Kokonaislukuaritmetiikka tekee esityksestä eksplisiittisen. Kiintolukuformaatit määrittelevät, missä desimaali sijaitsee. Desimaaliperheet käsittelevät arvoja, joissa tarkoilla paikoilla on merkitystä. Dweve AXIOM tarjoaa tavan mukauttaa eksponentin muotoa arvokohtaisesti luovuttamatta hallintaa takaisin läpinäkymättömälle liukulukuympäristölle. Pointti ei ole yksi numeerinen muoto ikuisesti. Pointti on valita muoto, jolla on sopimus.
Sillä on merkitystä, koska tuotejärjestelmät eivät pelkästään laske. Ne muistavat. Ne toistavat. Ne vertailevat. Ne selittävät. Jos sama laskenta tuottaa eri tuloksia tuettujen alustojen välillä, erosta tulee osa tuotetta riippumatta siitä, suunnitteliko kukaan sitä.
Yksi numerokirjasto on oikeastaan useita lupauksia
Numeerinen perusta ei ole yksi asia. Se on joukko lupauksia, joilla on eri yleisöt. Sulautettujen järjestelmien insinööri välittää siitä, että rajoitetut kohdealustat voivat ajaa asiaankuuluvat kokonaislukupainotteiset profiilit ilman, että ne raahaavat mukanaan mukavaa palvelinajoympäristöä. Simulointi-insinööri välittää siitä, että toisto pystyy tuottamaan tilan uudelleen. Auditointihenkilö välittää siitä, että vastauspolku voidaan selittää. Tuoteomistaja välittää siitä, että asia ei käyttäydy kuin hermostunut laskin, kun se siirretään ympäristöstä toiseen.
Julkinen Numerus-sivu nostaa esiin perheet, joista useimmat kysyvät ensimmäisenä: Q-muotoinen kiinteän pilkun aritmetiikka, Decimal ja AXIOM. Koodikanta on laajempi. common/numeric sisältää binääriset XNOR- ja POPCNT-muodot, kolmiarvoiset arvot, natiivit ja alibittiset kokonaisluvut, kiinteän pilkun aliakset, pienet liukulukumuodot ja mukautuvan AXIOMin. Numerus-julkisivu lisää tämän perustan ympärille tuotepuolen desimaali- ja aritmetiikkapinnat. Tämä jako on tärkeä, koska se välttää sen teennäisen siisteyden, että jokainen luku pakotettaisiin yhteen asuun.
Tämä on hyvin eurooppalaista insinöörityötä parhaassa mielessä. Vähemmän draamaa, enemmän sopimusta. Laskennan pitäisi kertoa, mitä se on. Alueen pitäisi olla tiedossa. Desimaalikäyttäytymisen pitäisi olla yksiselitteistä. Kohdealustan rajoitteita pitäisi kunnioittaa. Tuloksen pitäisi olla toistettavissa. Kukaan ei tarvitse pääpuhetta sille. He tarvitsevat sen toimivan.
AXIOM ansaitsee oman artikkelinsa, koska se ei ole vain yksi alias listassa. Se on Dweven mukautuva muuttuvapilkkuinen perhe: etumerkki, eksponentti-indeksi ja mantissa pakattuna kompaktiin esitykseen, ja eksponenttilistat valittuina yleiselle, tiheälle, hienojakoiselle tai neuroverkon muotoiselle datalle. Tämä kirjoitus vain sijoittaa sen Numerus-kartalle. Syvempi tarina on se, miten mukautuva eksponentin valinta antaa muuttuville suuruusluokille enemmän tilaa tekemättä aritmetiikasta uudelleen epädeterminististä.
Se myös estää ylilyönnit väitteissä. Numerus ei tee jokaisesta numeerisesta ongelmasta helppoa. Se ei poista tarvetta valita asteikkoja, alueita, pyöristyskäyttäytymistä, eksponenttilistoja, mantissanleveyksiä tai varmennusalueita. Kiinteän pilkun ja muuttuvapilkkuista aritmetiikkaa voi molempia käyttää väärin suurella innolla. Arvo on siinä, että väärinkäytöstä tulee näkyvämpää. Yksiselitteinen numeerinen sopimus antaa sinulle jotakin tarkasteltavaksi. Piilotettu liukulukuoletus antaa sinulle pienen haamun tuotantoympäristöön.
Varmennus ei ole merkki
Jokainen numerokirjasto oppii lopulta, että sanat kuten oikea ja tarkka ovat halpoja, kunnes ne kiinnitetään testivaljaisiin. Oikea missä? Tarkka mihin verrattuna? Millä syötealueella? Millä pyöristyskäyttäytymisellä? Millä julkaisuversiolla? Millä testeillä?
Numerus-materiaali nostaa varmennuksen etualalle: kokonaisluku-CORDIC transsendentaalifunktioille, vertailu korkean tarkkuuden MPFR-orakkelia vastaan, ominaisuustestit ja julkaisutarkistukset. Tarkka väite on merkityksellinen vain, kun se sidotaan näihin mekanismeihin. Merkki, joka sanoo tarkka, on koristetta. Valjaat, jotka vertailevat, kutistavat ja epäonnistuvat, ovat insinöörityötä.
Tämä ero on tärkeä, koska numeeriset bugit piileskelevät usein reunoilla. Alueen keskiosa toimii. Demo toimii. Tavalliset arvot toimivat. Sitten rajapinnan arvo saapuu lehtiö kainalossaan. Negatiiviset syötteet, nollan lähellä olevat arvot, ylivuotorajat, asteikon vaihdokset, pyöristystasapelit, eksponenttilistan rajat ja toistuvat operaatiot ovat niitä paikkoja, joissa numeeriset kirjastot joko ansaitsevat luottamuksen tai alkavat kirjoittaa fiktiota.
Ominaisuustestaus on hyödyllistä, koska ihmiset ovat huonoja kuvittelemaan kaikkia tapoja, joilla luku voi olla hankala. Korkean tarkkuuden oraakkeli on hyödyllinen, koska toteutus tarvitsee referenssin, joka ei ole itsensä. Julkaisutarkistukset ovat hyödyllisiä, koska viime kuun varmennettu väite ei ole takuu tälle kuulle. Ohjelmisto ei pysy oikeana kohteliaisuudesta.
Determinismi kuuluu arkkitehtuuriin, ei alaviitteeseen
On houkuttelevaa kohdella determinististä aritmetiikkaa matalan tason kirjastoyksityiskohtana. Siinä monet tiimit sen menettävät. Siihen mennessä, kun tuote tarvitsee toistoa, numeeriset oletukset ovat jo levinneet palveluihin, muistikirjoihin, sulautettuihin kohteisiin, mallityökaluihin ja integraatiotesteihin. Sitten determinismistä tulee jälkiasennus. Jälkiasennukset ovat niitä paikkoja, joissa budjetit kehittävät luonnetta.
Oikea hetki päättää numeerisesta asennosta on varhain. Tarvitseeko tämä työmäärä bittivakaan toiston? Ylittääkö se koneita? Ylittääkö se arkkitehtuureja? Tukeeko se säänneltyä päätöstä? Syöttääkö se simulaatiota? Tuleeko siitä koulutusdataa, päättelyn syötettä, mallin pakkausulostuloa tai digitaalisen kaksosen tila? Jos vastaus on kyllä, aritmetiikka on arkkitehtonista.
Numerus sopii FMI:n ja Twinin viereen juuri tästä syystä. FMI välittää deterministisistä simulaatioytimistä ja mallinvaihdosta. Twin välittää operatiivisen tai fyysisen tilan toistamisesta ajan mittaan. Ledger tallentaa operatiiviset tapahtumat. Trace kuljettaa toistettavaa laskentatodistetta. Nämä kerrokset rauhoittuvat vain, kun alla oleva numeerinen kerros ei ajelehdi kuin ostoskärry, jossa on yksi huono pyörä.
AI-järjestelmissä tämä muuttuu vielä konkreettisemmaksi. Kvantisointi, pisteytys, rankkaus, simulointi, rajoitteet, kalibrointi, pakkaus ja toisto käyttävät kaikki lukuja. Jos nämä luvut käyttäytyvät eri tavalla eri ympäristöissä, malli ei välttämättä ole syyllinen osapuoli. Se on yksinkertaisesti näkyvin epäilty. Kätevää, mutta ei aina oikein.
Pienet koneet eivät ole toisen luokan kansalaisia
Paljon AI- ja simulaatioarkkitehtuuria olettaa hiljaa mukavan koneen. Siellä on palvelin. Siellä on GPU. Siellä on tarpeeksi muistia. Siellä on pilvipalvelu. Siellä on lasku, joka saa jonkun keksimään ilmauksen strategineninvestointi.
Todelliset järjestelmät ovat vähemmän siistejä. Jotkin laskelmat on suoritettava sulautetuissa kohteissa. Jotkin elävät reunalla. Jotkin istuvat laitteissa ilman liukulukuyksikköä. Jotkin tarvitsevat no_std-yhteensopivuutta. Jotkin on pidettävä toiminnassa, kun verkkoa ei ole kutsuttu paikalle. Jos numeerinen perusta käyttäytyy vain mukavassa tapauksessa, se ei ole perusta. Se on huonekalu.
Kokonaislukuaritmetiikka auttaa tässä, koska se vähentää riippuvuutta kohdeympäristön liukulukukäyttäytymisestä silloin, kun työkuorma voi käyttää näitä profiileja. no_std-ympäristöihin soveltuvat pinnat auttavat, koska kaikissa ympäristöissä ei ole palvelinprosessin standardikirjaston ylellisyyksiä. Kyse ei ole nostalgiasta pienempiä koneita kohtaan. Kyse on hallinnasta siitä, mikä numeerinen sopimus kulkee rajoitettuihin kohdeympäristöihin.
Tämä ei ole nostalgiaa pienempiä koneita kohtaan. Kyse on hallinnasta. Jos laskenta on osa tuotetta, tuotteen ei pitäisi vaatia mukavinta ympäristöä ollakseen luotettava.
Tylsä esimerkki on tärkein
Kuvittele annostelulaskenta, tariffilaskenta, simulaatioaskel, toistettu anturin arvo tai mallin pakkauskynnys. Yksikään näistä ei kuulosta glamourilta. Hyvä. Glamour on yleensä siellä, missä summittainen selittely alkaa. Tylsät esimerkit ovat niitä, joissa numeerinen deterministisyys osoittaa arvonsa.
Jos tulosta käytetään kerran ja unohdetaan, pieni poikkeama ei välttämättä haittaa. Jos tulos tallennetaan ja toistetaan, se haittaa. Jos sitä verrataan eri ympäristöjen välillä, se haittaa. Jos se syöttää myöhempää päätöstä, se haittaa. Jos asiakas, auditoija tai insinööri voi kysyä, miksi tämä arvo ilmestyi, se ehdottomasti haittaa. Silloin laskenta ei ole enää sisäinen toteutusyksityiskohta. Se on osa tarinaa, jonka tuote kertoo.
Siksi Numerus ei ole pelkkä matematiikkakirjasto abstraktilla tasolla. Se on osa todisteiden arkkitehtuuria. Se antaa muille järjestelmille rauhallisemman numeerisen kerroksen, jolle nojata. Reed voi jäsentää lähdekoodia kuittien kanssa. Ledger voi tallentaa tapahtumia. BitWeave voi tehdä hausta determinististä. HEDL voi tehdä jäsennellystä datasta vähemmän tuhlailevaa. Numerus tekee aritmetiikasta vähemmän liukasta. Jokainen osa poistaa yhden kohdan, jossa järjestelmä muuten vain kohauttaisi olkiaan.
Opetus
Numeruksen opetus on, että luvut ovat tuotekäyttäytymistä. Eivät pelkkä toteutusyksityiskohta. Eivät pelkkää matematiikkaa. Käyttäytymistä. Jos sama syöte voi tuottaa eri vastauksen, kun se siirretään toiseen tuettuun ympäristöön, se ero kuuluu nyt tuotteelle.
Deterministinen aritmetiikka ei ole aina vaadittua. Kun se on vaadittua, se pitäisi suunnitella sisään sen sijaan, että sitä anellaan olemassaoloon myöhemmin. Valitse eksplisiittiset numeeriset perheet. Varmenna oraakkelia vasten. Testaa kulmat. Kunnioita käyttöönoton rajoitteita. Pidä toistettavuus mielessä ennen kuin ensimmäinen poikkeamaraportti tekee kaikista yhtäkkiä filosofisia.
Numerus on hyödyllinen, koska se muuttaa aritmetiikan sopimukseksi, johon muu pino voi luottaa. Binary, ternary, integer, fixed, float, Decimal ja AXIOM eivät ole iskulauseita. Ne ovat tapoja muotoilla lukuja niin, että sama vastaus voi ilmestyä kahdesti, tarkoituksella. AXIOM saa oman syvemmän tarinansa, koska se on se osa, jossa itse asia alkaa liikkua, kun sopimus pysyy deterministisenä. Se ei ole näyttävää. Se on parempaa kuin näyttävä. Se on sellaista tylsyyttä, jonka ansiosta vakavat järjestelmät voivat nukkua yönsä.