Κατανεμημένη μάθηση με το Apache MXNet και το Horovod

Η μετάφραση του άρθρου ετοιμάστηκε την παραμονή της έναρξης του μαθήματος "Industrial ML on Big Data"

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

Σε αυτό το άρθρο θα μιλήσουμε για έναν γρήγορο και εύκολο τρόπο διανομής της μάθησης χρησιμοποιώντας την ανοιχτή βιβλιοθήκη βαθιάς εκμάθησης Apache MXNet και το κατανεμημένο πλαίσιο μάθησης Horovod. Θα δείξουμε ξεκάθαρα τα πλεονεκτήματα απόδοσης του πλαισίου Horovod και θα δείξουμε πώς να γράψουμε ένα σενάριο εκπαίδευσης MXNet έτσι ώστε να λειτουργεί με κατανεμημένο τρόπο με το Horovod.

Τι είναι το Apache MXNet

Apache MX Net είναι ένα πλαίσιο βαθιάς μάθησης ανοιχτού κώδικα που χρησιμοποιείται για τη δημιουργία, την εκπαίδευση και την ανάπτυξη δικτύων βαθιάς νευρωνίας. Το MXNet αφαιρεί τις πολυπλοκότητες που σχετίζονται με την υλοποίηση νευρωνικών δικτύων, είναι εξαιρετικά αποδοτικό και επεκτάσιμο και προσφέρει API για δημοφιλείς γλώσσες προγραμματισμού, όπως π.χ. Python, C + +, Clojure, Java, Τζούλια, R, Scala και άλλοι.

Κατανεμημένη εκπαίδευση στο MXNet με διακομιστή παραμέτρων

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

Τι είναι το Horovod

Χόροβοντ είναι ένα ανοιχτό κατανεμημένο πλαίσιο βαθιάς μάθησης που αναπτύχθηκε στην Uber. Αξιοποιεί αποτελεσματικές τεχνολογίες cross-GPU και cross-node, όπως NVIDIA Collective Communications Library (NCCL) και Message Passing Interface (MPI) για τη διανομή και τη συγκέντρωση παραμέτρων μοντέλου σε vorecs. Βελτιστοποιεί τη χρήση του εύρους ζώνης δικτύου και κλιμακώνεται καλά όταν εργάζεστε με μοντέλα βαθιάς νευρωνικών δικτύων. Προς το παρόν υποστηρίζει πολλά δημοφιλή πλαίσια μηχανικής μάθησης, συγκεκριμένα MX Net, Tensorflow, Keras και PyTorch.

Ενσωμάτωση 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 ως εκ τούτου, και εκτελέστε τις ακόλουθες εντολές στο τερματικό MacBook στον κατάλογο εργασίας:

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, πρέπει να διπλασιάσετε τον αριθμό των διακομιστών σε σχέση με τον αριθμό των εργαζομένων.

Κατανεμημένη μάθηση με το Apache MXNet και το Horovod
Εικόνα 1. Σύγκριση κατανεμημένης μάθησης με χρήση MXNet με Horovod και με διακομιστή παραμέτρων

Στον Πίνακα 1 παρακάτω, συγκρίνουμε το τελικό κόστος ανά περίπτωση κατά την εκτέλεση πειραμάτων σε 64 GPU. Η χρήση του MXNet με το Horovod παρέχει την καλύτερη απόδοση με το χαμηλότερο κόστος.

Κατανεμημένη μάθηση με το Apache 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. Επίσης μπορείτε να χρησιμοποιήσετε Amazon Deep Learning AMI, όπου αυτές οι βιβλιοθήκες είναι ήδη προεγκατεστημένες.

Βήμα 2

Προσθέστε τη δυνατότητα εργασίας με το Horovod API στο σενάριο εκπαίδευσης MXNet. Το παρακάτω σενάριο που βασίζεται στο MXNet Gluon API μπορεί να χρησιμοποιηθεί ως απλό πρότυπο. Οι γραμμές με έντονους χαρακτήρες χρειάζονται εάν έχετε ήδη αντίστοιχο σενάριο εκπαίδευσης. Ακολουθούν μερικές κρίσιμες αλλαγές που πρέπει να κάνετε για να μάθετε με το Horovod:

  • Ρυθμίστε το πλαίσιο σύμφωνα με την τοπική κατάταξη Horovod (γραμμή 8) για να κατανοήσετε ότι η εκπαίδευση εκτελείται στον σωστό πυρήνα γραφικών.
  • Περάστε τις αρχικές παραμέτρους από έναν εργαζόμενο σε όλους (γραμμή 18) για να διασφαλίσετε ότι όλοι οι εργαζόμενοι ξεκινούν με τις ίδιες αρχικές παραμέτρους.
  • Δημιουργήστε ένα Horovod DistributedOptimizer (γραμμή 25) για να ενημερώσετε τις παραμέτρους με κατανεμημένο τρόπο.

Για να λάβετε το πλήρες σενάριο, ανατρέξτε στα παραδείγματα Horovod-MXNet ΜΝΙΣΤ и IMAGEnet.

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 και τη βαθιά εκμάθηση, μεταβείτε στη σελίδα εγκατάστασης MXNeγια να δημιουργήσετε πρώτα το MXNet. Συνιστούμε επίσης ανεπιφύλακτα να διαβάσετε το άρθρο MXNet σε 60 λεπτάγια να ξεκινήσετε.

Εάν έχετε ήδη εργαστεί με το MXNet και θέλετε να δοκιμάσετε την κατανεμημένη μάθηση με το Horovod, τότε ρίξτε μια ματιά στο Σελίδα εγκατάστασης Horovod, δημιουργήστε το από το MXNet και ακολουθήστε το παράδειγμα ΜΝΙΣΤ ή IMAGEnet.

*Το κόστος υπολογίζεται με βάση ωριαίες χρεώσεις AWS για περιπτώσεις EC2

Μάθετε περισσότερα για το μάθημα "Industrial ML on Big Data"

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο