Βέλτιστες πρακτικές για εκπαίδευση επιτάχυνσης TensorFlow 1.x στο Amazon SageMaker PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Βέλτιστες πρακτικές για εκπαίδευση επιτάχυνσης TensorFlow 1.x στο Amazon SageMaker

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

Amazon Sage Maker είναι μια πλήρως διαχειριζόμενη πλατφόρμα μηχανικής μάθησης (ML) που θα μπορούσε να βοηθήσει τους επιστήμονες δεδομένων να επικεντρωθούν σε μοντέλα αντί για υποδομές, με εγγενή υποστήριξη για αλγόριθμους και πλαίσια όπως το TensorFlow και το PyTorch. Το SageMaker προσφέρει ευέλικτες κατανεμημένες επιλογές εκπαίδευσης που προσαρμόζονται στις συγκεκριμένες ροές εργασίας σας. Επειδή πολλοί επιστήμονες δεδομένων ενδέχεται να στερούνται εμπειρίας στη διαδικασία εκπαίδευσης επιτάχυνσης, σε αυτήν την ανάρτηση σας παρουσιάζουμε τους παράγοντες που έχουν σημασία για την εκπαίδευση μοντέλων γρήγορης εκμάθησης σε βάθος και τις βέλτιστες πρακτικές εκπαίδευσης επιτάχυνσης για το TensorFlow 1.x στο SageMaker. Έχουμε επίσης ένα δείγμα κώδικα του DeepFM διένειμε εκπαίδευση στο SageMaker στο GitHub repo.

Υπάρχουν πολλοί παράγοντες που πρέπει να λάβετε υπόψη για να μεγιστοποιήσετε τη χρήση CPU/GPU όταν εκτελείτε το σενάριο TensorFlow στο SageMaker, όπως η υποδομή, ο τύπος επιταχυντή, η κατανεμημένη μέθοδος εκπαίδευσης, η μέθοδος φόρτωσης δεδομένων, η εκπαίδευση μεικτής ακρίβειας και άλλα.

Συζητάμε τις βέλτιστες πρακτικές στους ακόλουθους τομείς:

  • Επιταχύνετε την εκπαίδευση σε μία μόνο περίπτωση
  • Επιταχύνετε την εκπαίδευση σε πολλές περιπτώσεις
  • Σωληνώσεις δεδομένων
  • Αυτόματη εκπαίδευση μεικτής ακρίβειας

Επιταχύνετε την εκπαίδευση σε μία μόνο περίπτωση

Όταν εκτελείτε το σενάριο TensorFlow σε μία μόνο παρουσία, θα μπορούσατε να επιλέξετε μια σειρά βελτιστοποιημένη για υπολογιστή, όπως η Amazon Elastic Compute Cloud (Amazon EC2) Σειρά C5 ή μια σειρά επιταχυνόμενων υπολογιστών με πολλαπλές GPU σε μία μόνο παρουσία, όπως p3.8xlarge, p3.16xlarge, p3dn.24xlarge και p4d.24xlarge.

Σε αυτήν την ενότητα, συζητάμε στρατηγικές για πολλαπλές CPU σε μία μόνο παρουσία και κατανεμημένη εκπαίδευση με πολλές GPU σε μία μόνο παρουσία.

Πολλαπλές CPU σε μία μόνο παρουσία

Σε αυτήν την ενότητα, συζητάμε τη μη αυτόματη ρύθμιση παραλληλισμού χειριστή σε συσκευές CPU, τη μέθοδο tower, το TensorFlow MirroredStrategy και το Horovod.

Μη αυτόματη ρύθμιση παραλληλισμού χειριστή σε συσκευές CPU

Το TensorFlow επιλέγει αυτόματα τον κατάλληλο αριθμό νημάτων για να παραλληλίσει τον υπολογισμό λειτουργίας στη διαδικασία εκπαίδευσης. Ωστόσο, μπορείτε να ρυθμίσετε το intra_op νήματα πισίνα και inter_op ρυθμίσεις παραλληλισμού που παρέχονται από το TensorFlow και χρησιμοποιούν μεταβλητές περιβάλλοντος του MKL-DNN για να ορίσετε τη σύνδεση για το νήμα του λειτουργικού συστήματος. Δείτε τον παρακάτω κώδικα:

# Set parallelism of intra_op and inter_op
num_cpus = int(os.environ['SM_NUM_CPUS'])
config = tf.ConfigProto(allow_soft_placement=True, device_count={'CPU': num_cpus}, intra_op_parallelism_threads=num_cpus, inter_op_parallelism_threads=num_cpus)
run_config = tf.estimator.RunConfig().replace(session_config = config)

# Use Intel MKL-DNN Setting to accelerate training speed
os.environ["KMP_AFFINITY"]= "verbose,disabled"
os.environ['OMP_NUM_THREADS'] = str(num_cpus)
os.environ['KMP_SETTINGS'] = '1'

