Προγραμματισμός

Ανασκόπηση: Το Nvidia's Rapids φέρνει τα Python analytics στην GPU

Η κατασκευή μοντέλων μηχανικής μάθησης είναι μια επαναλαμβανόμενη διαδικασία. Συχνά η κουλτούρα και η ρουτίνα, είναι ένα παιχνίδι «ταχύτερα μέσω του νίκου του κύκλου», καθώς όσο πιο γρήγορα μπορείτε να επαναλάβετε, τόσο πιο εύκολο είναι να εξερευνήσετε νέες θεωρίες και να λάβετε καλές απαντήσεις. Αυτός είναι ένας από τους λόγους για τους οποίους η πρακτική επιχειρηματική χρήση της AI σήμερα κυριαρχείται από τις μεγαλύτερες επιχειρήσεις, οι οποίες μπορούν να ρίξουν τεράστιους πόρους στο πρόβλημα.

Το Rapids είναι μια ομπρέλα για πολλά έργα ανοιχτού κώδικα, που επωάστηκαν από τη Nvidia, που θέτει ολόκληρο τον αγωγό επεξεργασίας στην GPU, εξαλείφοντας τις δεσμευμένες μεταφορές δεδομένων I / O, ενώ ταυτόχρονα αυξάνει σημαντικά την ταχύτητα καθενός από τα μεμονωμένα βήματα. Παρέχει επίσης μια κοινή μορφή για τα δεδομένα, ελαττώνοντας το βάρος της ανταλλαγής δεδομένων μεταξύ διαφορετικών συστημάτων. Σε επίπεδο χρήστη, το Rapids μιμείται το API Python προκειμένου να διευκολύνει τη μετάβαση για τη συγκεκριμένη βάση χρηστών.

Το βιβλίο μαγειρικής Tidyverse

Αρχιτεκτονική οικοσυστήματος Rapids

Το έργο Rapids στοχεύει να αναπαράγει, ως επί το πλείστον, τη μηχανική εκμάθηση και τα API ανάλυσης δεδομένων της Python, αλλά για GPU και όχι CPU. Αυτό σημαίνει ότι οι προγραμματιστές της Python έχουν ήδη όλα όσα χρειάζονται για να τρέξουν στην GPU, χωρίς να χρειάζεται να μάθουν τις λεπτομέρειες χαμηλού επιπέδου του προγραμματισμού CUDA και των παράλληλων λειτουργιών. Η Pythonistas μπορεί να αναπτύξει κώδικα σε ένα μη ενεργοποιημένο GPU μηχάνημα και, στη συνέχεια, με λίγα τσιμπήματα, να το τρέξει σε όλες τις GPU που είναι διαθέσιμες σε αυτά.

Η εργαλειοθήκη Nvidia CUDA παρέχει πρωτόκολλα χαμηλότερου επιπέδου για βιβλιοθήκες μαθηματικών, παράλληλους αλγόριθμους και αναλυτικά στοιχεία γραφημάτων. Στην καρδιά της αρχιτεκτονικής βρίσκεται το πλαίσιο δεδομένων GPU, βασισμένο στο Apache Arrow, το οποίο παρέχει μια στήλη, δομή δεδομένων στη μνήμη που προγραμματίζει τη γλώσσα αγνωστικής. Ο χρήστης αλληλεπιδρά με το πλαίσιο δεδομένων GPU μέσω cuDF και ενός API που μοιάζει με Pandas. Το Dask, μια βιβλιοθήκη Python για παράλληλους υπολογιστές, μιμείται τα ανοδικά Python API και συνεργάζεται με βιβλιοθήκες CUDA για παράλληλο υπολογισμό. Σκεφτείτε το Dask ως Spark για τον Python.

ΚΑΤΑΡΡΑΚΤΗΣ

Τα τρία κύρια έργα, cuDF, cuML και cuGraph, αναπτύσσονται ανεξάρτητα, αλλά έχουν σχεδιαστεί για να λειτουργούν απρόσκοπτα μαζί. Στο πλαίσιο του έργου αναπτύσσονται επίσης γέφυρες στο ευρύτερο οικοσύστημα Python.

