Το Kera και το έργο της αποκλιμάκωσης
Η αναφορά σφαλμάτων που δεν ήταν σφάλμα
Η ιστορία συνήθως ξεκινά με έναν αριθμό που είναι σχεδόν σωστός. Όχι εντελώς λάθος. Όχι χαλασμένος με τρόπο που κοκκινίζει τον πίνακα ελέγχου. Σχεδόν σωστός με τον ακριβό τρόπο: το είδος του λάθους που επιτρέπει στη μία ομάδα να ολοκληρώσει την έκδοση, στην άλλη να διστάσει, και στον ελεγκτή να ρωτήσει γιατί άλλαξε η απάντηση όταν το ίδιο μοντέλο μεταφέρθηκε από ένα μηχάνημα σε άλλο.
Μία έκδοση τρέχει σε έναν διακομιστή x86 και παράγει μια τιμή. Η επόμενη έκδοση τρέχει σε έναν φορητό υπολογιστή ARM και παράγει μια τιμή αρκετά κοντά ώστε ένα demo να επιβιώσει. Μια διαδρομή GPU είναι ταχύτερη αλλά στρογγυλοποιεί διαφορετικά μέσα στον υπολογισμό. Μια διαδρομή FPGA είναι ελκυστική για τον χρονισμό, αλλά ξαφνικά η ομάδα λογισμικού κάνει συζήτηση για υλικό. Ο καθένας μπορεί να εξηγήσει ένα μικρό κομμάτι της διαφοράς. Κανείς δεν κατέχει ολόκληρη τη διαδρομή από την πηγή έως το αποτέλεσμα.
Σε αυτόν τον χώρο είναι φτιαγμένο το Kera. Όχι για την ιδέα του μοντέλου, όχι για το διαφημιστικό σλάιντ, όχι για μια εργασία για έναν μελλοντικό μεταγλωττιστή, αλλά για τη δουλειά του μεταγλωττιστή που ξεκινά όταν μια ομάδα λέει ότι ο ίδιος υπολογισμός πρέπει να τρέχει σε διαφορετικά μηχανήματα και να σημαίνει ακόμα το ίδιο πράγμα. Αυτή η υποχρέωση χρειάζεται έναν ιδιοκτήτη. Η υπόσχεση του μεταγλωττιστή δεν είναι ότι η μετατροπή είναι κομψή. Η υπόσχεση είναι ότι η μετατροπή αντιμετωπίζεται ως δουλειά.
Η μετατροπή είναι το μέρος του μεταγλωττιστή όπου η ωραία πρόθεση της γλώσσας γίνεται εντολές που μπορεί να εκτελέσει ένας στόχος. Είναι επίσης το σημείο όπου οι αόριστες ισχυρισμοί γίνονται ορατοί. Αν το αποτέλεσμα πρέπει να είναι πανομοιότυπο bit προς bit σε CPU, GPU, FPGA και WebAssembly, τότε ο μεταγλωττιστής δεν μπορεί να αδιαφορήσει για τις διαφορές των στόχων. Πρέπει να κουβαλά αρκετή δομή ώστε να αποφασίζει τι μπορεί να αλλάξει και τι δεν πρέπει να αλλάξει. Πρέπει να γνωρίζει χώρους μνήμης, επιδράσεις, κωδικούς λειτουργίας, μεταφορά δεδομένων, όρια στόχων και τις αποδείξεις που δείχνουν ότι δύο εκδόσεις είναι ο ίδιος υπολογισμός.
Ο δελεαστικός τρόπος να πει κανείς την ιστορία είναι να το ονομάσει επίπεδο φορητότητας. Αυτό είναι πολύ λίγο. Η φορητότητα λέει ότι το πρόγραμμα τρέχει αλλού. Το Kera στοχεύει στη δυσκολότερη δήλωση: το πρόγραμμα αναπαρίσταται ως γράφος με διευθυνσιοδότηση περιεχομένου, μεταγλωττίζεται σε τεχνούργημα .keg, μετατρέπεται σε πολλαπλά backends και εξακολουθεί να παράγει την ίδια απάντηση. Η κουζίνα αλλάζει. Η συνταγή όχι.
Το ενδιάμεσο που κανείς δεν θέλει να πουλήσει
Η πρώτη συζήτηση με έναν σοβαρό αγοραστή σπάνια ξεκινά με σύνταξη. Ξεκινά με ένα χάος. Υπάρχει ένα μοντέλο που έχει σημασία. Υπάρχει μια προσομοίωση που κάποτε ήταν έρευνα και έχει γίνει επιχειρησιακή. Υπάρχει ένας υπολογισμός κινδύνου του οποίου το αποτέλεσμα δεν επιτρέπεται πλέον να διαφέρει ανάλογα με το μηχάνημα. Υπάρχει μια ανάπτυξη στην άκρη που δεν μπορεί να κουβαλήσει ολόκληρο το runtime του cloud. Υπάρχει μια ομάδα που θέλει έναν επιταχυντή αλλά δεν μπορεί να αντέξει μια επανεγγραφή κάθε φορά που αλλάζει ο επιταχυντής.
Τα περισσότερα εργαλεία το παρουσιάζουν ως πρόβλημα ανάπτυξης. Διάλεξε τον στόχο, εξήγαγε το μοντέλο, επιδιόρθωσε το runtime, αποδέξου κάποια απόκλιση και μετά γράψε ένα έγγραφο που εξηγεί τις εξαιρέσεις. Το έγγραφο μεγαλώνει. Ο πίνακας δοκιμών μεγαλώνει. Ο αριθμός των ειδικών μεγαλώνει. Τελικά ο οργανισμός πληρώνει δύο φορές για την ετερογένεια: μία όταν αγοράζει το υλικό και μία όταν προσπαθεί να αποδείξει ότι το υλικό έκανε την ίδια δουλειά.
Το Kera ξεκινά από το αντίθετο άκρο. Η σελίδα του Kera το ονομάζει στατικά τυποποιημένη γλώσσα συστημάτων με γράφο-εγγενή, IR με διευθυνσιοδότηση περιεχομένου. Αυτή η φράση έχει σημασία επειδή ο γράφος δεν είναι ένα διακοσμητικό διάγραμμα μεταγλωττιστή. Είναι το εκτελέσιμο αντικείμενο. Ο πηγαίος κώδικας μετατρέπεται σε κατευθυνόμενους ακυκλικούς γράφους λειτουργιών, αποθηκευμένους ως αρχεία .keg. Κάθε κόμβος φέρει καθορισμένη δομή. Η διπλή εργασία μπορεί να εξαλειφθεί δομικά. Ο ίδιος γράφος μπορεί να μετατραπεί σε CPU, GPU, FPGA και WASM χωρίς να αντιμετωπίζεται κάθε στόχος ως ξεχωριστό μικρό σύμπαν.
Γι' αυτό η Kera πρέπει να συμπεριφέρεται σαν σοβαρή υποδομή μεταγλωττιστή και όχι σαν διάγραμμα. Η άβολη μέση είναι εκεί όπου ζει ο πελάτης. Η λεκτική ανάλυση πρέπει να διατηρεί τις θέσεις των byte. Η συντακτική ανάλυση πρέπει να τροφοδοτεί τόσο τα εργαλεία όσο και τη μεταγλώττιση. Ο έλεγχος τύπων πρέπει να απορρίπτει τις ασυμφωνίες σχήματος και ακμών πριν γίνουν συμβάντα κατά τον χρόνο εκτέλεσης. Ο έλεγχος δανεισμού πρέπει να κατανοεί την κυριότητα στη μνήμη host, device, pinned και unified. Η βελτιστοποίηση πρέπει να είναι επαναλήψιμη. Η σειριοποίηση πρέπει να δίνει στον οργανισμό ένα τεχνούργημα που μπορεί να κρατήσει.
Τίποτα από αυτά δεν κάνει εντυπωσιακό πρωτοσέλιδο. Είναι πολύ πιο χρήσιμο από ένα πρωτοσέλιδο. Σημαίνει ότι όταν ένα φορτίο εργασίας μετακινείται από την ανάπτυξη στην παραγωγή, ή από μια βασική γραμμή CPU σε μια διαδρομή GPU, ο μεταγλωττιστής έχει κάτι σταθερό να συγκρίνει: το αποτύπωμα του γράφου. Αν το αποτύπωμα ταιριάζει, η εργασία είναι η ίδια εργασία. Αυτό είναι ένα κοινό σημείο ελέγχου που μπορούν να κατανοήσουν ένας μηχανικός, ένας αγοραστής και ένας ελεγκτής.
Ένας γράφος είναι απόδειξη, όχι εικόνα
Ο παλιός τρόπος εξήγησης ενός προγράμματος είναι να δείχνεις τον πηγαίο κώδικα και να ζητάς από τον αναγνώστη να εμπιστευτεί τον μεταγλωττιστή. Η σελίδα της Kera επιστρέφει συνεχώς σε ένα διαφορετικό αντικείμενο: τον γράφο. Κάθε πράξη είναι ένας κόμβος. Οι ακμές εκφράζουν εξαρτήσεις. Ο γράφος έχει περιεχόμενο. Το περιεχόμενο έχει κατακερματισμό. Ο κατακερματισμός γίνεται αποτύπωμα που ταξιδεύει μέσα στη μεταγλώττιση.
Αυτό ακούγεται σαν εσωτερικός μηχανισμός μέχρι να σταθείς δίπλα σε μια ομάδα συμμόρφωσης. Μια ομάδα συμμόρφωσης δεν θέλει να μάθει ότι ένας προμηθευτής έχει ωραία αρχιτεκτονική μεταγλωττιστή. Θέλει να μάθει αν ο υπολογισμός που εγκρίθηκε τον προηγούμενο μήνα είναι ο υπολογισμός που εκτελείται σήμερα. Το αποτύπωμα του γράφου είναι η γέφυρα ανάμεσα σε αυτούς τους δύο κόσμους. Δεν είναι ένα στιγμιότυπο οθόνης του μεταγλωττιστή. Είναι ένας συμπαγής τρόπος να πεις: αυτό το σύνολο πράξεων, αυτοί οι τύποι, αυτές οι είσοδοι, αυτά τα χαρακτηριστικά, αυτή η δομή εξαρτήσεων.
Το μοντέλο κόμβων είναι σκόπιμα αυστηρό. Ένας κόμβος είναι μια έκδοση σχήματος, ένας κωδικός πράξης, περιγραφείς εξόδου, κατακερματισμοί εισόδου και χάρτες χαρακτηριστικών διατεταγμένοι σε κανονική σειρά. Τα byte κατακερματίζονται με SHA3-256 κάτω από προθέματα με διαχωρισμό τομέα, έτσι ώστε οι κατακερματισμοί κόμβου, περιοχής και γράφου να ζουν σε ξεχωριστούς χώρους ονομάτων. Αν δύο κόμβοι έχουν τον ίδιο κωδικό πράξης, τις ίδιες εισόδους και τα ίδια χαρακτηριστικά, έχουν τον ίδιο κατακερματισμό. Η εισαγωγή ενός διπλότυπου επιστρέφει την υπάρχουσα εγγραφή. Η εξάλειψη κοινών υποεκφράσεων γίνεται συνέπεια της αναπαράστασης, όχι μια ηρωική φάση που προστίθεται αργότερα.
Αυτή είναι η λεπτομέρεια που μετατρέπει ένα σύστημα μηχανικής σε κάτι στο οποίο μπορούν να βασιστούν οι άνθρωποι. Ένας αγοραστής δεν αγοράζει ένα διάγραμμα μεταγλωττιστή. Ένας αγοραστής αγοράζει λιγότερες διαφωνίες για το αν άλλαξε ένας υπολογισμός. Ένας προγραμματιστής δεν αγοράζει ένα σύνθημα για ντετερμινιστική τεχνητή νοημοσύνη. Ένας προγραμματιστής αγοράζει μια μορφή γράφου όπου η ταυτότητα μπορεί να ελεγχθεί, να αποθηκευτεί και να χρησιμοποιηθεί από εργαλεία. Το αρχείο .keg δεν είναι λοιπόν μια εκ των υστέρων σκέψη υλοποίησης. Είναι μια φορητή καταγραφή της εργασίας.
Οι οκτώ μικρές πόρτες πριν εμφανιστεί ένας στόχος
Όταν οι άνθρωποι φαντάζονται έναν compiler, συχνά πηδούν κατευθείαν στο backend. Φαντάζονται τη στιγμή που ο κώδικας γίνεται AVX, PTX, Verilog ή WASM. Αυτή η στιγμή έχει σημασία, αλλά έρχεται αργά στην ιστορία. Το μεγαλύτερο μέρος της δουλειάς του compiler έχει ήδη γίνει ως τότε, σε ήσυχα στάδια που καθορίζουν αν μπορεί κανείς να εμπιστευτεί το backend.
Ο Kera ξεκινά με έναν lexer με επίγνωση UTF-8 που μετατρέπει τον πηγαίο κώδικα σε tokens με πλήρη παρακολούθηση trivia και ανάκτηση σφαλμάτων. Αυτό ακούγεται σαν εσωτερική λειτουργία ενός editor, και είναι. Είναι όμως και αξιοπιστία της εργαλειοθήκης. Αν διατηρηθεί κάθε θέση byte, τα διαγνωστικά, η μορφοποίηση, η σταδιακή επανανάλυση και η συμπεριφορά του language server μπορούν να ευθυγραμμιστούν με όσα έγραψε πραγματικά ο χρήστης. Ένας compiler που χάνει νωρίς τη μορφή του πηγαίου κώδικα πληρώνει αυτή την απώλεια παντού αλλού.
Ο parser βασίζεται σε γεγονότα: η αναδρομική κάθοδος με ανάλυση εκφράσεων κατά Pratt εκπέμπει γεγονότα Start, Token, Finish και Error αντί να χτίζει ένα ενιαίο AST που πρέπει να μοιράζονται όλοι. Η ροή γεγονότων τροφοδοτεί ανεξάρτητα τον κατασκευαστή δέντρου, τον μορφοποιητή και τον language server. Το πράσινο δέντρο είναι χωρίς απώλειες, διατηρώντας tokens και trivia. Ο κατασκευαστής γραφήματος στη συνέχεια διασχίζει αυτό το δέντρο, διατηρεί την ανάλυση ονομάτων και δημιουργεί έναν κόμβο Region ανά συνάρτηση.
Μόνο μετά από αυτό ο πηγαίος κώδικας γίνεται το γράφημα που κουβαλά ο compiler. Ο δομικός έλεγχος τύπων επαληθεύει τη συμβατότητα στις ακμές των πράξεων και στους περιορισμούς σχημάτων τανυστών. Οι τύποι ταιριάζουν μόνο όταν τα κανονικά τους hashes είναι πανομοιότυπα. Ο ελεγκτής δανεισμού επιβάλλει έναν ιδιοκτήτη ανά τιμή, καμία ψευδώνυμη μεταβλητή αναφορά, και κανόνες ιδιοκτησίας μεταξύ χώρων μνήμης. Οι σημειώσεις επιδράσεων ελέγχονται για συνέπεια. Οι παρενέργειες δεν αφήνονται στο γούστο ή στη σύμβαση.
Στη συνέχεια, ο διαχειριστής περασμάτων βελτιστοποίησης κάνει την αναγνωρίσιμη δουλειά του compiler: αναδίπλωση σταθερών, εξάλειψη κοινών υποεκφράσεων, εξάλειψη νεκρού κώδικα, inlining, διανυσματοποίηση και συγχώνευση βρόχων σε βρόχο σταθερού σημείου. Η σημαντική φράση δεν είναι η λίστα των περασμάτων. Είναι αυτό που συμβαίνει μετά από κάθε πέρασμα: ένας επαληθευτής αμετάβλητων του γραφήματος ελέγχει τη συνέπεια των hashes και την ακεραιότητα των εξαρτήσεων. Η βελτιστοποίηση επιτρέπεται να βελτιώνει το γράφημα, όχι να το κάνει μυστηριώδες.
Τέλος, οι γεννήτριες κώδικα για συγκεκριμένους στόχους εκπέμπουν εγγενή κώδικα, PTX, Verilog ή WASM, και το βελτιστοποιημένο γράφημα σειριοποιείται σε αρχείο .keg με πίνακα ενοτήτων. Το αρχείο ξεκινά με τα μαγικά bytes KEG\0 και περιέχει ενότητες για συμβολοσειρές, τύπους, χαρακτηριστικά, κόμβους, περιοχές και εξαγωγές. Αυτός είναι ο δρόμος που πρέπει να έχει μια ομάδα προτού μιλήσει με ειλικρίνεια για στόχους.
Οι στόχοι δεν είναι αυτοκόλλητα σε μια διαφάνεια
Μια λίστα στόχων είναι εύκολο να γραφτεί και δύσκολο να την αξίζει κανείς. CPU, GPU, FPGA και WASM χωρούν τακτοποιημένα σε μια κάρτα προϊόντος. Η μετατροπή σε αυτούς είναι εκεί που κρύβεται ο λογαριασμός. Κάθε στόχος έχει τις δικές του συνήθειες, δυνάμεις και τρόπους αποτυχίας. Ένας compiler που θέλει ντετερμινιστική ετερογενή εκτέλεση δεν μπορεί να θεωρεί αυτές τις συνήθειες πρόβλημα κάποιου άλλου.
Στις CPU, η Kera εκπέμπει εγγενή κώδικα μηχανής για x86-64 και ARM64, με RISC-V Vector στο τεχνικό φύλλο. Η διαδρομή x86 επιλέγει SSE2, AVX2 ή AVX-512· η διαδρομή ARM χρησιμοποιεί NEON· ο εκχωρητής καταχωρητών και ο προγραμματιστής χρονοδιαγράμματος είναι κοινόχρηστοι. Ο ισχυρισμός του προϊόντος δεν είναι απλώς ότι υπάρχει ένα δυαδικό αρχείο. Ο ισχυρισμός είναι ότι επιλέγονται πυρήνες SIMD ειδικοί για τον στόχο, ενώ το γράφημα παραμένει ο ίδιος υπολογισμός.
Στις GPU, το υλικό πηγής αναφέρει δημιουργία PTX για CUDA και ROCm, με χρήση tensor cores όταν το σχήμα του πυρήνα το επιτρέπει. Αυτή η τελευταία πρόταση κάνει δουλειά. Η επιτάχυνση υλικού δεν είναι μαγική σκόνη. Ένα σχήμα πυρήνα είτε ταιριάζει σε μια διαδρομή tensor-core είτε όχι. Ο μεταγλωττιστής πρέπει να το αποκαλύπτει με ειλικρίνεια, να μετακινεί δεδομένα μεταξύ host και συσκευής όταν χρειάζεται, και να διατηρεί το αποτύπωμα του γραφήματος ως απόδειξη του τι εκτελείται.
Στο FPGA, η διαδρομή χαμηλώματος γίνεται μια συνομιλία υλικού: σύνθεση Verilog, εκτίμηση πόρων, ανάλυση χρονισμού και προγραμματισμός αγωγού για προβλέψιμη, κυκλικά ακριβή συμπεριφορά. Αυτό είναι το είδος στόχου όπου οι γενικότητες είναι ιδιαίτερα δαπανηρές. Αν ο αγοραστής χρειάζεται σκληρό πραγματικό χρόνο, η επιφάνεια του μεταγλωττιστή πρέπει να μιλάει σε κύκλους, πόρους και αγωγούς, όχι μόνο σε ταχύτητα. Η ιστορία της Kera κάνει το FPGA ένα backend του ίδιου γραφήματος αντί για μια επανεγγραφή από άλλη ομάδα.
Στο WASM, η σελίδα αναφέρει SIMD 128-bit για ανάπτυξη στο edge και στον browser. Αυτό έχει σημασία γιατί το edge είναι εκεί όπου η πραγματικότητα της ανάπτυξης συχνά συγκρούεται με την καθαρότητα. Ένας browser, μια μικρή συσκευή ή ένα περιορισμένο περιβάλλον εκτέλεσης δεν μπορεί πάντα να φιλοξενήσει τον ίδιο σωρό με έναν διακομιστή. Μια διαδρομή χαμηλώματος εγγενής στο γράφημα δίνει στην ομάδα έναν τρόπο να μεταφέρει τον ίδιο υπολογισμό σε αυτό το περιβάλλον χωρίς να μετατρέπει το edge σε δεύτερο προϊόν.
Ο ντετερμινισμός πρέπει να επιβιώσει την επιτυχία
Ο ντετερμινισμός είναι εύκολο να υποσχεθεί κανείς σε ένα μικρό δωμάτιο. Γίνεται δυσκολότερος όταν το προϊόν επιτυγχάνει. Περισσότεροι χρήστες φτάνουν. Περισσότερο υλικό εμφανίζεται. Ένα μοντέλο μετακινείται από ένα τσιπ σε άλλο. Μια γραμμή βάσης δοκιμών γραμμένη για ένα περιβάλλον πρέπει να καλύψει ένα άλλο. Μια βελτιστοποίηση που φαίνεται ακίνδυνη αλλάζει τη σειρά μιας αναγωγής. Μια γρήγορη διαδρομή εμφανίζεται σε ένα περιβάλλον εκτέλεσης αλλά όχι σε άλλο.
Η σελίδα του Kera παρουσιάζει τον ντετερμινισμό ως ταυτόσημο αποτέλεσμα bit προς bit σε όλες τις πλατφόρμες. Αυτό δεν είναι διακοσμητικός ισχυρισμός. Αλλάζει τις υποχρεώσεις του προϊόντος. Η στοιχειώδης αριθμητική έχει καθορισμένη σημασιολογία ακρίβειας σε όλους τους στόχους. Οι αναγωγές έχουν καθορισμένη επίλυση ισοβαθμιών, ώστε ο προγραμματισμός και το υλικό να μην αλλάζουν το αποτέλεσμα. Τα πρωτόγονα νευρωνικών δικτύων έχουν ντετερμινιστικές υλοποιήσεις σε CPU, GPU, FPGA και WASM. Το γράφημα σημαίνει το ίδιο πράγμα όπου κι αν εκτελείται.
Γι' αυτό η μη καθορισμένη συμπεριφορά, οι παύσεις του συλλέκτη σκουπιδιών και οι έμμεσες παρενέργειες δεν είναι μικρές γλωσσικές προτιμήσεις. Είναι ρωγμές στην επιφάνεια εκτέλεσης. Η σελίδα του Kera αναφέρει καμία εξάρτηση από LLVM, κανέναν συλλέκτη σκουπιδιών, καμία μη καθορισμένη συμπεριφορά. Οι ρητοί τύποι, τα ρητά αποτελέσματα και η κυριότητα μεταξύ χώρων μνήμης είναι έλεγχοι του προϊόντος. Μειώνουν τα σημεία όπου ένα αποτέλεσμα μπορεί να αλλάξει ενώ όλοι κοιτάζουν αλλού.
Υπάρχει και μια ανθρώπινη πλευρά σε αυτό. Όταν ένας ελεγκτής ρομποτικής αλλάζει συμπεριφορά μεταξύ συσκευών, όταν μια χρηματοοικονομική ροή εργασίας στρογγυλοποιεί ένα λεπτό διαφορετικά, όταν ένα επιστημονικό αποτέλεσμα δεν μπορεί να αναπαραχθεί από έναν αξιολογητή ή όταν μια προσομοίωση παιχνιδιού αποκλίνει μεταξύ στόχων, το επιχείρημα δεν αφορά πραγματικά τη θεωρία μεταγλωττιστών. Αφορά την εμπιστοσύνη των θεσμών. Το καταναλωτικό κείμενο του Kera χρησιμοποιεί απλές ιστορίες επειδή το υποκείμενο πρόβλημα είναι απλό να το νιώσεις: ίδιες οδηγίες, ίδια απάντηση, σε οποιονδήποτε υπολογιστή έχεις.
Αυτή η εμπιστοσύνη πρέπει να επιβιώσει της επιτάχυνσης. Αν η απόδοση απαιτεί από τις ομάδες να εγκαταλείψουν τον ντετερμινισμό, το προϊόν απλώς μετακίνησε τον κίνδυνο. Το Kera προσπαθεί να κρατήσει την απόδοση και τον ντετερμινισμό στο ίδιο συμβόλαιο, κάνοντας το γράφημα τη μονάδα νοήματος και τη διαδρομή στόχου τη μονάδα εκτέλεσης.
Η ασφάλεια είναι μέρος της μεταγλώττισης
Οι συζητήσεις για μεταγλωττιστές συχνά απομονώνουν την ασφάλεια ως εργασία χρόνου εκτέλεσης. Το υλικό του Kera δεν το κάνει αυτό. Μιλά για ασφάλεια βάσει δυνατοτήτων, έναν SecurityManager, μια πύλη άρνησης από προεπιλογή, έναν PolicyBuilder, seccomp BPF, χώρους ονομάτων Linux και ένα καταγραφικό ελέγχου με απόδειξη παραποίησης, ασφαλές για πολλαπλά νήματα, σε κυκλικό buffer σταθερής χωρητικότητας. Αυτές οι λέξεις ανήκουν στην ιστορία της μηχανικής επειδή η μεταγλώττιση δεν τελειώνει όταν εκπέμπονται οι εντολές. Η εκπεμπόμενη εργασία πρέπει ακόμα να εκτελείται με όρια.
Τα διακριτικά δυνατοτήτων χορηγούνται κατά την εκκίνηση. Οι προνομιούχες ενέργειες απαιτούν ρητή δυνατότητα. Οι κανόνες πρόσβασης δηλώνονται εκ των προτέρων. Ένα φίλτρο BPF περιορίζει τις κλήσεις συστήματος. Η απομόνωση χώρων ονομάτων διαχωρίζει τις όψεις διεργασίας, προσάρτησης και δικτύου. Τα συμβάντα που σχετίζονται με την ασφάλεια καταγράφονται σε καταγραφικό ελέγχου. Η σύντομη πρόταση είναι: τίποτα δεν επιτρέπεται από προεπιλογή.
Αυτό έχει σημασία για την ετερογενή εκτέλεση επειδή οι στόχοι δημιουργούν επιφάνειες. Μια διεργασία CPU, μια μεταφορά GPU, μια διαδρομή FPGA, ένα περιβάλλον εκτέλεσης προγράμματος περιήγησης και μια κατανεμημένη εργασία δεν αποτυγχάνουν με πανομοιότυπους τρόπους. Ένα προϊόν πρέπει να κρατά την πολιτική προσαρτημένη στην εργασία καθώς αυτή μετακινείται. Αν το γράφημα λέει τι είναι ο υπολογισμός, οι έλεγχοι χρόνου εκτέλεσης λένε τι μπορεί να κάνει ο υπολογισμός.
Υπάρχει επίσης ένας λειτουργικός λόγος να φέρουμε την ασφάλεια στην ιστορία του μεταγλωττιστή. Οι ομάδες δεν θέλουν ένα προϊόν για τη μεταγλώττιση, ένα άλλο για την πολιτική, ένα άλλο για την καταγραφή και ένα άλλο για την εξήγηση, αν οι ενώσεις μεταξύ τους γίνουν το σημείο όπου κρύβονται τα περιστατικά. Η σελίδα του Kera δεν ισχυρίζεται ότι λύνει όλα τα θέματα ασφάλειας. Κάνει κάτι πιο περιορισμένο και πιο χρήσιμο: καθιστά τις άδειες ρητές και ελεγχόμενες στο περιβάλλον εκτέλεσης που τροφοδοτεί ο μεταγλωττιστής.
Η κατανεμημένη εργασία εξακολουθεί να είναι μεταγλώττιση
Το τεχνικό φύλλο αναφέρει την κατανεμημένη εκτέλεση, την ring allreduce και την ανάκτηση από σημεία ελέγχου. Σε άλλο προϊόν, αυτά θα μπορούσαν να είναι στοιχεία φυλλαδίου. Στο Kera, ανήκουν στην ίδια συζήτηση μεταγλώττισης επειδή ο παραλληλισμός αλλάζει τη μορφή ενός υπολογισμού. Ο παραλληλισμός δεδομένων, μοντέλου και διοχέτευσης δεν είναι απλώς τρόποι να πάμε πιο γρήγορα. Είναι τρόποι να διαιρέσουμε την εργασία χωρίς να χάσουμε το νόημα του αρχικού γραφήματος.
Αν μια μεγάλη εργασία εκτελείται σε πολλά μηχανήματα και ένας κόμβος αποτύχει, η ανάκτηση από ένα σημείο ελέγχου δεν είναι πολυτέλεια. Είναι μέρος του να γίνει ο υπολογισμός λειτουργικός. Αν τα αποτελέσματα συγκεντρώνονται αξιόπιστα, η σημασιολογία της συγκέντρωσης πρέπει να οριστεί. Αν ένα γράφημα έχει διεύθυνση βάσει περιεχομένου, η κατανεμημένη διαδρομή πρέπει να διατηρεί την ταυτότητα του γραφήματος αντί να εφευρίσκει μια δεύτερη πραγματικότητα μόλις η εργασία φύγει από ένα μηχάνημα.
Εδώ γίνεται σαφής η ερμηνεία του προϊόντος. Η Kera δεν είναι ένα επίπεδο σύνταξης με ένα κατανεμημένο πρόσθετο. Προσπαθεί να κάνει τον υπολογισμό φορητό τόσο ως προς τη μορφή όσο και ως προς το υλικό: ένα πρόγραμμα, ένα γράφημα, πολλαπλοί στόχοι εκτέλεσης και ένα αρχείο καταγραφής που μπορεί να ελεγχθεί. Η κατανεμημένη εκτέλεση είναι ένα ακόμη σημείο όπου η μεταγλώττιση πρέπει να μεταφέρει τη σύμβαση εκτέλεσης.
Αλλάζει επίσης την ιστορία στελέχωσης. Χωρίς κοινή διαδρομή μεταγλώττισης, ένα σφάλμα που εμφανίζεται μόνο σε μία πλατφόρμα μπορεί να απαιτεί άτομα που γνωρίζουν ταυτόχρονα το τσιπ, την εργαλειοθήκη και τον χρόνο εκτέλεσης. Με ένα γράφημα και μια κοινή διαδρομή, το ερώτημα είναι πιο συγκεκριμένο: άλλαξε το γράφημα, άλλαξε η διαδρομή μεταγλώττισης ή παραβίασε ο στόχος την καθορισμένη σημασιολογία; Τα καλύτερα ερωτήματα δεν αφαιρούν τη δύσκολη δουλειά. Εμποδίζουν τη δύσκολη δουλειά να εξαπλωθεί τυχαία.
Γιατί κάποιος πρέπει να έχει την κυριότητα της διαδρομής
Η μεταγλώττιση δεν μπορεί να παραμείνει χωρίς ιδιοκτήτη όταν μεταφέρει αποτελέσματα στα οποία βασίζονται οι άνθρωποι. Ένα γράφημα που εκτελείται σε CPU, GPU, FPGA και WASM χρειάζεται κάτι περισσότερο από μια έξυπνη αναπαράσταση. Χρειάζεται τεκμηρίωση, διαγνωστικά, ισχυρισμούς για τους στόχους, συμπεριφορά επεξεργαστή, δημιουργία κώδικα, ελέγχους ασφαλείας, συνομιλίες υποστήριξης και έναν τρόπο να πει κανείς στον αγοραστή τι ακριβώς άλλαξε όταν αλλάζει ένα αποτέλεσμα.
Αυτό δεν κάνει τη δουλειά λιγότερο τεχνική. Κάνει την τεχνική δουλειά πιο δεσμευτική. Η Kera είναι επί του παρόντος ένα εμπορικό προϊόν της Dweve, όχι μια έκδοση ανοιχτού κώδικα: με επιφύλαξη παντός δικαιώματος, διαθέσιμη με εμπορική άδεια, κατασκευασμένη στην Ολλανδία και προορισμένη για οργανισμούς που χρειάζονται τη διαδρομή γραφήματος υποστηριζόμενη και όχι απλώς δημοσιευμένη. Αν η σελίδα αναφέρει Rust 2021, γράφημα IR, προσαρμοσμένο JIT, χωρίς LLVM, CPU/GPU/FPGA/WASM, παρακολούθηση επιπτώσεων, κυριότητα μεταξύ χώρων μνήμης, ασφάλεια δυνατοτήτων, κατανεμημένη εκτέλεση, ενσωμάτωση C και Python, ροές εργασίας CLI, υποστήριξη επεξεργαστή και εργαλεία LSP, αυτά δεν είναι διακοσμητικά εσωτερικά στοιχεία. Είναι υποχρεώσεις που πρέπει να επιβιώσουν από την αξιολόγηση με πραγματικά φορτία εργασίας.
Το φύλλο δυνατοτήτων είναι προσεκτικό σε αυτό. Περιγράφει σχεδιαστικούς στόχους και λέει να επαληθεύσετε με βάση το φορτίο εργασίας σας. Αυτή η συγκράτηση έχει σημασία. Είναι πολύ πιο υγιές από το να προσποιείται κανείς ότι κάθε αριθμός σημείου αναφοράς μεταφέρεται. Το σύστημα θα πρέπει να δίνει στις ομάδες έναν τρόπο να μετρούν, να επιθεωρούν και να συγκρίνουν στο δικό τους περιβάλλον, όχι να τους ζητά να αποδεχτούν μια καθολική ιστορία ταχύτητας.
Κάποιος πρέπει να έχει την κυριότητα αυτής της διαδρομής επειδή κάθε στόχος προσπαθεί να κάνει την πηγή λιγότερο καθολική. Η Kera είναι το σημείο όπου αυτές οι διαφορές στόχων γίνονται ρητή δουλειά μεταγλωττιστή αντί για λαϊκή παράδοση που μεταδίδεται μετά την αναφορά σφάλματος.
Η μέρα που το γράφημα γίνεται η σύμβαση
Φανταστείτε ξανά την αρχική αναφορά σφάλματος, αλλά με την Kera ήδη στη ροή εργασίας. Μια ομάδα χρηματοοικονομικών εγκρίνει έναν υπολογισμό κινδύνου. Το αποτύπωμα του γραφήματος καταγράφεται. Η πρώτη ανάπτυξη εκτελείται σε CPU. Αργότερα, εισάγεται μια διαδρομή GPU για ανάλυση χαρτοφυλακίου. Αργότερα πάλι, χρησιμοποιείται μια διαδρομή FPGA για τιμολόγηση με χαμηλότερη καθυστέρηση. Το ερώτημα σε κάθε βήμα δεν είναι αν το νέο υλικό ακούγεται εντυπωσιακό. Το ερώτημα είναι αν το ίδιο γράφημα μεταγλωττίζεται και αν η σημασιολογία του στόχου διατηρεί το αποτέλεσμα πανομοιότυπο.
Η συζήτηση αλλάζει. Η ομάδα πλατφόρμας μπορεί να μιλήσει για προγραμματισμό και κόστος. Η ομάδα μεταγλωττιστή μπορεί να μιλήσει για τα παρασκήνια. Η ομάδα συμμόρφωσης μπορεί να μιλήσει για το αποτύπωμα. Ο ιδιοκτήτης της επιχείρησης μπορεί να ρωτήσει αν η μετακίνηση υλικού είναι επιχειρησιακή απόφαση ή επανεγγραφή. Το προϊόν δίνει σε όλους ένα αντικείμενο στο οποίο μπορούν να δείξουν.
Αυτή είναι η ήσυχη αξία ενός IR με διευθυνσιοδότηση περιεχομένου. Μετατρέπει την εκτέλεση σε πολλαπλές πλατφόρμες από μια σειρά πειστικών εξηγήσεων σε ένα αρχείο καταγραφής. Κάνει τον γράφο μια απόδειξη. Επιτρέπει στο ίδιο .keg να τροφοδοτεί κάθε backend. Δίνει στον οργανισμό μια γραμμή βάσης που ανήκει στον υπολογισμό και όχι σε μια μεμονωμένη μηχανή.
Κανένας μεταγλωττιστής δεν μπορεί να εξαλείψει την ανάγκη για μηχανική κρίση. Οι ομάδες πρέπει ακόμα να επιλέγουν τους στόχους τους προσεκτικά, να δοκιμάζουν τα φορτία εργασίας τους με ειλικρίνεια, να κατανοούν τα όρια των στόχων και να αποφασίζουν ποιοι τομείς απαιτούν πιστή αντιστοιχία bit προς bit. Αλλά η Kera μπορεί να κάνει αυτές τις αποφάσεις ρητές. Μπορεί να αποτρέψει μια μετάβαση απόδοσης από το να μετατραπεί κατά λάθος σε σημασιολογική μετάβαση.
Το μάθημα της μετατροπής
Η Kera έχει σημασία επειδή το δύσκολο μέρος δεν είναι το να έχεις μια έξυπνη ιδέα μετατροπής. Το δύσκολο μέρος είναι να μεταφέρεις αυτή την ιδέα μέσα από όλα τα βαρετά σημεία όπου η μηχανική είτε γίνεται αξιόπιστη είτε γίνεται λαογραφία: διαγνωστικά, πράσινα δέντρα, κατακερματισμοί τύπων, έλεγχος δανεισμού, βελτιστοποίηση σταθερού σημείου, επικύρωση αναλλοίωτων, σειριοποίηση .keg, εκπομπή backend, πολιτική ασφαλείας, αρχεία καταγραφής ελέγχου, υποστήριξη επεξεργαστή και εκτέλεση ειδική για τον στόχο.
Η μετατροπή είναι δουλειά επειδή κάθε στόχος προσπαθεί να κάνει την πηγή λιγότερο καθολική. Η ντετερμινιστική μηχανική μεταγλωττιστών είναι η πειθαρχία του να αρνείσαι να το επιτρέψεις αυτό σιωπηλά. Η CPU θέλει διανύσματα. Η GPU θέλει πυρήνες. Το FPGA θέλει κύκλους. Το WASM θέλει περιορισμούς. Ο οργανισμός θέλει μία απάντηση. Η δουλειά της Kera είναι να διατηρεί το νόημα του υπολογισμού ενώ επιτρέπει σε κάθε στόχο να κάνει αυτό στο οποίο είναι καλός.
Αυτό είναι ένα μηχανικό σχήμα, όχι μια αφηρημένη θεωρητική έννοια. Έχει έναν αγοραστή, έναν τρόπο αποτυχίας, μια μορφή αρχείου, μια διαδρομή μεταγλωττιστή και επιχειρησιακές συνέπειες. Η υπόσχεση δεν είναι ότι το υλικό γίνεται απλό. Η υπόσχεση είναι ότι η πολυπλοκότητα αναπαρίσταται, μετατρέπεται, ελέγχεται και ανήκει σε κάποιον.
Όταν φτάσει ο επόμενος σχεδόν σωστός αριθμός, η ομάδα δεν θα πρέπει να ξεκινά με λαογραφία για το ποια μηχανή έτρεξε τι. Θα πρέπει να ξεκινά με τον γράφο. Ταίριαξε το αποτύπωμα; Ποιο backend εξέπεμψε τον κώδικα; Ποιες δυνατότητες παραχωρήθηκαν; Ποια σημασιολογία στόχου εφαρμόστηκε; Ποιο αντικείμενο αποθηκεύτηκε; Αυτές είναι ερωτήσεις προϊόντος. Η Kera υπάρχει επειδή είναι επίσης ερωτήσεις μεταγλωττιστή.