Η μεταβλητή περιβάλλοντος KMP_AFFINITY του MKL-DNN έχει οριστεί σε granularity=fine,compact,1,0 από προεπιλογή. Αφού ρυθμίσετε τόσο το intra όσο και το inter του TensorFlow στον μέγιστο αριθμό vCPU της τρέχουσας παρουσίας, το ανώτερο όριο χρήσης της CPU είναι σχεδόν το ίδιο με τον αριθμό των φυσικών πυρήνων της παρουσίας εκπαίδευσης.

Εάν ορίσετε os.environ["KMP_AFFINITY"]= "verbose,disabled", το νήμα του λειτουργικού συστήματος δεν είναι συνδεδεμένο με το υπερνήμα υλικού και η χρήση της CPU θα μπορούσε να υπερβεί τον αριθμό των φυσικών πυρήνων.

Όσον αφορά τις ρυθμίσεις του ενδοπαραλληλισμού TensorFlow, του μεταξύ παραλληλισμού TensorFlow και του αριθμού των νημάτων MKL-DNN, διαφορετικοί συνδυασμοί αυτών των τριών παραμέτρων έχουν ως αποτέλεσμα διαφορετικές ταχύτητες προπόνησης. Επομένως, πρέπει να δοκιμάσετε κάθε περίπτωση για να βρείτε τον καλύτερο συνδυασμό. Μια κοινή κατάσταση είναι να ορίσετε τις τρεις παραμέτρους (intra_op_parallelism_threads και inter_op_parallelism_threads για το TensorFlow, os.environ['OMP_NUM_THREADS'] για MKL-DNN) στο ήμισυ του αριθμού των vCPU (φυσικός πυρήνας) ή του συνολικού αριθμού των vCPU.

Μέθοδος πύργου

Για να αναπαραχθεί ένα μοντέλο μέσω GPU, κάθε GPU λαμβάνει το δικό της παράδειγμα του μπροστινού πάσου. Το παράδειγμα της πάσας προς τα εμπρός ονομάζεται α πύργος. Η μέθοδος του πύργου χρησιμοποιείται σχεδόν πάντα για συσκευές GPU. Για να συγκρίνουμε την ταχύτητα προπόνησης με άλλες μεθόδους, εδώ χρησιμοποιούμε επίσης τη μέθοδο tower για τη συσκευή CPU μας.

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

  1. Ρυθμίστε τη συσκευή CPU με μη αυτόματο τρόπο:
device_list = []
if manual_CPU_device_set:
		cpu_prefix=’/cpu:’
		for I in range(1, num_cpus):
			devices_list.append(cpu_prefix + str(i))

  1. Χρήση replicate_model_fn να τυλίξεις model_fn:
DeepFM = tf.estimator.Estimator(model_fn=tf.contrib.estimator.replicate_model_fn(model_fn, devices=device_list), model_dir=FLAGS.model_dir, params=model_params, config=config)

  1. Χρήση TowerOptimizer να τυλίξεις optimizer:
optimizer = tf.contrib.estimator.TowerOptimizer(optimizer)

  1. Τυλίξτε το model_fn:
with tf.variable_scope(‘deepfm_model’, reuse=tf.AUTO_REUSE)

  1. Κλιμάκωσε το μέγεθος παρτίδας σε (NUM_CPU – 1).

Ας δούμε τη διαφορά της χρήσης της CPU με ενεργοποιημένη τη λειτουργία πύργου. Το παρακάτω σχήμα δείχνει τη χρήση CPU της ml.c5.18xlarge instance με την ακόλουθη διαμόρφωση:

Χωρίς Tower + δεδομένα LibSVM + λειτουργία σωλήνα + MKL-DNN απενεργοποίηση σύνδεσης + Ρύθμιση παραλληλισμού ενδο/ενδολειτουργικού TensorFlow στον μέγιστο αριθμό vCPU της παρουσίας

Χωρίς Πύργο

Το παρακάτω σχήμα δείχνει τη χρήση της CPU της παρουσίας ml.c5.18xlarge με την ακόλουθη διαμόρφωση:

Πύργος με ρυθμισμένη συσκευή CPU + δεδομένα LibSVM + λειτουργία σωληνώσεων + MKL-DNN απενεργοποίηση σύνδεσης + Ρύθμιση ενδο/ενδοπαραλληλισμού TensorFlow στον μέγιστο αριθμό vCPU της παρουσίας

Η χρήση της CPU είναι υψηλότερη όταν χρησιμοποιείται η μέθοδος tower και υπερβαίνει τον αριθμό των φυσικών πυρήνων.

TensorFlow MirroredStrategy

Το TensorFlow MirroredStrategy σημαίνει σύγχρονη εκπαίδευση σε πολλαπλά αντίγραφα σε ένα μηχάνημα. Αυτή η στρατηγική χρησιμοποιείται συνήθως για εκπαίδευση σε ένα μηχάνημα με πολλαπλές GPU. Για να συγκρίνουμε την ταχύτητα προπόνησης με μια άλλη μέθοδο, χρησιμοποιούμε το MirroredStrategy για τη συσκευή CPU μας.