Εγκατάσταση Rapids

Η εγκατάσταση μέσω Anaconda σε μια μηχανή Linux στο AWS ήταν ως επί το πλείστον απλή, χωρίς κάποιους λόξυγκας λόγω αλλαγής εξαρτήσεων στην έκδοση 0.11. Η εγκατάσταση των βιβλιοθηκών C / C ++ για να χρησιμοποιήσετε το libcudf δεν ήταν τόσο εύκολη και θα συνιστούσα να ακολουθήσετε τη διαδικασία εγκατάστασης των Python APIs και Conda. Το Rapids περιλαμβάνει ένα σημειωματάριο Jupyter, επίσης διαθέσιμο στο δωρεάν Colab της Google, το οποίο καθιστά την αρχή απλή. Χρησιμοποίησα την έκδοση 0.10 του σημειωματάριου Jupyter για να εκτελέσω τον κώδικα στο Google Colab, το οποίο περιλαμβάνει μια GPU Nvidia Tesla T4.

Πλαίσιο δεδομένων GPU Rapids

Στο επίκεντρο κάθε ροής εργασίας της επιστήμης δεδομένων βρίσκεται το πλαίσιο δεδομένων. Εδώ συμβαίνει η μηχανική των χαρακτηριστικών και όπου περνάται η πλειοψηφία του χρόνου, καθώς οι επιστήμονες δεδομένων αντιμετωπίζουν βρώμικα δεδομένα. Το cuDF είναι το έργο Rapids για ένα πλαίσιο δεδομένων GPU που βασίζεται σε GPU. Η υποστήριξη του cuDF είναι το libcudf, μια βιβλιοθήκη C ++ που εφαρμόζει πρωτόγονα χαμηλού επιπέδου για την εισαγωγή δεδομένων Apache Arrow, την εκτέλεση μαθηματικών στοιχείων σε πίνακες και την εκτέλεση ταξινόμησης, συμμετοχής, ομαδοποίησης, μείωσης και άλλων λειτουργιών σε πίνακες μνήμης in-GPU. Η βασική δομή δεδομένων του libcudf είναι το GPU DataFrame (GDF), το οποίο με τη σειρά του μοντελοποιείται στο χώρο αποθήκευσης δεδομένων του Apache Arrow.

ΚΑΤΑΡΡΑΚΤΗΣ

Η βιβλιοθήκη Rapids Python παρουσιάζει στο χρήστη μια διεπαφή υψηλότερου επιπέδου που μοιάζει με πλαίσια δεδομένων, όπως εκείνα του Pandas. Σε πολλές περιπτώσεις, ο κώδικας Pandas εκτελείται αμετάβλητος στο cuDF. Όπου αυτό δεν συμβαίνει, συνήθως απαιτούνται μόνο μικρές αλλαγές.

Ορισμένες από το χρήστη συναρτήσεις στο cuDF

Μόλις περάσετε τον βασικό χειρισμό δεδομένων, μερικές φορές είναι απαραίτητο να επεξεργαστείτε σειρές και στήλες με λειτουργίες που ορίζονται από τον χρήστη (UDF). Το cuDF παρέχει ένα API στυλ PyData για τη σύνταξη κώδικα για την επεξεργασία πιο δομημένων δομών δεδομένων όπως πίνακες, σειρές και κινούμενα παράθυρα. Προς το παρόν υποστηρίζονται μόνο αριθμητικοί και Boolean τύποι. Τα UDF συντάσσονται χρησιμοποιώντας τον μεταγλωττιστή Numba JIT, ο οποίος χρησιμοποιεί ένα υποσύνολο LLVM για τη μεταγλώττιση αριθμητικών συναρτήσεων σε κώδικα μηχανής CUDA. Αυτό έχει ως αποτέλεσμα σημαντικά ταχύτερους χρόνους εκτέλεσης στην GPU.

Συμβολοσειρές σε cuDF

