Kera i rad na snižavanju
Prijava greške koja nije bila greška
Priča obično počinje brojem koji je gotovo točan. Ne potpuno pogrešnim. Ne pokvarenim na način da nadzorna ploča pocrveni. Gotovo točnim na skup način: vrsta pogreške zbog koje jedan tim objavi proizvod, drugi tim oklijeva, a revizor pita zašto se rezultat promijenio kad se isti model preselio s jednog stroja na drugi.
Jedna se izgradnja izvodi na x86 poslužitelju i daje vrijednost. Sljedeća se izgradnja izvodi na ARM prijenosniku i daje vrijednost dovoljno blizu da demo uspije. GPU put je brži, ali zaokružuje kroz izračun drugačije. FPGA put je privlačan zbog vremenskih uvjeta, ali odjednom tim za softver vodi razgovor o hardveru. Svatko može objasniti mali dio razlike. Nitko ne posjeduje cijeli put od izvora do rezultata.
To je prostor za koji je Kera izgrađena. Ne ideja modela, ne marketinški slajd, ne rad o budućem prevoditelju, nego posao prevoditelja koji počinje kad tim kaže da se isti izračun mora izvoditi na različitim strojevima i i dalje značiti istu stvar. Ta obveza treba vlasnika. Obećanje prevoditelja nije da je spuštanje elegantno. Obećanje je da se spuštanje tretira kao posao.
Spuštanje je dio prevoditelja u kojem lijepa namjera jezika postaje upute koje cilj može izvršiti. To je također mjesto gdje nejasne tvrdnje postaju vidljive. Ako rezultat treba biti bit za bit identičan na CPU-u, GPU-u, FPGA-u i WebAssemblyju, onda prevoditelj ne može slijegati ramenima na razlike cilja. Mora nositi dovoljno strukture da odluči što se smije promijeniti, a što se ne smije promijeniti. Mora poznavati memorijske prostore, učinke, opkode, prijenos podataka, ograničenja cilja i potvrde koje dokazuju da su dvije izgradnje isti izračun.
Primamljiva verzija priče je nazvati to slojem prenosivosti. To je premalo. Prenosivost kaže da se program izvodi negdje drugdje. Kera cilja na težu tvrdnju: program je predstavljen kao graf adresiran sadržajem, preveden u .keg artefakt, spušten na više pozadinskih sustava i i dalje daje isti odgovor. Kuhinja se mijenja. Recept se ne mijenja.
Sredina koju nitko ne želi prodavati
Prvi razgovor s ozbiljnim kupcem rijetko počinje sintaksom. Počinje neredom. Postoji model koji je važan. Postoji simulacija koja je nekad bila istraživanje, a postala je operativna. Postoji izračun rizika čiji rezultat više ne smije varirati ovisno o stroju. Postoji rubna implementacija koja ne može nositi puni oblak runtime. Postoji tim koji želi akcelerator, ali si ne može priuštiti prepisivanje svaki put kad se akcelerator promijeni.
Većina alata ovo čini problemom implementacije. Odaberite cilj, izvezite model, zakrpajte runtime, prihvatite određenu varijancu, zatim napišite dokument koji objašnjava iznimke. Dokument raste. Testna matrica raste. Broj stručnjaka raste. Na kraju organizacija plaća heterogenost dvaput: jednom kad kupi hardver, drugi put kad pokuša dokazati da je hardver obavio isti posao.
Kera kreće sa suprotnog kraja. Kera stranica to naziva statički tipiziranim sistemskim jezikom s graf-native, sadržajno adresiranim IR-om. Ta fraza je važna jer graf nije dekorativni dijagram prevoditelja. To je izvršni objekt. Izvorni kod se spušta u usmjerene acikličke grafove operacija, pohranjene kao .keg datoteke. Svaki čvor nosi definiranu strukturu. Duplicirani rad može se ukloniti strukturno. Isti graf može se spustiti na CPU, GPU, FPGA i WASM bez tretiranja svakog cilja kao zasebnog malog svemira.
Zato se Kera mora ponašati kao ozbiljna kompilatorska infrastruktura, a ne kao dijagram. Neugodna sredina je mjesto gdje živi korisnik. Tokenizacija mora čuvati pozicije bajtova. Parsiranje mora opskrbljivati alate jednako kao i kompilaciju. Provjera tipova mora odbaciti nepodudarnosti oblika i rubova prije nego što postanu događaji u izvođenju. Provjera posudbe mora razumjeti vlasništvo nad memorijom domaćina, uređaja, prikvačenom i objedinjenom memorijom. Optimizacija mora biti ponovljiva. Serijalizacija mora organizaciji dati artefakt koji može zadržati.
Ništa od toga nije spektakularan naslov. Puno je korisnije od naslova. To znači da kada se radno opterećenje premjesti iz razvoja u proizvodnju, ili s CPU osnovice na GPU putanju, kompilator ima stabilnu stvar za usporedbu: otisak grafa. Ako se otisak podudara, posao je isti posao. To je zajednička kontrolna točka koju inženjer, kupac i revizor mogu svi razumjeti.
Graf je potvrda, ne slika
Stari način objašnjavanja programa je pokazati izvorni kod i tražiti od čitatelja da vjeruje kompilatoru. Kera stranica neprestano se vraća na drugi objekt: graf. Svaka operacija je čvor. Rubovi izražavaju ovisnosti. Graf ima sadržaj. Sadržaj ima hash. Hash postaje otisak koji putuje kroz izgradnju.
Ovo zvuči kao unutarnji mehanizam sve dok ne stanete pokraj tima za usklađenost. Tim za usklađenost ne želi znati da dobavljač ima lijepu kompilatorsku arhitekturu. Želi znati je li izračun odobren prošli mjesec isti izračun koji se izvodi danas. Otisak grafa je most između tih svjetova. To nije snimka zaslona kompilatora. To je kompaktan način da se kaže: ovaj skup operacija, ovi tipovi, ovi ulazi, ovi atributi, ova struktura ovisnosti.
Model čvorova namjerno je strog. Čvor je verzija sheme, opcode, deskriptori izlaza, hashovi ulaza i mape atributa raspoređene u kanonskom redoslijedu. Bajtovi se hashiraju sa SHA3-256 pod prefiksima odvojenim domenama, tako da hashovi čvora, regije i grafa žive u odvojenim imenskim prostorima. Ako dva čvora imaju isti opcode, ulaze i atribute, imaju isti hash. Umetanje duplikata vraća postojeći unos. Eliminacija zajedničkih podizraza postaje posljedica reprezentacije, a ne herojski prolaz dodan kasnije.
To je vrsta detalja koja inženjerski sustav pretvara u nešto na što se ljudi mogu osloniti. Kupac ne kupuje dijagram kompilatora. Kupac kupuje manje rasprava o tome je li se izračun promijenio. Programer ne kupuje slogan o determinističkoj umjetnoj inteligenciji. Programer kupuje format grafa u kojem se istost može provjeriti, pohraniti i koristiti alatima. Datoteka .keg stoga nije naknadna misao implementacije. To je prijenosni zapis posla.
Osam malih vrata prije nego što se pojavi cilj
Kad ljudi zamisle prevoditelj, često odmah pomisle na pozadinu. Zamišljaju trenutak kad kod postane AVX, PTX, Verilog ili WASM. Taj je trenutak važan, ali je kasno u priči. Većina posla prevoditelja dogodila se do tada, u tihim fazama koje odlučuju može li se pozadini vjerovati.
Kera počinje s leksičkim analizatorom koji podržava UTF-8 i pretvara izvorni kod u tokene s potpunim praćenjem suvišnih detalja i oporavkom od pogrešaka. To zvuči kao uređivački mehanizam, i jest. To je također pouzdanost alatnog lanca. Ako je svaka pozicija bajta sačuvana, dijagnostika, oblikovanje, ponovno inkrementalno parsiranje i ponašanje jezičnog poslužitelja mogu se uskladiti s onim što je korisnik stvarno napisao. Prevoditelj koji rano izgubi oblik izvora plaća taj gubitak svugdje drugdje.
Parser je zasnovan na događajima: rekurzivni silazak s Prattovim parsiranjem izraza emitira događaje Start, Token, Finish i Error umjesto da gradi jedan AST koji svi moraju dijeliti. Tok događaja neovisno napaja graditelj stabla, oblikovatelj i jezični poslužitelj. Zeleno stablo je bez gubitaka, čuva tokene i suvišne detalje. Graditelj grafa zatim prolazi tim stablom, održava razrješavanje imena i stvara čvor Region za svaku funkciju.
Tek nakon toga izvor postaje graf koji prevoditelj nosi. Strukturno provjeravanje tipova potvrđuje kompatibilnost preko rubova operacija i ograničenja oblika tenzora. Tipovi se podudaraju samo kad su im kanonski hashovi identični. Provjeravač posudbe provodi jedno vlasništvo po vrijednosti, bez pseudonimskih promjenjivih referenci i pravila vlasništva preko memorijskih prostora. Bilješke o učincima provjeravaju se radi dosljednosti. Sporedni učinci nisu prepušteni ukusu ili konvenciji.
Upravitelj prolaza optimizacije zatim obavlja prepoznatljiv posao prevoditelja: savijanje konstanti, uklanjanje zajedničkih podizraza, uklanjanje mrtvog koda, ugrađivanje, vektorizaciju i spajanje petlji u petlji fiksne točke. Važan izraz nije popis prolaza. Važno je ono što se događa nakon svakog prolaza: provjeravač invarijanti grafa provjerava dosljednost hashova i cjelovitost ovisnosti. Optimizaciji je dopušteno poboljšati graf, ne učiniti ga tajanstvenim.
Na kraju, generatorski programi koda specifični za ciljnu platformu emitiraju izvorni kod, PTX, Verilog ili WASM, a optimizirani graf se serijalizira u .keg datoteku s tablicom odjeljaka. Datoteka počinje čarobnim bajtovima KEG\0 i nosi odjeljke za nizove, tipove, atribute, čvorove, regije i izvoz. To je put koji tim mora usvojiti prije nego što može pošteno govoriti o ciljnim platformama.
Ciljne platforme nisu naljepnice na slajdu
Popis ciljnih platformi lako je napisati, a teško zaslužiti. CPU, GPU, FPGA i WASM uredno stanu u karticu proizvoda. Spuštanje na njih mjesto je gdje se skriva račun. Svaka ciljna platforma ima svoje navike, snage i načine otkazivanja. Prevoditelj koji želi determinističko heterogeno izvođenje ne može te navike tretirati kao tuđi problem.
Na CPU-ima, Kera emitira izvorni strojni kod za x86-64 i ARM64, a RISC-V Vector nalazi se u tehničkoj specifikaciji. x86 put odabire SSE2, AVX2 ili AVX-512; ARM put koristi NEON; alokator registara i raspoređivač su zajednički. Tvrdnja proizvoda nije samo da binarni zapis postoji. Tvrdnja je da se ciljno specifična SIMD jezgra odabiru dok graf ostaje ista računska operacija.
Na GPU-ima, izvorni materijal navodi generiranje PTX-a za CUDA i ROCm, a tensor jezgre se koriste kada oblik jezgre to dopušta. Taj posljednji uvjet ima svoju težinu. Hardversko ubrzanje nije čarobni prah. Oblik jezgre ili odgovara tensor putu ili ne odgovara. Kompajler to mora iskreno pokazati, premjestiti podatke između domaćina i uređaja kada je potrebno, te zadržati otisak grafa kao dokaz onoga što se izvršava.
Na FPGA-u, put spuštanja postaje hardverski razgovor: Verilog sinteza, procjena resursa, analiza vremenskog rasporeda i raspoređivanje cjevovoda za predvidljivo, ciklusno egzaktno ponašanje. Ovo je vrsta cilja gdje je improvizacija posebno skupa. Ako kupac treba strogo realno vrijeme, površina kompajlera mora govoriti u ciklusima, resursima i cjevovodima, ne samo u brzini. Kera priča čini FPGA pozadinskim dijelom istog grafa umjesto prepisivanjem od strane drugog tima.
Na WASM-u, stranica navodi 128-bitni SIMD za rubnu i pregledničku implementaciju. To je važno jer je rub mjesto gdje se stvarnost implementacije često sudara s čistoćom. Preglednik, mali uređaj ili ograničeno izvršno okruženje ne mogu uvijek podržati isti stog kao poslužitelj. Put spuštanja izvorni za graf daje timu način da prenese istu računsku operaciju u to okruženje bez pretvaranja ruba u drugi proizvod.
Determinizam mora preživjeti uspjeh
Determinizam je lako obećati u maloj prostoriji. Postaje teži kada proizvod uspije. Dolazi više korisnika. Pojavljuje se više hardvera. Model se seli s jednog čipa na drugi. Testna osnovica napisana za jedno okruženje mora pokriti drugo. Optimizacija koja izgleda bezazleno mijenja redoslijed redukcije. Brzi put pojavljuje se u jednom izvršnom okruženju, ali ne u drugom.
Stranica o Keri determinizam prikazuje kao bit za bit isti na svim platformama. To nije kozmetička tvrdnja. To mijenja obveze proizvoda. Primitivna aritmetika ima definirane semantike preciznosti na svim ciljnim platformama. Redukcije imaju definirano razrješavanje izjednačenih rezultata tako da raspored izvođenja i hardver ne mijenjaju rezultat. Primitivi neuronskih mreža imaju determinističke implementacije na CPU-u, GPU-u, FPGA-u i WASM-u. Graf znači istu stvar gdje god se izvodi.
Zato nedefinirano ponašanje, pauze u garbage collectoru i implicitni nuspojave nisu male jezične preferencije. One su pukotine u površini izvođenja. Stranica o Keri kaže: bez ovisnosti o LLVM-u, bez garbage collectora, bez nedefiniranog ponašanja. Eksplicitni tipovi, eksplicitni učinci i vlasništvo nad memorijskim prostorima kontrole su proizvoda. Smanjuju broj mjesta na kojima se rezultat može promijeniti dok svi gledaju negdje drugdje.
Postoji i ljudska strana toga. Kad upravljački program robota mijenja ponašanje na različitim uređajima, kad financijski tijek rada zaokruži jedan cent drugačije, kad znanstveni rezultat recenzent ne može ponoviti ili kad se simulacija igre razlikuje među ciljnim platformama, argument zapravo nije o teoriji prevoditelja. Riječ je o institucionalnom povjerenju. Potrošački tekst o Keri koristi jednostavne priče jer je temeljni problem jednostavno osjetiti: iste upute, isti odgovor, na bilo kojem računalu koje posjedujete.
To povjerenje mora preživjeti ubrzanje. Ako izvedba zahtijeva od timova da napuste determinizam, proizvod je samo premjestio rizik. Kera pokušava zadržati izvedbu i determinizam u istom ugovoru tako što graf čini jedinicom značenja, a ciljnu putanju jedinicom izvođenja.
Sigurnost je dio spuštanja
Rasprave o prevoditeljima često izoliraju sigurnost kao posao izvođenja. Izvorni materijal o Keri to ne čini. Govori o sigurnosti temeljenoj na sposobnostima, SecurityManageru, vratima koja prema zadanim postavkama odbijaju, PolicyBuilderu, seccomp BPF-u, Linux namespaceovima i revizijskom zapisu otpornom na neovlašteno mijenjanje i sigurnom za višedretveni pristup u prstenastom međuspremniku fiksnog kapaciteta. Te riječi pripadaju inženjerskoj priči jer spuštanje ne završava kad se emitiraju upute. Emitirani rad i dalje se mora izvoditi unutar granica.
Tokeni sposobnosti dodjeljuju se pri pokretanju. Privilegirane radnje zahtijevaju eksplicitnu sposobnost. Pravila pristupa deklarirana su unaprijed. BPF filtar ograničava sistemske pozive. Izolacija namespaceova odvaja poglede na proces, montažu i mrežu. Događaji relevantni za sigurnost završavaju u revizijskom zapisu. Kratka rečenica glasi: ništa nije dopušteno prema zadanim postavkama.
To je važno za heterogeno izvođenje jer ciljne platforme stvaraju površine. CPU proces, GPU prijenos, FPGA putanja, pregledničko izvođenje i distribuirani posao ne otkazuju na identične načine. Proizvod mora zadržati pravila pridružena radu dok se on kreće. Ako graf govori što je izračun, kontrole izvođenja govore što izračun smije učiniti.
Postoji i operativni razlog za uključivanje sigurnosti u priču o prevoditelju. Timovi ne žele jedan proizvod za kompilaciju, drugi za pravila, treći za zapisivanje i četvrti za objašnjenje ako spojevi među njima postanu mjesto gdje se incidenti skrivaju. Stranica o Keri ne tvrdi da rješava svu sigurnost. Čini nešto uže i korisnije: čini dopuštenja eksplicitnima i revidiranima u okruženju izvođenja koje prevoditelj opskrbljuje.
Distribuirani rad i dalje je spuštanje
Tehnički list navodi distribuirano izvođenje, ring allreduce i oporavak od kontrolnih točaka. U drugom proizvodu to bi mogli biti stavke za brošuru. U Keri pripadaju istoj raspravi o spuštanju jer paralelizam mijenja oblik izračuna. Paralelizam podataka, modela i cjevovoda nisu samo načini za ubrzanje. Oni su načini za podjelu posla bez gubitka značenja izvornog grafa.
Ako veliki posao radi na mnogo strojeva i jedan čvor zakaže, oporavak od kontrolne točke nije pogodnost. To je dio činjenja izračuna operativnim. Ako se rezultati pouzdano agregiraju, semantika agregacije mora biti definirana. Ako je graf adresiran prema sadržaju, distribuirani put mora sačuvati identitet grafa umjesto da izmisli drugu stvarnost nakon što posao napusti jedan stroj.
Ovdje interpretacija proizvoda postaje jasna. Kera nije sintaksni sloj s distribuiranim dodatkom. Pokušava učiniti izračun prenosivim kroz oblik i hardver: jedan program, jedan graf, više izvršnih ciljeva i zapis koji se može provjeriti. Distribuirano izvršavanje još je jedno mjesto gdje spuštanje mora nositi izvršni ugovor.
To također mijenja priču o osoblju. Bez zajedničkog puta kompilacije, greška koja se pojavi samo na jednoj platformi može zahtijevati ljude koji poznaju čip, alatni lanac i izvršno okruženje istovremeno. S jednim grafom i zajedničkim putem, pitanje je oštrije: je li se graf promijenio, je li se put spuštanja promijenio ili je cilj prekršio definiranu semantiku? Bolja pitanja ne uklanjaju težak posao. Ona sprječavaju da se težak posao nasumično širi.
Zašto netko mora posjedovati put
Spuštanje ne može ostati bez vlasnika kada nosi rezultate na koje se ljudi oslanjaju. Graf koji radi na CPU-u, GPU-u, FPGA-u i WASM-u treba više od pametne reprezentacije. Treba dokumentaciju, dijagnostiku, tvrdnje o ciljevima, ponašanje uređivača, generiranje koda, sigurnosne kontrole, razgovore s podrškom i način da se kupcu točno kaže što se promijenilo kada se rezultat promijeni.
To ne čini posao manje tehničkim. To čini tehnički posao obvezujućim. Kera je trenutno komercijalni Dweve proizvod, ne izdanje otvorenog koda: sva prava pridržana, dostupan pod komercijalnom licencom, napravljen u Nizozemskoj i namijenjen organizacijama kojima treba podržan put grafa, a ne samo objavljen. Ako stranica kaže Rust 2021, graf IR, prilagođeni JIT, bez LLVM-a, CPU/GPU/FPGA/WASM, praćenje učinaka, vlasništvo kroz memorijske prostore, sigurnost sposobnosti, distribuirano izvršavanje, ugrađivanje C i Python, CLI tijekove rada, podršku uređivača i LSP alate, to nisu dekorativni detalji. To su obveze koje moraju preživjeti evaluaciju stvarnim radnim opterećenjima.
Lista sposobnosti pažljiva je po tom pitanju. Opisuje ciljeve dizajna i kaže da treba provjeriti prema vlastitom radnom opterećenju. To suzdržavanje je važno. Mnogo je zdravije nego pretvarati se da svaki broj mjerila putuje. Sustav bi trebao timovima dati način da mjere, pregledavaju i uspoređuju u vlastitom okruženju, a ne tražiti od njih da prihvate univerzalnu priču o brzini.
Netko mora posjedovati taj put jer svaki cilj pokušava učiniti izvor manje univerzalnim. Kera je mjesto gdje te razlike ciljeva postaju eksplicitan kompilatorski posao umjesto folklora koji se prenosi nakon izvješća o grešci.
Dan kada graf postaje ugovor
Zamislite ponovno izvorno izvješće o grešci, ali s Kerom već u tijeku rada. Financijski tim odobrava izračun rizika. Otisak grafa je zabilježen. Prvo postavljanje radi na CPU-u. Kasnije se uvodi GPU put za analizu portfelja. Kasnije se opet koristi FPGA put za određivanje cijena s nižom latencijom. Pitanje na svakom koraku nije zvuči li novi hardver impresivno. Pitanje je spušta li se isti graf i održavaju li ciljna semantika rezultat identičnim.
Razgovor se mijenja. Tim platforme može razgovarati o raspoređivanju i troškovima. Kompilatorski tim može razgovarati o pozadinskim sustavima. Tim za usklađenost može razgovarati o otisku. Vlasnik posla može pitati je li premještanje hardvera operativna odluka ili prepisivanje. Proizvod svima njima daje jedan objekt na koji mogu pokazati.
To je tiha vrijednost IR-a s adresiranjem po sadržaju. Pretvara izvođenje na više platformi iz niza uvjerljivih objašnjenja u zapis. Čini graf računom. Omogućuje da isti .keg napaja svaki pozadinski sustav. Organizaciji daje osnovicu koja pripada izračunu, a ne pojedinom stroju.
Nijedan prevodilac ne može ukloniti potrebu za inženjerskom prosudbom. Timovi i dalje moraju pažljivo birati ciljeve, pošteno testirati radna opterećenja, razumjeti ograničenja ciljeva i odlučiti koja područja zahtijevaju potpunu istovjetnost bitova. No Kera te odluke može učiniti eksplicitnima. Može spriječiti da migracija radi performansi slučajno postane semantička migracija.
Pouka o spuštanju
Kera je važna jer teži dio nije imati pametnu ideju o spuštanju. Teži dio je provesti tu ideju kroz sva nezanimljiva mjesta na kojima inženjering ili postaje pouzdan ili postaje folklor: dijagnostika, zelena stabla, hashovi tipova, provjera posudbe, optimizacija fiksne točke, provjera invarijanti, serijalizacija .keg, generiranje koda za pozadinske sustave, sigurnosna politika, zapisnici revizije, podrška u uređivaču i izvođenje specifično za cilj.
Spuštanje je posao jer svaki cilj pokušava izvor učiniti manje univerzalnim. Determinističko inženjerstvo prevodilaca disciplina je odbijanja da se to dogodi u tišini. CPU želi vektore. GPU želi jezgre. FPGA želi cikluse. WASM želi ograničenja. Organizacija želi jedan odgovor. Kerin je posao sačuvati značenje izračuna dok svakom cilju dopušta da radi ono u čemu je dobar.
To je inženjerski oblik, a ne apstrakcija na papiru. Ima kupca, način kvara, format datoteke, put prevodioca i operativne posljedice. Obećanje nije da hardver postaje jednostavan. Obećanje je da je složenost predstavljena, spuštena, provjerena i u vlasništvu.
Kad stigne sljedeći gotovo točan broj, tim ne bi trebao početi s folklorom o tome koji je stroj što pokrenuo. Trebao bi početi s grafom. Je li se otisak podudarao? Koji je pozadinski sustav generirao kod? Koje su mogućnosti odobrene? Koja su ciljna semantika primijenjena? Koji je artefakt pohranjen? To su pitanja o proizvodu. Kera postoji jer su to također pitanja o prevodiocu.