Όταν χρησιμοποιείτε το TensorFlow MirroredStrategy, εάν δεν ρυθμίσετε τη συσκευή CPU, το TensorFlow χρησιμοποιεί απλώς μία CPU ως μεμονωμένο εργαζόμενο, κάτι που είναι σπατάλη πόρων. Συνιστούμε να ρυθμίσετε με μη αυτόματο τρόπο τη συσκευή CPU, επειδή θα κάνει μια λειτουργία μείωσης /CPU:0, Έτσι ώστε η /CPU:0 η συσκευή δεν χρησιμοποιείται ως αντίγραφο εδώ. Δείτε τον παρακάτω κώδικα:

device_list = []
if manual_CPU_device_set:
		cpu_prefix=’/cpu:’
		for I in range(1, num_cpus):
			devices_list.append(cpu_prefix + str(i))
mirrored_strategy = tf.distribute.MirroredStrategy(devices=devices_list)
	else:
mirrored_strategy = tf.distribute.MirroredStrategy()

# Set strategy to config:
config = tf.estimator.RunConfig(train_distribute=mirrored_strategy,
eval_distribute=mirrored_strategy,
session_config = config)

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

Για την υπο-στρατηγική όταν ρυθμίζετε τη συσκευή CPU, εάν δεν ορίσετε την cross_device_ops στην παράμετρο tf.distribute.MirroredStrategy(), Το TensorFlow χρησιμοποιεί το ReductionToOneDevice υποστρατηγική από προεπιλογή. Ωστόσο, αν ορίσετε HierarchicalCopyAllReduce Ως υποστρατηγική, το TensorFlow κάνει απλώς τη μείωση /CPU:0. Όταν χρησιμοποιείτε το API δεδομένων TensorFlow και διανέμετε τη στρατηγική μαζί, το αντικείμενο δεδομένων πρέπει να επιστρέφεται αντί για χαρακτηριστικά και ετικέτες στη συνάρτηση input_fn.

Συνήθως, το TensorFlow MirroredStrategy είναι πιο αργό από τη μέθοδο tower στην εκπαίδευση CPU, επομένως δεν συνιστούμε τη χρήση του MirroredStrategy σε έναν κεντρικό υπολογιστή πολλαπλών CPU.

Χόροβοντ

Χόροβοντ είναι ένα κατανεμημένο πλαίσιο εκπαίδευσης βαθιάς μάθησης για TensorFlow, Keras, PyTorch και Apache MXNet. Ο στόχος του Horovod είναι να κάνει τη διανεμημένη βαθιά εκμάθηση γρήγορη και εύκολη στη χρήση.

Υπάρχει μια παράμετρος του distribution στο SageMaker Python SDK Estimator API, το οποίο θα μπορούσατε να χρησιμοποιήσετε για να δηλώσετε την κατανεμημένη εκπαίδευση Horovod. Το SageMaker παρέχει την υποδομή και εκτελεί το σενάριό σας με το MPI. Δείτε τον παρακάτω κώδικα:

hvd_processes_per_host = 4
distribution = {'mpi': { 
'enabled': True, 
'processes_per_host': hvd_processes_per_host,
'custom_mpi_options': '-verbose --NCCL_DEBUG=INFO -x OMPI_MCA_btl_vader_single_copy_mechanism=none' 
} 
}

Όταν επιλέγετε μια παρουσία GPU όπως ml.p3.8xlarge, πρέπει να καρφιτσώσετε κάθε GPU για κάθε εργαζόμενο:

config = tf.ConfigProto()
config.gpu_options.visible_device_list = str(hvd.local_rank())

Για να επιταχύνετε τη σύγκλιση του μοντέλου, κλιμακώστε τον ρυθμό εκμάθησης με βάση τον αριθμό των εργαζομένων σύμφωνα με την επίσημη τεκμηρίωση του Horovod. Ωστόσο, σε έργα πραγματικού κόσμου, θα πρέπει να κλιμακώσετε το ποσοστό εκμάθησης σε κάποιο βαθμό, αλλά όχι με βάση τον αριθμό των εργαζομένων, γεγονός που οδηγεί σε κακή απόδοση του μοντέλου. Για παράδειγμα, αν ο αρχικός ρυθμός μάθησης είναι 0.001, κλιμακώνουμε το ποσοστό μάθησης σε 0.0015, ακόμα κι αν ο αριθμός των εργαζομένων είναι τέσσερις ή περισσότεροι.