Παρόλο που οι GPU είναι φανταστικές για την ταχεία επεξεργασία διανυσμάτων float, συνήθως δεν έχουν χρησιμοποιηθεί για την επεξεργασία δεδομένων συμβολοσειρών και η πραγματικότητα είναι ότι τα περισσότερα δεδομένα έρχονται σε εμάς με τη μορφή συμβολοσειρών. Το cuStrings είναι μια βιβλιοθήκη χειρισμού συμβολοσειρών GPU για διαχωρισμό, εφαρμογή regexes, συνένωση, αντικατάσταση tokens κ.λπ. σε πίνακες συμβολοσειρών. Όπως και άλλες λειτουργίες του cuDF, υλοποιείται ως βιβλιοθήκη C / C ++ (libnvStrings) και τυλίγεται από ένα στρώμα Python που έχει σχεδιαστεί για να μιμείται τα Pandas. Παρόλο που ο τύπος δεδομένων συμβολοσειράς δεν έχει βελτιστοποιηθεί για εκτέλεση σε GPU, η παράλληλη εκτέλεση του κώδικα θα πρέπει να παρέχει επιτάχυνση έναντι χειρισμού συμβολοσειρών που βασίζονται σε CPU.

Λήψη δεδομένων εντός ή εκτός cuDF

Το Dataframe I / O διαχειρίζεται από μια ειδική βιβλιοθήκη, cuIO. Υποστηρίζονται όλες οι συνηθέστερες μορφές, συμπεριλαμβανομένων των Arrow, ORC, Parquet, HDF5 και CSV. Εάν είστε αρκετά τυχεροί που χρησιμοποιείτε το υλικό DGX-2, μπορείτε να χρησιμοποιήσετε την ενσωμάτωση GPU Direct Storage για να μεταφέρετε δεδομένα απευθείας από την αποθήκευση υψηλής ταχύτητας στην GPU χωρίς να περιλαμβάνει τη CPU. Οι θνητοί χρήστες θα εκτιμήσουν ακόμη την επιτάχυνση που δίνει η GPU κατά την αποσυμπίεση μεγάλων συνόλων δεδομένων και την στενή ενοποίηση με το οικοσύστημα Python.

Το GPU Direct Storage είναι επί του παρόντος σε άλφα και, όταν κυκλοφορήσει, θα είναι διαθέσιμο στα περισσότερα GPU του Tesla. Μπορείτε να δημιουργήσετε ένα πλαίσιο δεδομένων GPU από πίνακες NumPy, Pandas DataFrames και PyArrow πίνακες με μία μόνο γραμμή κώδικα. Άλλα έργα μπορούν να ανταλλάσσουν δεδομένα μέσω του __cuda_array_interface__ για βιβλιοθήκες που εμπίπτουν στο οικοσύστημα Numba. Το DLPack για βιβλιοθήκες νευρωνικών δικτύων είναι επίσης υποστηριζόμενη διεπαφή.

Πιθανώς το μεγαλύτερο μειονέκτημα στη χρήση του cuDF είναι η έλλειψη διαλειτουργικότητας εκτός του Python. Πιστεύω ότι η εστίαση σε μια ισχυρή βάση των API C / C ++, όπως έχει κάνει το Arrow, θα επιτρέψει ένα ευρύτερο οικοσύστημα και θα ωφελήσει το έργο στο σύνολό του.

CuML του Rapids

Οι δηλωμένοι στόχοι της cuML είναι να είναι το "Scikit-learning της Python που υποστηρίζεται από GPU". Θεωρητικά αυτό σημαίνει ότι πρέπει να αλλάξετε μόνο τη δήλωση εισαγωγής σας και ίσως να ρυθμίσετε μερικές από τις παραμέτρους για να λάβετε υπόψη τις διαφορές στην εκτέλεση σε μια CPU, όπου μερικές φορές η προσέγγιση brute force είναι καλύτερη. Το πλεονέκτημα της ύπαρξης Scikit-learning που βασίζεται σε GPU είναι δύσκολο να υποτιμηθεί. Οι ταχύτητες είναι σημαντικές και οι αναλυτές δεδομένων μπορεί να είναι πολλές φορές πιο παραγωγικοί. Το C ++ API δεν είναι αρκετά έτοιμο για ευρεία κατανάλωση εκτός των συνδέσεων του Python, αλλά αναμένεται να βελτιωθεί.

