Μέσα στο Core: πάνω από 2.900 πράξεις σε 12 backends
Τι δείχνει ο αριθμός των πράξεων
Ο πολλαπλασιασμός πινάκων ακούγεται σαν μία μόνο εργασία. Η υλοποίησή του, όμως, εξαρτάται από το τι σημαίνουν οι τιμές, πώς αποθηκεύονται, πώς αθροίζονται τα ενδιάμεσα αποτελέσματα και ποιο υλικό εκτελεί τον υπολογισμό. Ένας δυαδικός πίνακας με συμπιεσμένες τιμές και ένας πίνακας κινητής υποδιαστολής μπορεί να εκφράζουν την ίδια αφηρημένη πράξη, αλλά απαιτούν διαφορετικούς αριθμητικούς κανόνες και διαφορετικό κώδικα.
Το Core είναι η υπολογιστική βάση του Dweve για εκπαίδευση και συμπερασμό. Ο δημόσιος κατάλογός του περιλαμβάνει εκατοντάδες χιλιάδες βελτιστοποιημένους με το χέρι πυρήνες για περισσότερες από 2.900 πράξεις σε 76 κατηγορίες, 25 αριθμητικές μορφές και 12 backends. Οι αριθμοί αυτοί περιγράφουν διαφορετικά μέρη του συστήματος. Μια πράξη ορίζει τον υπολογισμό. Μια αριθμητική μορφή καθορίζει την αναπαράσταση. Ένα backend προσδιορίζει τον στόχο εκτέλεσης. Ένας πυρήνας υλοποιεί έναν συγκεκριμένο συνδυασμό επιλογών.
Αυτός ο διαχωρισμός έχει μεγαλύτερη σημασία από το να αντιμετωπίζουμε τον κατάλογο ως ένα ενιαίο σύνολο δυνατοτήτων. Ο προγραμματιστής χρειάζεται να γνωρίζει αν υπάρχει ο συνδυασμός που απαιτείται και ποιο συμβόλαιο διέπει την εκτέλεσή του.
Ο υπολογισμός και η αναπαράστασή του πάνε μαζί
Ας πάρουμε μια αναγωγή: συνδυάζουμε ένα σύνολο τιμών σε ένα αποτέλεσμα. Η λέξη «άθροισμα» αφήνει πολλά αναπάντητα ερωτήματα. Είναι οι είσοδοι προσημασμένοι ακέραιοι, τιμές σταθερής υποδιαστολής ή τιμές κινητής υποδιαστολής; Ποια αναπαράσταση αποθηκεύει το συσσωρευμένο αποτέλεσμα; Τι συμβαίνει όταν η αναπαράσταση δεν χωρά την επόμενη τιμή;
Το Core συνδέει αυτές τις επιλογές με την πράξη. Το συμβόλαιο εκτέλεσης περιλαμβάνει τον τύπο δεδομένων, το πλάτος, τη συσκευασία, τον συσσωρευτή, το backend, το σύνολο εντολών, την πολιτική dispatch και τη λειτουργία ντετερμινισμού. Η αλλαγή οποιουδήποτε από αυτά μπορεί να αλλάξει το νόημα του υπολογισμού, ακόμη κι όταν το όνομα της πράξης παραμένει ίδιο.
Οι 25 αριθμητικές μορφές περιλαμβάνουν δυαδικές, τριαδικές, ακέραιες, σταθερής υποδιαστολής, προσαρμοστικές και κινητής υποδιαστολής οικογένειες. Το όνομα μιας οικογένειας είναι μόνο η αφετηρία για την περιγραφή της αριθμητικής. Σημασία έχουν επίσης το πλάτος, το πρόσημο, η κλίμακα και η διάταξη αποθήκευσης. Επομένως, ο κατάλογος πρέπει να διαβάζεται ως σύνολο υποστηριζόμενων συνδυασμών και όχι ως υπόσχεση ότι κάθε πράξη διατίθεται σε κάθε πιθανή μορφή και σε κάθε στόχο.
Γι’ αυτό και μια μορφή ανταλλαγής δεδομένων δεν απαντά σε όλα τα ερωτήματα εκτέλεσης. Το ONNX περιγράφει ένα γράφημα υπολογισμού με τυποποιημένες εισόδους, εξόδους και τελεστές. Έτσι τα συστήματα μοιράζονται μια κοινή περιγραφή μοντέλου· το περιβάλλον εκτέλεσης εξακολουθεί να πρέπει να υλοποιήσει αυτούς τους τελεστές. Η τεκμηρίωση εννοιών του ONNX εξηγεί τη διάκριση ανάμεσα στην αναπαράσταση του γράφου και την εκτέλεση.
12 backends, σαφείς επιλογές εκτέλεσης
Τα 12 backends του Core καλύπτουν βαθμωτή εκτέλεση, σύνολα εντολών CPU, καθώς και στόχους GPU και φορητής εκτέλεσης. Η δημόσια λίστα περιλαμβάνει Scalar, SSE2, AVX2, AVX-512, NEON, SVE2, CUDA, ROCm, Metal, Vulkan, WebGPU και WASM. Πρόκειται για διαδρομές εκτέλεσης μέσα στο Core, όχι για διαφορετικές εκδόσεις ενός μοντέλου.
Το dispatch επιλέγει μια υποστηριζόμενη υλοποίηση για την πράξη και το συμβόλαιο εκτέλεσής της στον τρέχοντα host. Η επιλεγμένη διαδρομή καταγράφεται μαζί με το κελί εκτέλεσης, τον host και την αιτιολόγηση. Έτσι μπορείς να εξετάσεις τις επιλογές που έγιναν στην πράξη.
Η φορητότητα έχει, ωστόσο, όρια. Η τεκμηρίωση του WebAssembly, για παράδειγμα, διακρίνει την φορητή δυαδική μορφή από τα API που παρέχει το περιβάλλον host. Η εκτέλεση στον browser και εκτός browser μπορεί να προσφέρει διαφορετικές διεπαφές. Η τεκμηρίωση φορητότητας του WebAssembly δίνει χρήσιμο πλαίσιο για αυτή τη διάκριση. Η ονομασία ενός backend από μόνη της δεν περιγράφει το περιβάλλον λειτουργίας μιας εφαρμογής.
Η θέση του Core στο Dweve
Η βιβλιοθήκη primitives παρέχει στο Core τις θεμελιώδεις πράξεις. Το Core εντάσσει αυτά τα θεμέλια στο υπολογιστικό σύστημα. Το Loom είναι χτισμένο πάνω στο Core και χρησιμοποιεί τη βιβλιοθήκη solvers για τη συλλογιστική του. Έτσι κάθε μέρος έχει σαφή ευθύνη: τα primitives παρέχουν βασικές πράξεις, το Core εκτελεί υπολογισμούς και το Loom αναπτύσσει συλλογιστική πάνω σε αυτή τη βάση.
Το Dweve είναι η υπηρεσία. Το Fabric είναι το API και η πύλη της, μέσω των οποίων άνθρωποι και εφαρμογές αποκτούν πρόσβαση στην υπηρεσία. Το Fabric δεν αναλαμβάνει τον υπολογιστικό ρόλο του Core ή τον ρόλο συλλογιστικής του Loom. Η διεπαφή και τα συστήματα που βρίσκονται από πίσω εξυπηρετούν διαφορετικούς σκοπούς.
Ξεκίνα από τον υπολογισμό που χρειάζεσαι
Όταν αξιολογείς ένα υπολογιστικό σύστημα, ξεκίνα από έναν συγκεκριμένο υπολογισμό και την αναπαράσταση που απαιτεί. Έπειτα εξέτασε ποιο backend θα τον εκτελέσει, ποιοι κανόνες ισχύουν για τον συσσωρευτή και τη συσκευασία, καθώς και ποιο συμβόλαιο επανάληψης έχει δηλωθεί. Αυτά τα ερωτήματα κάνουν τον κατάλογο χρήσιμο για μια ομάδα.
Τα δημόσια στοιχεία του Core περιγράφουν το εύρος του καταλόγου. Το συμβόλαιο εκτέλεσης εξηγεί πώς να τον διαβάσεις. Χρειάζονται και τα δύο στην ίδια συζήτηση: ποιες εργασίες καλύπτει το σύστημα και τι σημαίνει στην πράξη μια συγκεκριμένη υλοποίηση.