Γενικά, μόνο η κύρια (κατάταξη Horovod 0) αποθηκεύει το σημείο ελέγχου και το μοντέλο καθώς και τη λειτουργία αξιολόγησης. Δεν χρειάζεται να κλιμακώσετε το μέγεθος της παρτίδας όταν χρησιμοποιείτε το Horovod. Προσφορές SageMaker Λειτουργία σωλήνων για ροή δεδομένων από Απλή υπηρεσία αποθήκευσης Amazon (Amazon S3) σε περιπτώσεις εκπαίδευσης. Όταν ενεργοποιείτε τη λειτουργία Pipe, έχετε υπόψη σας ότι διαφορετικοί εργαζόμενοι στον ίδιο κεντρικό υπολογιστή πρέπει να χρησιμοποιούν διαφορετικά κανάλια για την αποφυγή σφαλμάτων. Αυτό συμβαίνει επειδή η πρώτη διεργασία εργασίας διαβάζει τα δεδομένα FIFO/καναλιού και άλλες διεργασίες εργασίας στην ίδια παρουσία θα κολλήσουν επειδή δεν μπορούν να διαβάσουν δεδομένα από το ίδιο FIFO/κανάλι, επομένως το Horovod δεν λειτουργεί σωστά. Για να αποφύγετε αυτό το ζήτημα, ρυθμίστε τα κανάλια ανάλογα με τον αριθμό των εργαζομένων ανά περίπτωση. Τουλάχιστον βεβαιωθείτε ότι διαφορετικοί εργαζόμενοι στον ίδιο κεντρικό υπολογιστή καταναλώνουν διαφορετικά κανάλια. Το ίδιο κανάλι μπορεί να καταναλωθεί από εργαζόμενους σε διαφορετικό κεντρικό υπολογιστή.

Όταν χρησιμοποιείτε το Horovod, ενδέχεται να αντιμετωπίσετε το ακόλουθο σφάλμα:

“One or more tensors were submitted to be reduced, gathered or broadcasted by subset of ranks and are waiting for remainder of ranks for more than 60 seconds. This may indicate that different ranks are trying to submit different tensors or that only subset of ranks is submitting tensors, which will cause deadlock.”

Η πιθανή αιτία για αυτό το ζήτημα είναι ότι μια συγκεκριμένη κατάταξη (όπως η κατάταξη 0) λειτουργεί πιο αργά ή κάνει περισσότερες εργασίες από άλλες βαθμίδες, και αυτό κάνει τις άλλες τάξεις να περιμένουν για μεγάλο χρονικό διάστημα. Αν και η κατάταξη 0 πρέπει μερικές φορές να κάνει περισσότερη δουλειά από άλλες βαθμίδες, θα πρέπει να σημειωθεί ότι η κατάταξη 0 δεν πρέπει να κάνει πολλά για μεγάλο χρονικό διάστημα. Για παράδειγμα, για την αξιολόγηση του μοντέλου στο σετ επικύρωσης και την αποθήκευση σημείων ελέγχου κατά τη διάρκεια της εκπαίδευσης, εάν είναι αναπόφευκτο ότι αυτές οι λειτουργίες θα διαρκέσουν πολύ, κάτι που θα μπορούσε να προκαλέσει σφάλματα, μια λύση είναι να αφήσετε όλους τους εργαζόμενους να κάνουν την ίδια εργασία με την κατάταξη 0 (σημεία ελέγχου εξοικονόμηση, αξιολόγηση και ούτω καθεξής).

Η κοινή χρήση δεδομένων είναι ένα από τα πιο σημαντικά πράγματα που πρέπει να λάβετε υπόψη όταν χρησιμοποιείτε κατανεμημένη εκπαίδευση. Μπορείτε να χρησιμοποιήσετε το TensorFlow dataset.shard() στο σενάριο σου. Το SageMaker προσφέρει επίσης μια λειτουργία θραύσματος δεδομένων στο κανάλι εισόδων με ρύθμιση distribution=S3shardbykey στο κανάλι δεδομένων. Δείτε τον παρακάτω κώδικα:

dataset = PipeModeDataset(channel, record_format='TFRecord')

number_host = len(FLAGS.hosts)

if FLAGS.enable_data_multi_path : # If there are multi channels mapping with different S3 path
    if FLAGS.enable_s3_shard == False :
        if number_host > 1:
            index = hvd.rank() // FLAGS.worker_per_host
            dataset = dataset.shard(number_host, index)
else :
    if FLAGS.enable_s3_shard :
        dataset = dataset.shard(FLAGS.worker_per_host, hvd.local_rank())
    else :
        dataset = dataset.shard(hvd.size(), hvd.rank())

Το παρακάτω σχήμα δείχνει το αποτέλεσμα κατά τη χρήση του Horovod (ml.c5.18xlarge, Horovod + LibSVM + προεπιλεγμένη ρύθμιση intra op and inter op), το οποίο μπορείτε να συγκρίνετε με τη μέθοδο του πύργου.

horovod

Κατανεμημένη εκπαίδευση με πολλαπλές GPU σε μία μόνο παρουσία

Είναι φυσιολογικό να ξεκινήσετε την κατανεμημένη εκπαίδευση με πολλές GPU σε μία μόνο παρουσία, επειδή οι επιστήμονες δεδομένων πρέπει να διαχειριστούν μόνο μία παρουσία και να επωφεληθούν από τη διασύνδεση υψηλής ταχύτητας μεταξύ των GPU. Οι εργασίες εκπαίδευσης του SageMaker υποστηρίζουν πολλούς τύπους παρουσιών που διαθέτουν πολλαπλές GPU σε μία παρουσία, όπως ml.p3.8xlarge, ml.p3.16xlarge, ml.p3dn.24xlarge και ml.p4d.24xlarge. Η μέθοδος είναι ίδια με πολλαπλές CPU σε μία μόνο παρουσία, αλλά με μερικές αλλαγές στο σενάριο.