Το cuML περιλαμβάνει επίσης API για βοήθεια με τον συντονισμό υπερπαραμέτρων μέσω του Dask, μιας βιβλιοθήκης για την κλιμάκωση της Python σε πολλούς κόμβους. Πολλοί αλγόριθμοι μηχανικής μάθησης μπορούν να γίνουν αποτελεσματικά παράλληλοι και το cuML αναπτύσσει ενεργά αλγόριθμους πολλαπλών GPU και πολλαπλών κόμβων, πολλαπλών GPU.

ΚΑΤΑΡΡΑΚΤΗΣ

Rapid 'cuGraph

Το cuGraph είναι το τρίτο μέλος του οικοσυστήματος Rapids και, όπως και τα άλλα, το cuGraph είναι πλήρως ενσωματωμένο με cuDF και cuML. Προσφέρει μια καλή επιλογή αλγορίθμων γραφημάτων, πρωτότυπων και βοηθητικών προγραμμάτων, όλα με επιτάχυνση GPU. Η επιλογή των API στο cuGraph είναι κάπως πιο εκτεταμένη από ό, τι σε άλλα μέρη του Rapids, με όλα τα NetworkX, Pregel, GraphBLAS και GQL (Graph Query Language).

ΚΑΤΑΡΡΑΚΤΗΣ

Το cuGraph μοιάζει περισσότερο με μια εργαλειοθήκη στο πνεύμα από το cuML. Η τεχνολογία γραφικών είναι ένας ταχέως κινούμενος χώρος τόσο στην ακαδημαϊκή όσο και στη βιομηχανία. Έτσι, από τη σχεδίαση, το cuGraph δίνει στους προγραμματιστές πρόσβαση στα αρχικά στρώματα και γραφήματα C ++, ενθαρρύνοντας τρίτα μέρη να αναπτύξουν προϊόντα χρησιμοποιώντας το cuGraph. Αρκετά πανεπιστήμια έχουν συνεισφέρει, και έργα από το Texas A&M (GraphBLAS), το Georgia Tech (Hornet) και το UC Davis (Gunrock) έχουν «παραχθεί» και συμπεριληφθούν στην ομπρέλα cuGraph. Κάθε έργο παρέχει ένα διαφορετικό σύνολο δυνατοτήτων, όλα επιταχυνόμενα από GPU και όλα υποστηρίζονται από το ίδιο πλαίσιο δεδομένων cuDF.

Το NetworkX είναι το API Python που στοχεύει η ομάδα Rapids για την εγγενή του διεπαφή. Υπάρχουν διάφοροι αλγόριθμοι διαθέσιμοι μέσω αυτής της διεπαφής. Ενώ μόνο η κατάταξη σελίδας είναι πολλαπλή GPU, η ομάδα εργάζεται ενεργά σε εκδόσεις πολλαπλών GPU των άλλων, όπου ισχύει.

ΚΑΤΑΡΡΑΚΤΗΣ

Ένα από τα υποέργα cuGraph που βρήκα ενδιαφέρον είναι το cugraphBLAS, μια προσπάθεια τυποποίησης δομικών στοιχείων για αλγόριθμους γραφημάτων στη γλώσσα της γραμμικής άλγεβρας. Με βάση το GraphBLAS (graphblas.org), μια προσαρμοσμένη δομή δεδομένων που έχει σχεδιαστεί για αραιή δυναμική επεξεργασία γραφημάτων.

Ένα άλλο υπο-έργο cuGraph, το Hornet παρέχει μια ανεξάρτητη από το σύστημα μορφή για να περιέχει δεδομένα γραφημάτων, ανάλογα με τον τρόπο που το βέλος Apache παρέχει έναν ανεξάρτητο από το σύστημα τρόπο επεξεργασίας των πλαισίων δεδομένων. Το Hornet υποστηρίζει τις περισσότερες από τις δημοφιλείς μορφές γραφημάτων, όπως SNAP, mtx, metis και edge.

