5 συμβουλές για εκπαίδευση πολλαπλών GPU με το Keras PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

5 συμβουλές για εκπαίδευση πολλαπλών GPU με την Keras

Το Deep Learning (το αγαπημένο τσιτάτο στα τέλη της δεκαετίας του 2010 μαζί με το blockchain/bitcoin και την Data Science/Machine Learning) μας έδωσε τη δυνατότητα να κάνουμε μερικά πραγματικά υπέροχα πράγματα τα τελευταία χρόνια. Εκτός από τις εξελίξεις στους αλγόριθμους (οι οποίοι ομολογουμένως βασίζονται σε ιδέες που είναι ήδη γνωστές από τη δεκαετία του 1990 και ονομάζεται «εποχή εξόρυξης δεδομένων»), οι κύριοι λόγοι της επιτυχίας του μπορούν να αποδοθούν στη διαθεσιμότητα μεγάλων δωρεάν συνόλων δεδομένων, στην εισαγωγή βιβλιοθηκών ανοιχτού κώδικα και τη χρήση GPU. Σε αυτήν την ανάρτηση ιστολογίου θα επικεντρωθώ στα δύο τελευταία και θα μοιραστώ μαζί σας μερικές συμβουλές που έμαθα με τον δύσκολο τρόπο.

Γιατί TensorFlow & Keras;

TensorFlow είναι μια πολύ δημοφιλής βιβλιοθήκη Deep Learning που αναπτύχθηκε από την Google και σας επιτρέπει να πρωτοτυπείτε γρήγορα πολύπλοκα δίκτυα. Έρχεται με πολλές ενδιαφέρουσες δυνατότητες όπως η αυτόματη διαφοροποίηση (που σας εξοικονομεί από την εκτίμηση/κωδικοποίηση των κλίσεων των συναρτήσεων κόστους) και υποστήριξη GPU (η οποία σας επιτρέπει να έχετε εύκολα μια βελτίωση ταχύτητας 200x χρησιμοποιώντας αξιοπρεπές υλικό). Επιπλέον, προσφέρει μια διεπαφή Python που σημαίνει ότι μπορείτε να κάνετε πρωτότυπο γρήγορα χωρίς να απαιτείται η εγγραφή κωδικού C ή CUDA. Ομολογουμένως υπάρχουν πολλά άλλα πλαίσια που μπορεί κανείς να χρησιμοποιήσει αντί του TensorFlow, όπως Torch, MXNet, Theano, Caffe, Deeplearning4j, CNTK, κ.λπ., αλλά όλα εξαρτώνται από τη θήκη χρήσης σας και τις προσωπικές σας προτιμήσεις.

Μα γιατί Keras; Για μένα η χρήση απευθείας TF είναι σαν να κάνω Machine Learning με το Numpy. Ναι, είναι εφικτό και κατά καιρούς πρέπει να το κάνετε (ειδικά αν γράφετε προσαρμοσμένα επίπεδα/λειτουργίες απώλειας) αλλά θέλετε πραγματικά να γράψετε κώδικα που περιγράφει τα πολύπλοκα δίκτυα ως μια σειρά διανυσματικών πράξεων (ναι, ξέρω υπάρχουν μέθοδοι υψηλότερου επιπέδου στο TF, αλλά δεν είναι τόσο δροσερές όσο το Keras); Επίσης τι γίνεται αν θέλετε να μετακομίσετε σε διαφορετική βιβλιοθήκη; Λοιπόν, πιθανότατα θα χρειαστεί να ξαναγράψετε τον κώδικα, ο οποίος είναι χάλια. Ta ta taaa, Κεράς στη διάσωση! Το Keras σάς επιτρέπει να περιγράφετε τα δίκτυά σας χρησιμοποιώντας έννοιες υψηλού επιπέδου και να γράφετε κώδικα που είναι αγνωστικιστικός, οπότε μπορείτε να εκτελέσετε τα δίκτυα σε διαφορετικές βιβλιοθήκες βαθιάς εκμάθησης. Λίγα πράγματα που μου αρέσουν στην Κεράς είναι ότι είναι καλογραμμένο, έχει αντικειμενοστρεφή αρχιτεκτονική, είναι εύκολο να συνεισφέρει και έχει μια φιλική κοινότητα. Αν σας αρέσει, πείτε ευχαριστώ Φρανσουά Σολέ για την ανάπτυξη και την ανοιχτή προμήθειά του.

Συμβουλές και Gotchas για εκπαίδευση Multi-GPU

Χωρίς περαιτέρω καθυστέρηση, ας προχωρήσουμε σε μερικές συμβουλές για το πώς να αξιοποιήσετε στο έπακρο την εκπαίδευση GPU στο Keras και μερικές γκέτες που πρέπει να έχετε κατά νου:

