Numerus и същият отговор два пъти
Грешката, която съществува само на другата машина
Най-досадната числова грешка е тази, която отказва да се появи там, където гледаш. Тестът се проваля в CI, не локално. Симулацията се отклонява след актуализация на зависимост. Вградената цел дава леко различен резултат от сървъра. Конвейерът на модела изглежда наред, докато повторното изпълнение не поиска същото изчисление два пъти и не получи два отговора, които са достатъчно близки, за да започнат спор.
Близостта понякога е достатъчна. Близостта не винаги е договор. Ако изчислението е част от път за повторно изпълнение, проверка за безопасност, симулация, ценово решение, цифров близнак, одитна следа или стъпка за компресиране на модел, тогава близостта може да се превърне в продуктов риск. Разликата може да е съвсем малка. Малките разлики си остават разлики. Софтуерът е създавал цели кариери, обиждайки се от малки разлики.
Това е причината Numerus да съществува в стека Dweve. Страницата на Numerus го представя като отворена числова основа за детерминирана аритметика: двоична и десетична аритметика с фиксирана запетая, адаптивна математика с променлива запетая Dweve AXIOM, целочислени операции, Rust, повърхности, съвместими с no_std, проверка спрямо високоточни референции, където има смисъл, и детерминирани профили, предназначени да направят повторното изпълнение по-спокойно в поддържаните цели. Споделеният общ числов слой отдолу е още по-широк: двоични, троични, целочислени, фиксирани, плаващи и адаптивни семейства AXIOM под един договор в стил Element. Точните детайли на реализацията са важни за инженерите. Продуктовият урок е по-прост: аритметиката не е фонов шум. Тя е инфраструктура.
Това звучи очевидно, докато не проследиш къде пътуват числата. Симулация захранва цифров близнак. Близнакът захранва табло. Таблото информира човешко решение. Решението се записва. Месец по-късно някой пита защо. Ако числовият слой не може да възпроизведе изчислението, останалата част от веригата на доказателствата става колеблива. Може все още да е защитимо, но сега екипът трябва да обяснява източник на отклонение, който е можел да бъде избегнат. Това е лошо хоби.
Плаващата запетая не е морално грешна
Това не е проповед за това, че плаващата запетая е зло. Плаващата запетая е една от причините съвременните изчисления да работят. Тя е бърза, компактна, добре поддържана и точно подходяща за много натоварвания. Проблемът започва, когато екипите се преструват, че нейното поведение е универсален договор за управление.
Плаващата запетая живее в свят на режими на закръгляне, хардуерни разлики, избори на компилатора, избор на инструкции, слети операции, векторизация, денормални числа, поведение на библиотеките и специфични за целта детайли. През повечето време това е управляемо. Понякога дори е невидимо. След това ти трябва повторно изпълнение с точност до бит, или паритет между цели, или детерминирана симулация, или сборка, която трябва да се държи по същия начин, след като е преместена от сървъра към периферията. Изведнъж детайлите престават да бъдат академични. Те се превръщат в среща.
Numerus поема по различен път за натоварвания, където повторяемостта има значение повече от това да се преструваме, че всяка операция е малка метеорологична система. Аритметиката само с цели числа прави представянето изрично. Форматите с фиксирана запетая определят къде живее десетичната запетая. Десетичните семейства обработват стойности, където точните позиции имат значение. Dweve AXIOM дава начин за адаптиране на формата на експонентата за всяка стойност, без да се предава контролът обратно на непрозрачна среда с плаваща запетая. Въпросът не е една числова форма завинаги. Въпросът е да се избере форма с договор.
Това има значение, защото продуктовите системи не само изчисляват. Те помнят. Те възпроизвеждат. Те сравняват. Те обясняват. Ако едно и също изчисление дава различни резултати в различните поддържани среди, тази разлика става част от продукта, независимо дали някой я е планирал или не.
Една числова библиотека всъщност е няколко обещания
Числовата основа не е едно нещо. Тя е набор от обещания към различни аудитории. Инженерът на вградени системи иска ограничените платформи да могат да изпълняват съответните целочислени профили, без да влачат удобна сървърна среда за изпълнение. Инженерът по симулации иска възпроизвеждането да може да пресъздаде дадено състояние. Одиторът иска пътят до отговора да може да бъде обяснен. Продуктовият собственик иска нещото да не се държи като нервен калкулатор, когато бъде преместено от една среда в друга.
Публичната страница на Numerus представя семействата, за които повечето хора питат първо: Q-формат с фиксирана запетая, Decimal и AXIOM. Кодовата база е по-широка. common/numeric съдържа двоични форми XNOR и POPCNT, троични стойности, естествени и подбайтови цели числа, псевдоними за фиксирана запетая, малки формати с плаваща запетая и адаптивен AXIOM. Фасадата на Numerus след това добавя продуктово ориентираните повърхности за десетични и аритметични операции около тази основа. Това разделение има значение, защото избягва фалшивата елегантност на вкарването на всяко число в един единствен костюм.
Това е много европейски вид инженерство в най-добрия смисъл. По-малко драма, повече договор. Изчислението трябва да заявява какво е. Диапазонът трябва да е известен. Десетичното поведение трябва да е изрично. Ограниченията на платформата трябва да се спазват. Резултатът трябва да е възпроизводим. Никой не се нуждае от презентация за това. Те се нуждаят от него да работи.
AXIOM заслужава собствена статия, защото не е просто пореден псевдоним в списъка. Той е адаптивното семейство с променлива запетая на Dweve: знак, индекс на степенния показател и мантиса, опаковани в компактно представяне, с избрани списъци от степенни показатели за общи, гъсти, дребнозърнести или оформени като невронна мрежа данни. Тази публикация само го поставя на картата на Numerus. По-задълбочената история е как адаптивният избор на степенен показател дава повече пространство на променящите се величини, без да прави аритметиката отново недетерминирана.
Това също предотвратява надценяването. Numerus не прави всяка числова задача лесна. Той не премахва нуждата от избор на мащаби, диапазони, поведение при закръгляне, списъци от степенни показатели, ширини на мантисата или области за проверка. Аритметиката с фиксирана и променлива запетая може да бъде злоупотребена с голям ентусиазъм. Ценността е, че злоупотребата става по-видима. Изричният числов договор ви дава нещо за преглед. Скритото предположение за плаваща запетая ви дава малък призрак в производството.
Проверката не е значка
Всяка числова библиотека в крайна сметка научава, че думи като коректен и точен са евтини, докато не бъдат прикрепени към тестова рамка. Коректен къде? Точно спрямо какво? Върху коя входна област? С какво поведение при закръгляне? В коя версия? Под кои тестове?
Материалите на Numerus поставят проверката на преден план: целочислен CORDIC за трансцендентни функции, сравнение с високоточен MPFR оракул, property тестове и проверки при издаване на версия. Точното твърдение е смислено само когато е обвързано с тази машинерия. Значка, която казва точен, е декорация. Тестова рамка, която сравнява, свива и отказва, е инженерство.
Тази разлика има значение, защото числените грешки често се крият по ръбовете. Средата на домейна се държи добре. Демото се държи добре. Обикновените стойности се държат добре. После пристига граничната стойност с клипборд в ръка. Отрицателни входове, стойности близо до нулата, граници на препълване, преходи на мащаба, равенства при закръгляне, граници на списъка с експоненти и повтарящи се операции са местата, където числените библиотеки или печелят доверие, или започват да пишат художествена литература.
Property тестовете са полезни, защото хората са лоши в представянето на всички начини, по които едно число може да бъде досадно. Високоточният оракул е полезен, защото имплементацията има нужда от референция, която не е самата тя. Проверките при пускане са полезни, защото проверено твърдение от миналия месец не е гаранция за този месец. Софтуерът не остава коректен от учтивост.
Детерминизмът принадлежи на архитектурата, не в бележка под линия
Изкушаващо е да се третира детерминистичната аритметика като детайл от ниско ниво на библиотеката. Точно там много екипи я губят. Докато продуктът се нуждае от повторение, числените допускания вече са разпръснати из услуги, тетрадки, вградени цели, инструменти за модели и интеграционни тестове. Тогава детерминизмът става преустройство. Преустройствата са местата, където бюджетите отиват да развият характер.
Правилният момент за решаване на числената позиция е рано. Изисква ли тази натовареност битово стабилно повторение? Пресича ли машини? Пресича ли архитектури? Поддържа ли регулирано решение? Храни ли симулация? Става ли данни за обучение, вход за изводи, изход от компресия на модел или състояние на цифров близнак? Ако да, аритметиката е архитектурна.
Numerus стои до FMI и Twin точно поради тази причина. FMI се грижи за детерминистични симулационни ядра и обмен на модели. Twin се грижи за възпроизвеждане на оперативно или физическо състояние във времето. Ledger записва оперативни събития. Trace носи възпроизводими изчислителни доказателства. Тези слоеве стават по-спокойни само когато численият слой отдолу не се отклонява като количка за пазаруване с едно счупено колело.
В AI системите това става още по-конкретно. Квантоване, оценяване, класиране, симулация, ограничения, калибриране, компресия и повторение всички използват числа. Ако тези числа се държат различно в различни среди, моделът може да не е виновната страна. Той е просто най-видимият заподозрян. Удобно, но не винаги правилно.
Малките машини не са граждани от втора класа
Много AI и симулационна архитектура тихо предполага удобна машина. Ще има сървър. Ще има GPU. Ще има достатъчно памет. Ще има облачна услуга. Ще има сметка, която кара някого да измисли фразата стратегическа инвестиция.
Реалните системи са по-малко подредени. Някои изчисления трябва да работят на вградени цели. Някои живеят на ръба. Някои седят в устройства без блок с плаваща запетая. Някои изискват no_std съвместимост. Някои трябва да продължат да работят, когато мрежата не е поканена. Ако числената основа се държи добре само в удобния случай, тя не е основа. Тя е мебел.
Целочислената аритметика помага тук, защото намалява зависимостта от специфичното за дадена платформа поведение на числата с плаваща запетая, когато натоварването може да използва тези профили. Повърхностите, съвместими с no_std, помагат, защото не всяка среда разполага с удобствата на стандартната библиотека на сървърен процес. Въпросът не е в носталгия по по-малките машини. Въпросът е в контрола върху това кой числов договор пътува до ограничените среди.
Това не е носталгия по по-малките машини. Това е контрол. Ако изчислението е част от продукта, продуктът не трябва да изисква най-удобната среда, за да бъде надежден.
Скучният пример е важният
Представете си изчисление на дозировка, изчисление на тарифа, стъпка от симулация, възпроизведена стойност от сензор или праг за компресия на модел. Нито едно от тези не звучи бляскаво. И добре. Блясъкът обикновено е мястото, където започва размиването. Скучните примери са мястото, където числовата детерминираност показва стойността си.
Ако резултатът се използва веднъж и се забрави, малко отклонение може да няма значение. Ако резултатът се записва и възпроизвежда, има значение. Ако се сравнява между среди, има значение. Ако захранва по-късно решение, има значение. Ако клиент, одитор или инженер може да попита защо се е появила тази стойност, определено има значение. В този момент изчислението вече не е вътрешен детайл от реализацията. То е част от историята, която продуктът разказва.
Ето защо Numerus не е просто математическа библиотека в абстрактен смисъл. Той е компонент в архитектура на доказателствата. Дава на другите системи по-спокойен числов слой, върху който да стъпят. Reed може да анализира изходния код с разписки. Ledger може да записва събития. BitWeave може да направи извличането детерминирано. HEDL може да направи структурираните данни по-малко разточителни. Numerus прави аритметиката по-малко хлъзгава. Всяка част премахва едно място, където системата иначе би вдигнала рамене.
Урокът
Урокът на Numerus е, че числата са поведение на продукта. Не просто детайл от реализацията. Не просто математика. Поведение. Ако един и същ вход може да доведе до различен отговор, когато бъде преместен в друга поддържана среда, тази разлика вече принадлежи на продукта.
Детерминираната аритметика не винаги е задължителна. Когато е задължителна, тя трябва да бъде проектирана от самото начало, а не измолвана по-късно. Изберете изрични числови семейства. Проверете срещу еталон. Тествайте крайните случаи. Съобразете се с ограниченията на разгръщането. Имайте предвид възпроизвеждането още преди първият доклад за инцидент да направи всички изведнъж философски настроени.
Numerus е полезен, защото превръща аритметиката в договор, на който останалата част от стека може да разчита. Binary, ternary, integer, fixed, float, Decimal и AXIOM не са лозунги. Те са начини да оформите числата така, че един и същ отговор да може да се появи два пъти, нарочно. AXIOM получава своята по-задълбочена история, защото това е частта, където самата точка започва да се движи, докато договорът остава детерминиран. Това не е бляскаво. По-добре е от бляскаво. Това е видът скучнота, която позволява на сериозните системи да спят спокойно.