Σύμφωνα με το πνεύμα να είστε κοντά στην κοινότητα Python, το εγγενές πακέτο NetworkX της Python μπορεί να χρησιμοποιηθεί για τη μελέτη σύνθετων δικτύων. Αυτό περιλαμβάνει δομές δεδομένων για γραφήματα και πολλαπλά γραφήματα, που επαναχρησιμοποιούνται χρησιμοποιώντας πρωτότυπα CUDA, επιτρέποντάς σας να επαναχρησιμοποιήσετε πολλούς από τους τυπικούς αλγόριθμους γραφημάτων και να εκτελέσετε μέτρα δομής και ανάλυσης δικτύου. Η πλειονότητα των αλγορίθμων είναι single-GPU, όπως το NetworkX. Παρ 'όλα αυτά, η εκτέλεση τους μόνο στην GPU προσφέρει σημαντική επιτάχυνση, ενώ η εργασία συνεχίζει να μεταφέρεται σε εφαρμογές πολλαπλών GPU.

Στον χάρτη πορείας του Rapids

Δεδομένης της τεράστιας ταχύτητας που παρέχει η ανάλυση GPU, υπάρχουν μερικά νέα έργα που έρχονται στο μείγμα σε μελλοντικές εκδόσεις.

DLPack και array_interface για βαθιά μάθηση

Τα νευρωνικά δίκτυα πολλαπλών επιπέδων ήταν ένα από τα πρώτα φορτία εργασίας που μετακινήθηκαν σε GPU και υπάρχει ένα αρκετά μεγάλο κώδικα για αυτήν την περίπτωση χρήσης μηχανικής μάθησης. Προηγουμένως το DLPack ήταν το de-facto πρότυπο για την ανταλλαγή δεδομένων μεταξύ βιβλιοθηκών βαθιάς μάθησης. Σήμερα υποστηρίζεται συνήθως η διασύνδεση array_interface. Το Rapids υποστηρίζει και τα δύο.

cuSignal

Όπως τα περισσότερα άλλα έργα στο Rapids, το cuSignal είναι μια GPU επιταχυνόμενη έκδοση μιας υπάρχουσας βιβλιοθήκης Python, στην περίπτωση αυτή η βιβλιοθήκη SciPy Signal. Η αρχική βιβλιοθήκη SciPy Signal βασίζεται στο NumPy, το οποίο αντικαθίσταται με το αντίστοιχο με επιτάχυνση GPU, CuPy στο cuSignal. Αυτό είναι ένα καλό παράδειγμα της φιλοσοφίας σχεδιασμού Rapids στην εργασία. Με εξαίρεση μερικούς προσαρμοσμένους πυρήνες CUDA, η θύρα προς την GPU περιλαμβάνει κυρίως την αντικατάσταση της δήλωσης εισαγωγής και την τροποποίηση μερικών παραμέτρων λειτουργίας.

Η μεταφορά της επεξεργασίας σήματος στο Rapids fold είναι μια έξυπνη κίνηση. Η επεξεργασία σημάτων είναι παντού και έχει πολλές άμεσα χρήσιμες εμπορικές εφαρμογές στη βιομηχανία και την άμυνα.

χωρικός

Οι χωρικές και χωροχρονικές λειτουργίες είναι εξαιρετικοί υποψήφιοι για την επιτάχυνση της GPU και επιλύουν πολλά πραγματικά προβλήματα που αντιμετωπίζουμε στην καθημερινή ζωή, όπως η ανάλυση των προτύπων κυκλοφορίας, της υγείας / ποιότητας του εδάφους και του κινδύνου πλημμύρας. Πολλά από τα δεδομένα που συλλέγονται από κινητές συσκευές, συμπεριλαμβανομένων των drones, έχουν γεωχωρικό στοιχείο και η χωρική ανάλυση βρίσκεται στην καρδιά της Smart City.