1. Η εκπαίδευση πολλαπλών GPU δεν είναι αυτόματη

Τα μοντέλα εκπαίδευσης σε GPU χρησιμοποιώντας Keras & Tensorflow είναι απρόσκοπτα. Εάν διαθέτετε κάρτα NVIDIA και έχετε εγκαταστήσει το CUDA, οι βιβλιοθήκες θα το εντοπίσουν αυτόματα και θα το χρησιμοποιήσουν για εκπαίδευση. Τόσο δροσερό! Τι γίνεται όμως αν είστε κακομαθημένος και έχετε πολλαπλές GPU; Δυστυχώς, θα πρέπει να εργαστείτε λίγο για να επιτύχετε εκπαίδευση πολλαπλών GPU.
5 συμβουλές για εκπαίδευση πολλαπλών GPU με το Keras PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.
Υπάρχουν πολλοί τρόποι παραλληλισμού ενός δικτύου ανάλογα με το τι θέλετε να επιτύχετε, αλλά οι δύο κύριες προσεγγίσεις είναι η παραλληλισμός μοντέλων και δεδομένων. Το πρώτο μπορεί να σας βοηθήσει εάν το μοντέλο σας είναι πολύ περίπλοκο για να χωρέσει σε μία GPU, ενώ το δεύτερο βοηθά όταν θέλετε να επιταχύνετε την εκτέλεση. Συνήθως όταν οι άνθρωποι μιλούν για εκπαίδευση πολλαπλών GPU εννοούν το τελευταίο. Παλαιότερα ήταν πιο δύσκολο να επιτευχθεί, αλλά ευτυχώς ο Keras πρόσφατα συμπεριέλαβε μια μέθοδο χρησιμότητας που ονομάζεται mutli_gpu_model που διευκολύνει την παράλληλη εκπαίδευση/προβλέψεις (προς το παρόν διατίθεται μόνο με TF backend). Η κύρια ιδέα είναι ότι περνάτε το μοντέλο σας μέσω της μεθόδου και αντιγράφεται σε διαφορετικές GPU. Η αρχική είσοδος χωρίζεται σε κομμάτια τα οποία τροφοδοτούνται στις διάφορες GPU και στη συνέχεια συγκεντρώνονται ως μία έξοδος. Αυτή η μέθοδος μπορεί να χρησιμοποιηθεί για την επίτευξη παράλληλης εκπαίδευσης και προβλέψεων, ωστόσο λάβετε υπόψη ότι για την εκπαίδευση δεν κλιμακώνεται γραμμικά με την ποσότητα των GPU λόγω του απαιτούμενου συγχρονισμού.

2. Δώστε προσοχή στο Μέγεθος παρτίδας

Όταν κάνετε εκπαίδευση πολλαπλών GPU, δώστε προσοχή στο μέγεθος της παρτίδας καθώς έχει πολλαπλές επιδράσεις στην ταχύτητα/μνήμη, τη σύγκλιση του μοντέλου σας και αν δεν είστε προσεκτικοί μπορεί να καταστρέψετε τα βάρη του μοντέλου σας!

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