Μέθοδος πύργου

Η μέθοδος του πύργου εδώ είναι σχεδόν η ίδια όπως στην εκπαίδευση πολλαπλών CPU. Πρέπει να κλιμακώσετε το μέγεθος της παρτίδας ανάλογα με τον αριθμό των GPU που χρησιμοποιούνται.

TensorFlow MirroredStrategy

Η προεπιλεγμένη υπο-στρατηγική του MirroredStrategy is NcclAllReduce. Πρέπει να κλιμακώσετε το μέγεθος της παρτίδας ανάλογα με τον αριθμό των GPU που χρησιμοποιούνται. Δείτε τον παρακάτω κώδικα:

mirrored_strategy = tf.distribute.MirroredStrategy()
config = tf.estimator.RunConfig(train_distribute=mirrored_strategy,
				eval_distribute=mirrored_strategy)

Επιταχύνετε την εκπαίδευση σε πολλές περιπτώσεις

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

Πολλαπλές CPU με πολλαπλές παρουσίες

Υπάρχουν τέσσερις κύριες μέθοδοι για τη χρήση πολλαπλών CPU με πολλαπλές παρουσίες κατά την ενεργοποίηση της κατανεμημένης εκπαίδευσης:

    • Διακομιστής παραμέτρων χωρίς μη αυτόματη ρύθμιση παραλληλισμού χειριστή σε συσκευές CPU
    • Διακομιστής παραμέτρων με μη αυτόματη ρύθμιση παραλληλισμού χειριστή σε συσκευές CPU
    • Διακομιστής παραμέτρων με πύργο (ρύθμιση συσκευών CPU με μη αυτόματο τρόπο και ρύθμιση allow_soft_placement=True in tf.ConfigProto)
    • Χόροβοντ

Όταν χρησιμοποιείτε διακομιστή παραμέτρων στο tf.estimator API, η διαδρομή του σημείου ελέγχου πρέπει να είναι μια κοινή διαδρομή όπως το Amazon S3 ή η τοπική διαδρομή του Amazon Elastic File Service (Amazon EFS) χαρτογράφηση στο κοντέινερ. Για διακομιστή παραμέτρων σε tf.keras, η διαδρομή του σημείου ελέγχου μπορεί να οριστεί στην τοπική διαδρομή. Για το Horovod, η διαδρομή του σημείου ελέγχου μπορεί να οριστεί σε μια τοπική διαδρομή της παρουσίας εκπαίδευσης.

Όταν χρησιμοποιείτε διακομιστή παραμέτρων και το tf.estimator API με τη διαδρομή του σημείου ελέγχου στο Amazon S3, εάν το μοντέλο είναι αρκετά μεγάλο, μπορεί να συναντήσετε σφάλμα του πρωτεύοντος που έχει κολλήσει κατά την αποθήκευση του σημείου ελέγχου στο S3. Μπορείτε να χρησιμοποιήσετε το ενσωματωμένο κοντέινερ SageMaker TensorFlow 1.15 ή TensorFlow 1.15.2 ή να χρησιμοποιήσετε το Amazon EFS ως τη διαδρομή σημείου ελέγχου της κοινής χρήσης.

Όταν χρησιμοποιείτε έναν διακομιστή παραμέτρων για πολλούς κεντρικούς υπολογιστές, το φορτίο παραμέτρων σε κάθε διεργασία διακομιστή παραμέτρων ενδέχεται να μην είναι ισορροπημένο (ειδικά όταν υπάρχουν σχετικά μεγάλες μεταβλητές πίνακα ενσωμάτωσης), γεγονός που θα μπορούσε να προκαλέσει σφάλματα. Θα μπορούσατε να ελέγξετε το μέγεθος αρχείου κάθε σημείου ελέγχου του θραύσματος στο Amazon S3 για να προσδιορίσετε εάν οι παράμετροι στον διακομιστή παραμέτρων είναι ισορροπημένες, επειδή κάθε διακομιστής παραμέτρων αντιστοιχεί σε ένα θραύσμα του αρχείου σημείου ελέγχου. Για να αποφύγετε τέτοια προβλήματα, μπορείτε να χρησιμοποιήσετε τη συνάρτηση διαμερισμάτων για να προσπαθήσετε να κάνετε τις παραμέτρους κάθε διακομιστή παραμέτρων ομοιόμορφα κατανεμημένες:

with tf.variable_scope('deepfm_model', reuse=tf.AUTO_REUSE, partitioner = tf.fixed_size_partitioner(num_shards=len(FLAGS.hosts))):

Ενιαία GPU με πολλαπλές παρουσίες

Οι εργασίες εκπαίδευσης του SageMaker υποστηρίζουν περιπτώσεις που έχουν μόνο μία GPU, όπως οι σειρές ml.p3.xlarge, ml.g4dn και ml.g5. Υπάρχουν δύο κύριες μέθοδοι που χρησιμοποιούνται σε αυτό το σενάριο: διακομιστές παραμέτρων και Horovod.