Αρχιτεκτονική όπως και τα άλλα στοιχεία, το cuSpatial είναι μια βιβλιοθήκη C ++ που βασίζεται σε πρωτόκολλα CUDA και στη βιβλιοθήκη επεξεργασίας φορέα Thrust, χρησιμοποιώντας το cuDF για ανταλλαγή δεδομένων. Οι καταναλωτές της βιβλιοθήκης C ++ μπορούν να διαβάσουν δεδομένα σημείων, πολυγραμμών και πολυγώνων χρησιμοποιώντας έναν αναγνώστη C ++. Οι χρήστες Python προτιμούν να χρησιμοποιούν τα υπάρχοντα πακέτα Python όπως το Shapely ή το Fiona για να συμπληρώσουν έναν πίνακα NumPy και, στη συνέχεια, να χρησιμοποιούν το cuSpatial Python API ή να μετατρέπουν σε cuDF dataframes.

cuxfilter για οπτικοποίηση δεδομένων

Η οπτικοποίηση των δεδομένων είναι θεμελιώδης, τόσο στη ροή εργασίας των αναλυτικών στοιχείων όσο και για την παρουσίαση ή την αναφορά αποτελεσμάτων. Ωστόσο, για όλη τη μαγεία που μπορούν να λειτουργούν οι GPU στα ίδια τα δεδομένα, η αποστολή αυτών των δεδομένων σε ένα πρόγραμμα περιήγησης δεν είναι ασήμαντη εργασία. Το cuxfilter, εμπνευσμένο από τη βιβλιοθήκη Crossfilter JavaScript, στοχεύει να γεφυρώσει αυτό το κενό παρέχοντας μια στοίβα για να επιτρέψει σε βιβλιοθήκες οπτικοποίησης τρίτων να εμφανίζουν δεδομένα σε πλαίσια δεδομένων cuDF.

Υπήρξαν μερικές επαναλήψεις του cuxfilter καθώς η ομάδα ταξινομεί την καλύτερη αρχιτεκτονική και μοτίβα σύνδεσης. Η τελευταία επανάληψη αξιοποιεί τους φορητούς υπολογιστές Jupyter, τον διακομιστή Bokeh και τους πίνακες PyViz, ενώ τα πειράματα ολοκλήρωσης περιλαμβάνουν έργα από Uber, Falcon και PyDeck. Αυτό το στοιχείο δεν είναι ακόμη έτοιμο για πρώτη φορά, αλλά πρόκειται να κυκλοφορήσει στο Rapids 0.13. Υπάρχουν πολλά κινούμενα μέρη και δεν έχω πειραματιστεί από πρώτο χέρι, αλλά αν ανταποκριθεί στην υπόσχεσή του, αυτό θα είναι μια εξαιρετική προσθήκη στην εργαλειοθήκη Rapids.

Κλιμάκωση και έξοδο με το Dask

Το Dask διανέμεται χρονοδιάγραμμα εργασιών για την Python, παίζοντας παρόμοιο ρόλο για την Python που παίζει ο Apache Spark για τη Scala. Το Dask-cuDF είναι μια βιβλιοθήκη που παρέχει διαχωρισμένα, υποστηριζόμενα από GPU πλαίσια δεδομένων. Το Dask-cuDF λειτουργεί καλά όταν σκοπεύετε να χρησιμοποιήσετε cuML ή όταν φορτώνετε ένα σύνολο δεδομένων που είναι μεγαλύτερο από τη μνήμη GPU ή είναι διασκορπισμένο σε πολλά αρχεία.

Όπως ένα Spark RDD (Resilient Distributed Dataset), το Dask-cuDF κατανεμημένο πλαίσιο δεδομένων συμπεριφέρεται κυρίως όπως ένα τοπικό, οπότε μπορείτε να πειραματιστείτε με το τοπικό μηχάνημά σας και να μεταβείτε σε ένα κατανεμημένο μοντέλο όταν πρέπει να κλιμακώσετε. Το Dask-cuML παρέχει δυνατότητες πολλαπλών κόμβων cuML, καθιστώντας την μια καλή επιλογή όταν δεν έχετε τον προϋπολογισμό για έναν σταθμό εργασίας DGX.