Σύγκλιση: Εάν χρησιμοποιείτε το Stochastic Gradient Decent (SGD) ή μερικές από τις παραλλαγές του για να εκπαιδεύσετε το μοντέλο σας, θα πρέπει να έχετε κατά νου ότι το μέγεθος της παρτίδας μπορεί να επηρεάσει την ικανότητα σύγκλισης και γενίκευσης του δικτύου σας. Τα τυπικά μεγέθη παρτίδας σε πολλά προβλήματα όρασης υπολογιστή είναι μεταξύ 32-512 παραδειγμάτων. Οπως και Keskar et al "Έχει παρατηρηθεί στην πράξη ότι όταν χρησιμοποιείται μεγαλύτερη παρτίδα (από 512) υπάρχει υποβάθμιση της ποιότητας του μοντέλου, όπως μετρείται από την ικανότητά του να γενικεύει." Σημειώστε ότι άλλα διαφορετικά βελτιστοποιητικά έχουν διαφορετικές ιδιότητες και οι εξειδικευμένες τεχνικές βελτιστοποιημένης κατανομής μπορούν να βοηθήσουν στο πρόβλημα. Εάν ενδιαφέρεστε για τις μαθηματικές λεπτομέρειες, σας συνιστώ να διαβάσετε τη διατριβή του Joeri Hermans "Σχετικά με την κλιμακούμενη βαθειά μάθηση και την παράλληλη κατάβαση κλίσης".
5 συμβουλές για εκπαίδευση πολλαπλών GPU με το Keras PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.
Διαφθορά τα βάρη: Αυτή είναι μια δυσάρεστη τεχνική λεπτομέρεια που μπορεί να έχει καταστροφικά αποτελέσματα. Όταν κάνετε εκπαίδευση πολλαπλών GPU, είναι σημαντικό να τροφοδοτείτε όλα τα GPU με δεδομένα. Μπορεί να συμβεί η τελευταία παρτίδα της εποχής σας να έχει λιγότερα δεδομένα από ό, τι ορίζεται (επειδή το μέγεθος του συνόλου δεδομένων σας δεν μπορεί να διαιρεθεί ακριβώς με το μέγεθος της παρτίδας σας). Αυτό μπορεί να έχει ως αποτέλεσμα ορισμένοι GPU να μην λαμβάνουν δεδομένα κατά το τελευταίο βήμα. Δυστυχώς, ορισμένα στρώματα Keras, με κυριότερο το Batch Normalization Layer, δεν μπορούν να αντιμετωπίσουν αυτό που οδηγεί σε τιμές nan που εμφανίζονται στα βάρη (ο μέσος όρος και η διακύμανση στο στρώμα BN). Για να γίνουν τα πράγματα ακόμη πιο άσχημα, κανείς δεν θα παρατηρήσει το πρόβλημα κατά τη διάρκεια της προπόνησης (ενώ η φάση εκμάθησης είναι 1) επειδή το συγκεκριμένο επίπεδο χρησιμοποιεί τη μέση/διακύμανση της παρτίδας στις εκτιμήσεις. Παρ 'όλα αυτά, κατά τη διάρκεια των προβλέψεων (η φάση εκμάθησης ορίζεται στο 0), χρησιμοποιείται ο μέσος όρος/διακύμανση που στην περίπτωσή μας μπορεί να γίνει nan οδηγώντας σε κακά αποτελέσματα. Κάντε λοιπόν τη χάρη στον εαυτό σας και βεβαιωθείτε πάντα ότι το μέγεθος της παρτίδας σας είναι σταθερό όταν κάνετε εκπαίδευση πολλαπλών GPU. Δύο απλοί τρόποι για να επιτευχθεί αυτό είναι είτε με την απόρριψη παρτίδων που δεν ταιριάζουν με το προκαθορισμένο μέγεθος είτε με την επανάληψη των εγγραφών εντός της παρτίδας μέχρι να φτάσετε στο προκαθορισμένο μέγεθος. Τέλος, μην ξεχνάτε ότι σε μια ρύθμιση πολλαπλών GPU, το μέγεθος της παρτίδας πρέπει να είναι πολλαπλάσιο του αριθμού των διαθέσιμων GPU στο σύστημά σας.

3. Δεδομένα GPU Πείνα ή αλλιώς οι CPU δεν μπορούν να συμβαδίσουν με τις GPU

Συνήθως το πιο ακριβό μέρος κατά την εκπαίδευση/πρόβλεψη Βαθιά δίκτυα είναι η εκτίμηση που συμβαίνει στις GPU. Τα δεδομένα υποβάλλονται σε προεπεξεργασία στις CPU στο παρασκήνιο και τροφοδοτούνται περιοδικά στις GPU. Ωστόσο, δεν πρέπει να υποτιμάται πόσο γρήγορα είναι οι GPU. μπορεί να συμβεί εάν το δίκτυό σας είναι πολύ ρηχό ή το βήμα προεπεξεργασίας είναι πολύ περίπλοκο ώστε οι CPU σας να μην μπορούν να συμβαδίσουν με τις GPU σας ή με άλλα λόγια να μην τα τροφοδοτούν με δεδομένα αρκετά γρήγορα. Αυτό μπορεί να οδηγήσει σε χαμηλή χρήση GPU που μεταφράζεται σε σπατάλη χρημάτων/πόρων.
5 συμβουλές για εκπαίδευση πολλαπλών GPU με το Keras PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.
Ο Keras εκτελεί συνήθως τις εκτιμήσεις των παρτίδων παράλληλα, ωστόσο λόγω του Python GIL (Global Interpreter Lock) δεν μπορείτε να επιτύχετε πραγματικά αληθινά multi-threading στην Python. Υπάρχουν δύο λύσεις για αυτό: είτε χρησιμοποιήστε πολλαπλές διαδικασίες (σημειώστε ότι υπάρχουν πολλές γκέτες σε αυτήν που δεν πρόκειται να καλύψω εδώ) είτε κρατήστε απλό το βήμα προεπεξεργασίας. Στο παρελθόν έχω στείλει ένα Pull-Request on Keras για να ανακουφίσω κάποια από την περιττή πίεση που ασκούσαμε στις CPU κατά την προεπεξεργασία εικόνας, οπότε οι περισσότεροι χρήστες δεν θα πρέπει να επηρεαστούν εάν χρησιμοποιούν τις τυπικές γεννήτριες. Εάν έχετε προσαρμοσμένες γεννήτριες, προσπαθήστε να προωθήσετε όσο το δυνατόν περισσότερη λογική σε βιβλιοθήκες C όπως η Numpy, επειδή μερικές από αυτές τις μεθόδους στην πραγματικότητα απελευθερώστε το GIL πράγμα που σημαίνει ότι μπορείτε να αυξήσετε τον βαθμό παραλληλισμού. Ένας καλός τρόπος για να διαπιστώσετε εάν αντιμετωπίζετε πείνα δεδομένων GPU είναι να παρακολουθείτε τη χρήση της GPU, ωστόσο προειδοποιήστε ότι αυτός δεν είναι ο μόνος λόγος για να το παρατηρήσετε (ο συγχρονισμός που συμβαίνει κατά τη διάρκεια της εκπαίδευσης σε πολλαπλές GPU φταίει επίσης για τη χαμηλή χρήση ). Συνήθως η πείνα δεδομένων GPU μπορεί να ανιχνευθεί παρατηρώντας εκρήξεις GPU που ακολουθούνται από μεγάλες παύσεις χωρίς χρήση. Στο παρελθόν έχω ανοίξει μια επέκταση για το Dstat που μπορεί να σας βοηθήσει να μετρήσετε τη χρήση της GPU σας, οπότε ρίξτε μια ματιά στο αρχική δημοσίευση blog.