Η ενσωματωμένη μέθοδος εκπαίδευσης κατανεμημένης διακομιστή παραμέτρων του SageMaker είναι η έναρξη μιας διαδικασίας διακομιστή παραμέτρων και μιας διαδικασίας εργασίας για κάθε παρουσία εκπαίδευσης (κάθε διακομιστής παραμέτρων είναι υπεύθυνος μόνο για μέρος των παραμέτρων του μοντέλου), επομένως η προεπιλογή είναι μονομηχανή πολλαπλών μηχανών Εκπαίδευση GPU. Η κατανεμημένη εκπαίδευση διακομιστή παραμέτρων του ενσωματωμένου SageMaker είναι μια μέθοδος ενημέρωσης ασύγχρονης διαβάθμισης. Για να μειωθεί ο αντίκτυπος των ασύγχρονων ενημερώσεων στη σύγκλιση της εκπαίδευσης, συνιστάται η μείωση του ποσοστού εκμάθησης. Εάν θέλετε να χρησιμοποιήσετε όλες τις GPU της παρουσίας, πρέπει να χρησιμοποιήσετε έναν συνδυασμό διακομιστών παραμέτρων και τη μέθοδο του πύργου.

Για το Horovod, μόλις ρυθμίστε processes_per_host=1 στην παράμετρο διανομής του SageMaker Python Estimator API.

Πολλαπλές GPU με πολλαπλές παρουσίες

Για τους διακομιστές παραμέτρων και τη μέθοδο του πύργου, οι αλλαγές κώδικα είναι βασικά οι ίδιες με τη μέθοδο του πύργου για μία μόνο περίπτωση με πολλές GPU και δεν χρειάζεται να ρυθμίσετε μη αυτόματα τις συσκευές GPU.

Για το Horovod, ορίστε processes_per_host στην παράμετρο διανομής στον αριθμό των GPU κάθε παρουσίας εκπαίδευσης. Εάν χρησιμοποιείτε τη λειτουργία Pipe, ο αριθμός των εργαζομένων ανά περίπτωση πρέπει να ταιριάζει με τον αριθμό των καναλιών.

Σωληνώσεις δεδομένων

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

Όταν προσπαθείτε να βελτιστοποιήσετε τη γραμμή εισαγωγής δεδομένων TensorFlow, λάβετε υπόψη τη σειρά API που χρησιμοποιείται Σύνολα δεδομένων TensorFlow, το μέγεθος των δεδομένων εκπαίδευσης (πολλά μικρά αρχεία ή πολλά μεγάλα αρχεία), το μέγεθος παρτίδας και ούτω καθεξής.

Ας δούμε την αλληλεπίδραση μεταξύ GPU και CPU κατά τη διάρκεια της εκπαίδευσης. Τα παρακάτω σχήματα συγκρίνουν τις αλληλεπιδράσεις με και χωρίς αγωγό.

αγωγού

Μια καλύτερη διοχέτευση θα μπορούσε να μειώσει τον χρόνο αδράνειας της GPU. Λάβετε υπόψη τις ακόλουθες συμβουλές:

  • Χρησιμοποιήστε απλή λογική συνάρτησης για την εξαγωγή χαρακτηριστικών και ετικετών
  • Προανάκτηση δειγμάτων στη μνήμη
  • Μειώστε τις περιττές εισόδους/εξόδους δίσκου και τις εισόδους/εξόδους δικτύου
  • Αποθηκεύστε προσωρινά τα επεξεργασμένα χαρακτηριστικά και τις ετικέτες στη μνήμη
  • Μειώστε τον αριθμό των χρόνων αναπαραγωγής μεταξύ CPU και GPU
  • Ζητήστε από διαφορετικούς εργαζόμενους να ασχοληθούν με διαφορετικά μέρη του συνόλου δεδομένων εκπαίδευσης
  • Μειώστε τους χρόνους κλήσης του API δεδομένων TensorFlow

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

  • Χρησιμοποιήστε έναν διανυσματικό χάρτη. Αυτό σημαίνει ότι καλέστε πρώτα το API δέσμης δεδομένων TensorFlow και μετά το API του χάρτη δεδομένων. Η προσαρμοσμένη συνάρτηση ανάλυσης που παρέχεται στη συνάρτηση χάρτη, όπως π.χ decode_tfrecord στο δείγμα κώδικα, αναλύει μια μίνι παρτίδα δεδομένων. Αντίθετα, ο χάρτης πρώτα και μετά η παρτίδα είναι ένας βαθμωτός χάρτης και η προσαρμοσμένη συνάρτηση ανάλυσης επεξεργάζεται μόνο ένα δείγμα.
  • Χρησιμοποιήστε το API προσωρινής μνήμης δεδομένων TensorFlow για να αποθηκεύσετε στην κρυφή μνήμη χαρακτηριστικά και ετικέτες. Τοποθετήστε το API προσωρινής μνήμης δεδομένων TensorFlow πριν από το επαναλαμβανόμενο API συνόλου δεδομένων TensorFlow, διαφορετικά η χρήση της μνήμης RAM αυξάνεται γραμμικά ανά εποχή. Εάν το σύνολο δεδομένων είναι τόσο μεγάλο όσο η μνήμη RAM, μην χρησιμοποιήσετε το API προσωρινής αποθήκευσης δεδομένων TensorFlow. Εάν χρειάζεται να χρησιμοποιήσετε το API προσωρινής μνήμης δεδομένων TensorFlow και το API τυχαίας αναπαραγωγής, εξετάστε το ενδεχόμενο να χρησιμοποιήσετε την ακόλουθη σειρά: δημιουργία αντικειμένου συνόλου δεδομένων TensorFlow -> API προσωρινής μνήμης -> Shuffle API -> API παρτίδας -> API χάρτη -> επανάληψη API -> API προαναφοράς.
  • Χρησιμοποιήστε το tfrecord μορφή συνόλου δεδομένων περισσότερο από τη μορφή LibSVM.
  • Η λειτουργία αρχείου ή η λειτουργία σωλήνωσης εξαρτάται από τη μορφή δεδομένων και τον αριθμό των αρχείων σας. ο tfrecorddataset Το API μπορεί να οριστεί num_parallel_reads για να διαβάσετε πολλά αρχεία παράλληλα και να ορίσετε buffer_size για τη βελτιστοποίηση της ανάγνωσης των δεδομένων, ενώ το pipemodedataset Το API δεν έχει τέτοιες ρυθμίσεις. Η λειτουργία Pipe είναι πιο κατάλληλη για περιπτώσεις όπου ένα μεμονωμένο αρχείο είναι μεγάλο και ο συνολικός αριθμός αρχείων είναι μικρός. Συνιστούμε να χρησιμοποιήσετε μια εργασία επεξεργασίας του SageMaker για την εκτέλεση της εργασίας προεπεξεργασίας, όπως σύνδεση πολλών αρχείων σε μεγαλύτερο αρχείο σύμφωνα με ετικέτες, χρήση μεθόδου δειγματοληψίας για να γίνει πιο ισορροπημένο το σύνολο δεδομένων και ανακάτεμα του ισορροπημένου δεδομένων.

