Η μετάφραση του άρθρου ετοιμάστηκε την παραμονή της έναρξης του μαθήματος
Η κατανεμημένη εκπαίδευση σε πολλαπλές περιπτώσεις υπολογιστών υψηλής απόδοσης μπορεί να μειώσει τον χρόνο εκπαίδευσης των σύγχρονων βαθιάς νευρωνικών δικτύων σε μεγάλες ποσότητες δεδομένων από εβδομάδες σε ώρες ή και λεπτά, καθιστώντας αυτή την τεχνική εκπαίδευσης διαδεδομένη στις πρακτικές εφαρμογές της βαθιάς μάθησης. Οι χρήστες πρέπει να κατανοήσουν πώς να μοιράζονται και να συγχρονίζουν δεδομένα σε πολλαπλές παρουσίες, κάτι που με τη σειρά του έχει σημαντικό αντίκτυπο στην αποτελεσματικότητα της κλιμάκωσης. Επιπλέον, οι χρήστες θα πρέπει επίσης να γνωρίζουν πώς να αναπτύσσουν ένα σενάριο εκπαίδευσης που εκτελείται σε μία μόνο παρουσία σε πολλές παρουσίες.
Σε αυτό το άρθρο θα μιλήσουμε για έναν γρήγορο και εύκολο τρόπο διανομής της μάθησης χρησιμοποιώντας την ανοιχτή βιβλιοθήκη βαθιάς εκμάθησης Apache MXNet και το κατανεμημένο πλαίσιο μάθησης Horovod. Θα δείξουμε ξεκάθαρα τα πλεονεκτήματα απόδοσης του πλαισίου Horovod και θα δείξουμε πώς να γράψουμε ένα σενάριο εκπαίδευσης MXNet έτσι ώστε να λειτουργεί με κατανεμημένο τρόπο με το Horovod.
Τι είναι το Apache MXNet
Κατανεμημένη εκπαίδευση στο MXNet με διακομιστή παραμέτρων
Τι είναι το Horovod
Ενσωμάτωση MXNet και Horovod
Το MXNet ενσωματώνεται με το Horovod μέσω των API κατανεμημένης μάθησης που ορίζονται στο Horovod. Horovod επικοινωνίας API horovod.broadcast(), horovod.allgather() и horovod.allreduce() υλοποιείται χρησιμοποιώντας ασύγχρονες επανακλήσεις του κινητήρα MXNet, ως μέρος του γραφήματος εργασιών του. Με αυτόν τον τρόπο, οι εξαρτήσεις δεδομένων μεταξύ επικοινωνίας και υπολογισμού αντιμετωπίζονται εύκολα από τη μηχανή MXNet για να αποφευχθούν απώλειες απόδοσης λόγω συγχρονισμού. Κατανεμημένο αντικείμενο βελτιστοποίησης που ορίζεται στο Horovod horovod.DistributedOptimizer επεκτείνεται Optimizer στο MXNet έτσι ώστε να καλεί τα αντίστοιχα Horovod API για κατανεμημένες ενημερώσεις παραμέτρων. Όλες αυτές οι λεπτομέρειες υλοποίησης είναι διαφανείς στους τελικούς χρήστες.
Γρήγορη εκκίνηση
Μπορείτε να ξεκινήσετε γρήγορα την εκπαίδευση ενός μικρού συνελικτικού νευρωνικού δικτύου στο σύνολο δεδομένων MNIST χρησιμοποιώντας το MXNet και το Horovod στο MacBook σας.
Πρώτα, εγκαταστήστε το mxnet και το horovod από το PyPI:
pip install mxnet
pip install horovod
Σημείωση: Εάν αντιμετωπίσετε σφάλμα κατά τη διάρκεια pip εγκατάσταση horovodίσως χρειαστεί να προσθέσετε μια μεταβλητή MACOSX_DEPLOYMENT_TARGET=10.vvΌπου vv – αυτή είναι η έκδοση της έκδοσης MacOS σας, για παράδειγμα, για MacOSX Sierra θα πρέπει να γράψετε MACOSX_DEPLOYMENT_TARGET=10.12 pip εγκατάσταση horovod
Στη συνέχεια εγκαταστήστε το OpenMPI
Στο τέλος, κατεβάστε το σενάριο δοκιμής mxnet_mnist.py
mpirun -np 2 -H localhost:2 -bind-to none -map-by slot python mxnet_mnist.py
Αυτό θα τρέξει εκπαίδευση σε δύο πυρήνες του επεξεργαστή σας. Η έξοδος θα είναι η εξής:
INFO:root:Epoch[0] Batch [0-50] Speed: 2248.71 samples/sec accuracy=0.583640
INFO:root:Epoch[0] Batch [50-100] Speed: 2273.89 samples/sec accuracy=0.882812
INFO:root:Epoch[0] Batch [50-100] Speed: 2273.39 samples/sec accuracy=0.870000
Επίδειξη απόδοσης
Κατά την εκπαίδευση ενός μοντέλου ResNet50-v1 σε ένα σύνολο δεδομένων ImageNet σε 64 GPU με οκτώ παρουσίες σελ.3.16xlarge EC2, το καθένα από τα οποία περιέχει 8 GPU NVIDIA Tesla V100 στο νέφος AWS, επιτύχαμε απόδοση εκπαίδευσης 45000 εικόνων/δευτερόλεπτο (δηλαδή τον αριθμό των εκπαιδευμένων δειγμάτων ανά δευτερόλεπτο). Η προπόνηση ολοκληρώθηκε σε 44 λεπτά μετά από 90 εποχές με καλύτερη ακρίβεια 75.7%.
Συγκρίναμε αυτό με την κατανεμημένη εκπαιδευτική προσέγγιση του MXNet για τη χρήση διακομιστών παραμέτρων σε 8, 16, 32 και 64 GPU με έναν διακομιστή μίας παραμέτρου και έναν λόγο διακομιστή προς εργαζόμενο 1 προς 1 και 2 προς 1, αντίστοιχα. Μπορείτε να δείτε το αποτέλεσμα στο Σχήμα 1 παρακάτω. Στον άξονα y στα αριστερά, οι ράβδοι αντιπροσωπεύουν τον αριθμό των εικόνων που πρέπει να εκπαιδεύονται ανά δευτερόλεπτο, οι γραμμές αντικατοπτρίζουν την αποτελεσματικότητα κλιμάκωσης (δηλαδή την αναλογία πραγματικής προς ιδανική απόδοση) στον άξονα y στα δεξιά. Όπως μπορείτε να δείτε, η επιλογή του αριθμού των διακομιστών επηρεάζει την αποδοτικότητα κλιμάκωσης. Εάν υπάρχει μόνο ένας διακομιστής παραμέτρων, η απόδοση κλιμάκωσης πέφτει στο 38% σε 64 GPU. Για να επιτύχετε την ίδια αποδοτικότητα κλιμάκωσης όπως με το Horovod, πρέπει να διπλασιάσετε τον αριθμό των διακομιστών σε σχέση με τον αριθμό των εργαζομένων.
Εικόνα 1. Σύγκριση κατανεμημένης μάθησης με χρήση MXNet με Horovod και με διακομιστή παραμέτρων
Στον Πίνακα 1 παρακάτω, συγκρίνουμε το τελικό κόστος ανά περίπτωση κατά την εκτέλεση πειραμάτων σε 64 GPU. Η χρήση του MXNet με το Horovod παρέχει την καλύτερη απόδοση με το χαμηλότερο κόστος.
Πίνακας 1. Σύγκριση κόστους μεταξύ Horovod και διακομιστή παραμέτρων με αναλογία διακομιστή προς εργαζόμενο 2 προς 1.
βήματα για αναπαραγωγή
Στα επόμενα βήματα, θα σας δείξουμε πώς να αναπαράγετε το αποτέλεσμα της κατανεμημένης εκπαίδευσης χρησιμοποιώντας το MXNet και το Horovod. Για να μάθετε περισσότερα σχετικά με την κατανεμημένη μάθηση με το MXNet, διαβάστε
Βήμα 1
Δημιουργήστε ένα σύμπλεγμα ομοιογενών παρουσιών με την έκδοση MXNet 1.4.0 ή νεότερη και την έκδοση Horovod 0.16.0 ή νεότερη για να χρησιμοποιήσετε την κατανεμημένη μάθηση. Θα χρειαστεί επίσης να εγκαταστήσετε βιβλιοθήκες για εκπαίδευση GPU. Για τις περιπτώσεις μας, επιλέξαμε το Ubuntu 16.04 Linux, με πρόγραμμα οδήγησης GPU 396.44, CUDA 9.2, βιβλιοθήκη cuDNN 7.2.1, NCCL 2.2.13 επικοινωνίας και OpenMPI 3.1.1. Επίσης μπορείτε να χρησιμοποιήσετε
Βήμα 2
Προσθέστε τη δυνατότητα εργασίας με το Horovod API στο σενάριο εκπαίδευσης MXNet. Το παρακάτω σενάριο που βασίζεται στο MXNet Gluon API μπορεί να χρησιμοποιηθεί ως απλό πρότυπο. Οι γραμμές με έντονους χαρακτήρες χρειάζονται εάν έχετε ήδη αντίστοιχο σενάριο εκπαίδευσης. Ακολουθούν μερικές κρίσιμες αλλαγές που πρέπει να κάνετε για να μάθετε με το Horovod:
- Ρυθμίστε το πλαίσιο σύμφωνα με την τοπική κατάταξη Horovod (γραμμή 8) για να κατανοήσετε ότι η εκπαίδευση εκτελείται στον σωστό πυρήνα γραφικών.
- Περάστε τις αρχικές παραμέτρους από έναν εργαζόμενο σε όλους (γραμμή 18) για να διασφαλίσετε ότι όλοι οι εργαζόμενοι ξεκινούν με τις ίδιες αρχικές παραμέτρους.
- Δημιουργήστε ένα Horovod DistributedOptimizer (γραμμή 25) για να ενημερώσετε τις παραμέτρους με κατανεμημένο τρόπο.
Για να λάβετε το πλήρες σενάριο, ανατρέξτε στα παραδείγματα Horovod-MXNet
1 import mxnet as mx
2 import horovod.mxnet as hvd
3
4 # Horovod: initialize Horovod
5 hvd.init()
6
7 # Horovod: pin a GPU to be used to local rank
8 context = mx.gpu(hvd.local_rank())
9
10 # Build model
11 model = ...
12
13 # Initialize parameters
14 model.initialize(initializer, ctx=context)
15 params = model.collect_params()
16
17 # Horovod: broadcast parameters
18 hvd.broadcast_parameters(params, root_rank=0)
19
20 # Create optimizer
21 optimizer_params = ...
22 opt = mx.optimizer.create('sgd', **optimizer_params)
23
24 # Horovod: wrap optimizer with DistributedOptimizer
25 opt = hvd.DistributedOptimizer(opt)
26
27 # Create trainer and loss function
28 trainer = mx.gluon.Trainer(params, opt, kvstore=None)
29 loss_fn = ...
30
31 # Train model
32 for epoch in range(num_epoch):
33 ...
Βήμα 3
Συνδεθείτε σε έναν από τους εργαζόμενους για να ξεκινήσετε την κατανεμημένη εκπαίδευση χρησιμοποιώντας την οδηγία MPI. Σε αυτό το παράδειγμα, η κατανεμημένη εκπαίδευση εκτελείται σε τέσσερις περιπτώσεις με 4 GPU η καθεμία και συνολικά 16 GPU στο σύμπλεγμα. Ο βελτιστοποιητής Stochastic Gradient Descent (SGD) θα χρησιμοποιηθεί με τις ακόλουθες υπερπαραμέτρους:
- Μέγεθος μίνι παρτίδας: 256
- ποσοστό μάθησης: 0.1
- ορμή: 0.9
- αποσύνθεση βάρους: 0.0001
Καθώς κλιμακώσαμε από μία GPU σε 64 GPU, κλιμακώσαμε γραμμικά τον ρυθμό εκπαίδευσης σύμφωνα με τον αριθμό των GPU (από 0,1 για 1 GPU σε 6,4 για 64 GPU), διατηρώντας παράλληλα τον αριθμό των εικόνων ανά GPU στις 256 ( από μια παρτίδα 256 εικόνες για 1 GPU έως 16 για 384 GPU). Οι παράμετροι μείωσης βάρους και ορμής άλλαξαν καθώς αυξανόταν ο αριθμός των GPU. Χρησιμοποιήσαμε προπόνηση μικτής ακρίβειας με τον τύπο δεδομένων float64 για το μπροστινό πέρασμα και το float16 για κλίσεις για να επιταχύνουμε τους υπολογισμούς float32 που υποστηρίζονται από τις GPU της NVIDIA Tesla.
$ mpirun -np 16
-H server1:4,server2:4,server3:4,server4:4
-bind-to none -map-by slot
-mca pml ob1 -mca btl ^openib
python mxnet_imagenet_resnet50.py
Συμπέρασμα
Σε αυτό το άρθρο, εξετάσαμε μια επεκτάσιμη προσέγγιση για την εκπαίδευση κατανεμημένων μοντέλων χρησιμοποιώντας το Apache MXNet και το Horovod. Δείξαμε την αποδοτικότητα κλιμάκωσης και τη σχέση κόστους-αποτελεσματικότητας σε σύγκριση με την προσέγγιση διακομιστή παραμέτρων στο σύνολο δεδομένων ImageNet στο οποίο εκπαιδεύτηκε το μοντέλο ResNet50-v1. Έχουμε επίσης συμπεριλάβει βήματα που μπορείτε να χρησιμοποιήσετε για να τροποποιήσετε ένα υπάρχον σενάριο για να εκτελέσετε εκπαίδευση πολλαπλών περιπτώσεων χρησιμοποιώντας το Horovod.
Εάν μόλις ξεκινάτε με το MXNet και τη βαθιά εκμάθηση, μεταβείτε στη σελίδα εγκατάστασης
Εάν έχετε ήδη εργαστεί με το MXNet και θέλετε να δοκιμάσετε την κατανεμημένη μάθηση με το Horovod, τότε ρίξτε μια ματιά στο
*Το κόστος υπολογίζεται με βάση
Μάθετε περισσότερα για το μάθημα
Πηγή: www.habr.com