4. Αποθήκευση των παράλληλων μοντέλων σας

Ας πούμε ότι χρησιμοποιήσατε τη μέθοδο mutli_gpu_model για να παραλληλίσετε το μοντέλο σας, η εκπαίδευση ολοκληρώθηκε και τώρα θέλετε να διατηρήσετε τα βάρη της. Τα κακά νέα είναι ότι δεν μπορείτε απλά να καλέσετε το save () σε αυτό. Προς το παρόν, το Keras έχει έναν περιορισμό που δεν σας επιτρέπει αποθηκεύστε ένα παράλληλο μοντέλοΤο Υπάρχουν δύο τρόποι για να το κάνετε αυτό: είτε καλέστε την αποθήκευση () στην αναφορά του αρχικού μοντέλου (τα βάρη θα ενημερωθούν αυτόματα) είτε θα πρέπει να κάνετε σειριακή διάταξη του μοντέλου διακόπτοντας την παράλληλη έκδοση και καθαρίζοντας όλες τις περιττές συνδέσεις. Η πρώτη επιλογή είναι πολύ πιο εύκολη, αλλά στο μέλλον σκοπεύω να ανοίξω μια μέθοδο σειριοποίησης () που εκτελεί την τελευταία.

5. Η καταμέτρηση των διαθέσιμων GPU έχει μια δυσάρεστη παρενέργεια

Δυστυχώς αυτή τη στιγμή, υπάρχει μια δυσάρεστη παρενέργεια στη μέθοδο tensorflow.python.client.device_lib.list_local_devices () που προκαλεί τη δημιουργία μιας νέας περιόδου σύνδεσης TensorFlow και την προετοιμασία όλων των διαθέσιμων GPU στο σύστημα. Αυτό μπορεί να οδηγήσει σε απροσδόκητα αποτελέσματα, όπως η προβολή περισσότερων GPU από τις καθορισμένες ή η πρόωρη εκκίνηση νέων περιόδων σύνδεσης (μπορείτε να διαβάσετε όλες τις λεπτομέρειες σε αυτό έλξη-αίτημα). Για να αποφύγετε παρόμοιες εκπλήξεις, συνιστάται να χρησιμοποιήσετε αντ 'αυτού τη μέθοδο Keras' K.get_session (). List_devices (), η οποία θα σας επιστρέψει όλες τις τρέχουσες εγγραφές GPU στη συνεδρία. Τελευταίο αλλά όχι λιγότερο σημαντικό, λάβετε υπόψη ότι η κλήση της μεθόδου list_devices () είναι κατά κάποιο τρόπο ακριβή, οπότε αν σας ενδιαφέρει ο αριθμός των διαθέσιμων GPU καλέστε τη μέθοδο μία φορά και αποθηκεύστε τον αριθμό τους σε μια τοπική μεταβλητή.

Αυτό είναι! Ελπίζω να σας φάνηκε χρήσιμη αυτή η λίστα. Εάν βρήκατε άλλες ιδέες/συμβουλές για εκπαίδευση GPU στο Keras, μοιραστείτε τις παρακάτω στα σχόλια. 🙂

Σφραγίδα ώρας:

Περισσότερα από Databox