Δείτε το ακόλουθο δείγμα κώδικα:

def decode_tfrecord(batch_examples):
        # The feature definition here should BE consistent with LibSVM TO TFRecord process.
        features = tf.parse_example(batch_examples,
                                           features={
                                               "label": tf.FixedLenFeature([], tf.float32),
                                               "ids": tf.FixedLenFeature(dtype=tf.int64, shape=[FLAGS.field_size]),
                                               "values": tf.FixedLenFeature(dtype=tf.float32, shape=[FLAGS.field_size]) 
                                           })
        
        batch_label = features["label"]
        batch_ids = features["ids"]
        batch_values = features["values"]
        
        return {"feat_ids": batch_ids, "feat_vals": batch_values}, batch_label


    def decode_libsvm(line):
        columns = tf.string_split([line], ' ')
        labels = tf.string_to_number(columns.values[0], out_type=tf.float32)
        splits = tf.string_split(columns.values[1:], ':')
        id_vals = tf.reshape(splits.values,splits.dense_shape)
        feat_ids, feat_vals = tf.split(id_vals,num_or_size_splits=2,axis=1)
        feat_ids = tf.string_to_number(feat_ids, out_type=tf.int32)
        feat_vals = tf.string_to_number(feat_vals, out_type=tf.float32)
        return {"feat_ids": feat_ids, "feat_vals": feat_vals}, labels

if FLAGS.pipe_mode == 0:
        dataset = tf.data.TFRecordDataset(filenames)
    else :
        # Enter Pipe mode
        dataset = PipeModeDataset(channel, record_format='TFRecord')
        
    if FLAGS.enable_s3_shard == False:
        host_rank = FLAGS.hosts.index(FLAGS.current_host)
        number_host = len(FLAGS.hosts)
        dataset = dataset.shard(number_host, host_rank)
    
    dataset = dataset.batch(batch_size, drop_remainder=True) # Batch size to use
    dataset = dataset.map(decode_tfrecord,
                          num_parallel_calls=tf.data.experimental.AUTOTUNE) 

    if num_epochs > 1:
        dataset = dataset.repeat(num_epochs)
    dataset = dataset.prefetch(buffer_size=tf.data.experimental.AUTOTUNE)

Για εκπαίδευση σε στιγμιότυπα CPU, ρύθμιση παραλληλισμού του intra op, inter op, και η μεταβλητή περιβάλλοντος του MKL-DNN είναι ένα καλό σημείο εκκίνησης.

Αυτόματη εκπαίδευση μεικτής ακρίβειας

Το τελευταίο πράγμα που συζητάμε είναι η αυτόματη προπόνηση μικτής ακρίβειας, η οποία μπορεί να επιταχύνει την ταχύτητα και να έχει ως αποτέλεσμα την απόδοση του μοντέλου. Μέχρι τη στιγμή που γράφονται αυτές οι γραμμές, η GPU Nvidia V100 (παρουσίαση P3) και η A100 (παρουσίαση P4dn) υποστηρίζουν τον πυρήνα Tensor. Μπορείτε να ενεργοποιήσετε την προπόνηση μεικτής ακρίβειας στο TensorFlow όταν χρησιμοποιείτε αυτούς τους τύπους παρουσιών. Ξεκινώντας από την έκδοση 1.14, το TensorFlow έχει υποστηρίξει αυτόματη εκπαίδευση μεικτής ακρίβειας. Μπορείτε να χρησιμοποιήσετε την ακόλουθη δήλωση για να αναδιπλώσετε το αρχικό σας εργαλείο βελτιστοποίησης:

tf.train.experimental.enable_mixed_precision_graph_rewrite(optimizer)

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

Συμπέρασμα

Όταν ξεκινάτε την εκπαίδευση του μοντέλου βαθιάς μάθησης στο SageMaker, λάβετε υπόψη τις ακόλουθες συμβουλές για να επιτύχετε μεγαλύτερη ταχύτητα εκπαίδευσης:

  • Δοκιμάστε πρώτα τη μέθοδο πολλαπλών CPU, μίας παρουσίας ή τη μέθοδο μίας GPU, μίας παρουσίας. Εάν η χρήση της CPU/GPU είναι πολύ υψηλή (για παράδειγμα πάνω από 90%), προχωρήστε στο επόμενο βήμα.
  • Δοκιμάστε περισσότερες CPU σε μεμονωμένο κεντρικό υπολογιστή ή περισσότερες GPU σε μεμονωμένο κεντρικό υπολογιστή. Εάν η χρήση είναι κοντά στη μέγιστη χρήση των CPU ή των GPU, προχωρήστε στο επόμενο βήμα.
  • Δοκιμάστε πολλές CPU ή πολλές GPU με πολλούς κεντρικούς υπολογιστές.
  • Πρέπει να τροποποιήσετε τους κωδικούς όταν χρησιμοποιείτε διακομιστές παραμέτρων ή Horovod. Η τροποποίηση κώδικα δεν είναι η ίδια για το API που βασίζεται σε περίοδο λειτουργίας TensorFlow, tf.estimator API, και tf.keras API. Ένας διακομιστής παραμέτρων ή Horovod μπορεί να εμφανίζει διαφορετικές ταχύτητες εκπαίδευσης σε διαφορετικές περιπτώσεις και εργασίες εκπαίδευσης, επομένως δοκιμάστε και τις δύο μεθόδους, εάν έχετε τον χρόνο και τον προϋπολογισμό για να προσδιορίσετε την καλύτερη.

Λάβετε υπόψη τις ακόλουθες συμβουλές:

  • Ελέγξτε τη χρήση πριν από την κλιμάκωση, βελτιστοποιήστε τη διοχέτευση δεδομένων σας και κάντε CPU και GPU να επικαλύπτονται στη γραμμή χρόνου.
  • Πρώτα αυξήστε την κλίμακα, μετά μειώστε την κλίμακα.
  • Εάν δεν μπορείτε να δημιουργήσετε τη χρήση της GPU μετά από όλες τις μεθόδους, δοκιμάστε τη CPU. Υπάρχουν πολλές περιπτώσεις (ειδικά για το μοντέλο κατάταξης αναλογίας κλικ προς αριθμό εμφανίσεων) όπου ο συνολικός χρόνος εκπαίδευσης της εκπαίδευσης παρουσίας CPU είναι μικρότερος και πιο οικονομικός από την εκπαίδευση παρουσίασης GPU.

Έχουμε επίσης ένα δείγμα κώδικα στο GitHub repo, όπου δείχνουμε δύο δείγματα κατανεμημένης εκπαίδευσης DeepFM στο SageMaker. Ο ένας είναι ένας διακομιστής παραμέτρων TensorFlow σε παρουσίες CPU, ο άλλος είναι Horovod σε παρουσίες GPU.


Σχετικά με τους Συγγραφείς

Βέλτιστες πρακτικές για εκπαίδευση επιτάχυνσης TensorFlow 1.x στο Amazon SageMaker PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται. Yuhui Liang είναι αρχιτέκτονας λύσεων μηχανικής μάθησης Sr. Έχει επικεντρωθεί στην προώθηση και εφαρμογή της μηχανικής μάθησης και εμπλέκεται βαθιά σε πολλά έργα μηχανικής μάθησης πελατών. Έχει πλούσια εμπειρία σε κατανεμημένη εκπαίδευση σε βάθος μάθησης, συστήματα συστάσεων και υπολογιστική διαφήμιση.

Βέλτιστες πρακτικές για εκπαίδευση επιτάχυνσης TensorFlow 1.x στο Amazon SageMaker PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.Shishuai Wang είναι αρχιτέκτονας λύσεων μηχανικής μάθησης Sr. Συνεργάζεται με πελάτες AWS για να τους βοηθήσει να υιοθετήσουν τη μηχανική εκμάθηση σε μεγάλη κλίμακα. Του αρέσει να βλέπει ταινίες και να ταξιδεύει σε όλο τον κόσμο.

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

Περισσότερα από Μηχανική εκμάθηση AWS