צפה בהערות מרכזיות, הפעלות מוצר, סדנאות ועוד מ- Google I / O ראה רשימת השמעה

אימונים מבוזרים עם קרס

צפה ב- TensorFlow.org הפעל בגוגל קולאב צפה במקור ב- GitHub הורד מחברת

סקירה כללית

ממשק ה- API של tf.distribute.Strategy מספק הפשטה להפצת ההדרכה שלך על פני מספר יחידות עיבוד. המטרה היא לאפשר למשתמשים לאפשר אימונים מבוזרים באמצעות מודלים קיימים וקוד אימונים, עם שינויים מינימליים.

הדרכה זו משתמשת ב- tf.distribute.MirroredStrategy , שעושה שכפול בגרף עם אימונים סינכרוניים במכשירי GPU רבים במחשב אחד. בעיקרו של דבר, הוא מעתיק את כל המשתנים של המודל לכל מעבד. לאחר מכן, הוא משתמש ב- all-reduce כדי לשלב את הדרגתיות מכל המעבדים ומחיל את הערך המשולב על כל עותקי הדגם.

MirroredStrategy היא אחת מכמה אסטרטגיות ההפצה הקיימות בליבת TensorFlow. תוכלו לקרוא על אסטרטגיות נוספות במדריך לאסטרטגיות הפצה .

ממשק API של קרס

דוגמה זו משתמשת בממשק ה- API של tf.keras לבניית המודל ולולאת האימון. לקבלת לולאות אימון מותאמות אישית, עיין במדריך tf.distribute.Strategy עם לולאות אימון .

ייבוא ​​תלות

# Import TensorFlow and TensorFlow Datasets

import tensorflow_datasets as tfds
import tensorflow as tf

import os
print(tf.__version__)
2.5.0

הורד את מערך הנתונים

הורד את מערך הנתונים MNIST וטען אותו ממערכי הנתונים של TensorFlow . זה מחזיר מערך נתונים בפורמט tf.data .

הגדרת with_info ל- True כוללת את המטא נתונים עבור כל מערך הנתונים, שנשמר כאן info . בין היתר, אובייקט מטא-נתונים זה כולל את מספר דוגמאות הרכבת והמבחנים.

datasets, info = tfds.load(name='mnist', with_info=True, as_supervised=True)

mnist_train, mnist_test = datasets['train'], datasets['test']

הגדר אסטרטגיית הפצה

צור אובייקט MirroredStrategy . זה יטפל בהפצה ויספק מנהל הקשר ( tf.distribute.MirroredStrategy.scope ) כדי לבנות את המודל שלך בפנים.

strategy = tf.distribute.MirroredStrategy()
WARNING:tensorflow:Collective ops is not configured at program startup. Some performance features may not be enabled.
WARNING:tensorflow:Collective ops is not configured at program startup. Some performance features may not be enabled.
INFO:tensorflow:Using MirroredStrategy with devices ('/job:localhost/replica:0/task:0/device:GPU:0',)
INFO:tensorflow:Using MirroredStrategy with devices ('/job:localhost/replica:0/task:0/device:GPU:0',)
print('Number of devices: {}'.format(strategy.num_replicas_in_sync))
Number of devices: 1

הגדרת צינור קלט

כשאתה מאמן מודל עם מספר GPUs, אתה יכול להשתמש בכוח המחשוב הנוסף ביעילות על ידי הגדלת גודל האצווה. באופן כללי, השתמש בגודל האצווה הגדול ביותר שמתאים לזיכרון ה- GPU, וכוון את קצב הלמידה בהתאם.

# You can also do info.splits.total_num_examples to get the total
# number of examples in the dataset.

num_train_examples = info.splits['train'].num_examples
num_test_examples = info.splits['test'].num_examples

BUFFER_SIZE = 10000

BATCH_SIZE_PER_REPLICA = 64
BATCH_SIZE = BATCH_SIZE_PER_REPLICA * strategy.num_replicas_in_sync

יש לנרמל את ערכי הפיקסלים, שהם 0-255, לטווח 0-1 . הגדר סולם זה בפונקציה.

def scale(image, label):
  image = tf.cast(image, tf.float32)
  image /= 255

  return image, label

החל פונקציה זו על נתוני האימון והבדיקה, ערבב את נתוני האימון ואצווה אותם לאימון . שימו לב שאנחנו שומרים גם מטמון בזיכרון של נתוני האימון כדי לשפר את הביצועים.

train_dataset = mnist_train.map(scale).cache().shuffle(BUFFER_SIZE).batch(BATCH_SIZE)
eval_dataset = mnist_test.map(scale).batch(BATCH_SIZE)

צור את המודל

צור והרכיב את מודל Keras בהקשר של strategy.scope .

with strategy.scope():
  model = tf.keras.Sequential([
      tf.keras.layers.Conv2D(32, 3, activation='relu', input_shape=(28, 28, 1)),
      tf.keras.layers.MaxPooling2D(),
      tf.keras.layers.Flatten(),
      tf.keras.layers.Dense(64, activation='relu'),
      tf.keras.layers.Dense(10)
  ])

  model.compile(loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
                optimizer=tf.keras.optimizers.Adam(),
                metrics=['accuracy'])
INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).
INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).
INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).
INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).
INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).
INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).
INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).
INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).

הגדר את השיחות החוזרות

השיחות החוזרות המשמשות כאן הן:

  • TensorBoard : התקשרות חוזרת זו כותבת יומן עבור TensorBoard המאפשר לך לדמיין את הגרפים.
  • נקודת ביקורת מודל : התקשרות חוזרת זו שומרת את המודל לאחר כל תקופה.
  • מתזמן שיעורי למידה: באמצעות התקשרות חוזרת זו, אתה יכול לתזמן את שינוי הלמידה לאחר כל תקופה / אצווה.

למטרות המחשה, הוסף התקשרות חוזרת עם הדפסה כדי להציג את קצב הלמידה במחברת.

# Define the checkpoint directory to store the checkpoints

checkpoint_dir = './training_checkpoints'
# Name of the checkpoint files
checkpoint_prefix = os.path.join(checkpoint_dir, "ckpt_{epoch}")
# Function for decaying the learning rate.
# You can define any decay function you need.
def decay(epoch):
  if epoch < 3:
    return 1e-3
  elif epoch >= 3 and epoch < 7:
    return 1e-4
  else:
    return 1e-5
# Callback for printing the LR at the end of each epoch.
class PrintLR(tf.keras.callbacks.Callback):
  def on_epoch_end(self, epoch, logs=None):
    print('\nLearning rate for epoch {} is {}'.format(epoch + 1,
                                                      model.optimizer.lr.numpy()))
callbacks = [
    tf.keras.callbacks.TensorBoard(log_dir='./logs'),
    tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_prefix,
                                       save_weights_only=True),
    tf.keras.callbacks.LearningRateScheduler(decay),
    PrintLR()
]

התאמן והערך

כעת, הכשיר את המודל בדרך הרגילה, תוך fit למודל ולהעביר את מערך הנתונים שנוצר בתחילת ההדרכה. שלב זה זהה בין אם אתם מפיצים את ההדרכה ובין אם לא.

model.fit(train_dataset, epochs=12, callbacks=callbacks)
Epoch 1/12
INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).
INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).
INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).
INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).
INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).
INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).
INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).
INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).
INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).
INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).
INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).
INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).
3/938 [..............................] - ETA: 4:06 - loss: 2.2662 - accuracy: 0.2292WARNING:tensorflow:Callback method `on_train_batch_begin` is slow compared to the batch time (batch time: 0.0044s vs `on_train_batch_begin` time: 0.0716s). Check your callbacks.
WARNING:tensorflow:Callback method `on_train_batch_begin` is slow compared to the batch time (batch time: 0.0044s vs `on_train_batch_begin` time: 0.0716s). Check your callbacks.
WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.0044s vs `on_train_batch_end` time: 0.0148s). Check your callbacks.
WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.0044s vs `on_train_batch_end` time: 0.0148s). Check your callbacks.
938/938 [==============================] - 9s 4ms/step - loss: 0.2016 - accuracy: 0.9415

Learning rate for epoch 1 is 0.0010000000474974513
Epoch 2/12
938/938 [==============================] - 3s 3ms/step - loss: 0.0685 - accuracy: 0.9791

Learning rate for epoch 2 is 0.0010000000474974513
Epoch 3/12
938/938 [==============================] - 3s 3ms/step - loss: 0.0477 - accuracy: 0.9857

Learning rate for epoch 3 is 0.0010000000474974513
Epoch 4/12
938/938 [==============================] - 3s 3ms/step - loss: 0.0273 - accuracy: 0.9925

Learning rate for epoch 4 is 9.999999747378752e-05
Epoch 5/12
938/938 [==============================] - 3s 3ms/step - loss: 0.0236 - accuracy: 0.9937

Learning rate for epoch 5 is 9.999999747378752e-05
Epoch 6/12
938/938 [==============================] - 3s 3ms/step - loss: 0.0219 - accuracy: 0.9942

Learning rate for epoch 6 is 9.999999747378752e-05
Epoch 7/12
938/938 [==============================] - 3s 3ms/step - loss: 0.0201 - accuracy: 0.9949

Learning rate for epoch 7 is 9.999999747378752e-05
Epoch 8/12
938/938 [==============================] - 3s 3ms/step - loss: 0.0176 - accuracy: 0.9958

Learning rate for epoch 8 is 9.999999747378752e-06
Epoch 9/12
938/938 [==============================] - 3s 3ms/step - loss: 0.0173 - accuracy: 0.9959

Learning rate for epoch 9 is 9.999999747378752e-06
Epoch 10/12
938/938 [==============================] - 3s 3ms/step - loss: 0.0171 - accuracy: 0.9959

Learning rate for epoch 10 is 9.999999747378752e-06
Epoch 11/12
938/938 [==============================] - 3s 3ms/step - loss: 0.0169 - accuracy: 0.9959

Learning rate for epoch 11 is 9.999999747378752e-06
Epoch 12/12
938/938 [==============================] - 3s 3ms/step - loss: 0.0168 - accuracy: 0.9962

Learning rate for epoch 12 is 9.999999747378752e-06
<tensorflow.python.keras.callbacks.History at 0x7f74800d0550>

כפי שניתן לראות למטה, נקודות הביקורת נשמרות.

# check the checkpoint directory
ls {checkpoint_dir}
checkpoint           ckpt_4.data-00000-of-00001
ckpt_1.data-00000-of-00001   ckpt_4.index
ckpt_1.index             ckpt_5.data-00000-of-00001
ckpt_10.data-00000-of-00001  ckpt_5.index
ckpt_10.index            ckpt_6.data-00000-of-00001
ckpt_11.data-00000-of-00001  ckpt_6.index
ckpt_11.index            ckpt_7.data-00000-of-00001
ckpt_12.data-00000-of-00001  ckpt_7.index
ckpt_12.index            ckpt_8.data-00000-of-00001
ckpt_2.data-00000-of-00001   ckpt_8.index
ckpt_2.index             ckpt_9.data-00000-of-00001
ckpt_3.data-00000-of-00001   ckpt_9.index
ckpt_3.index

כדי לראות איך המודל לבצע, לטעון את המחסום השיחה האחרונה evaluate על נתוני הבדיקה.

התקשר evaluate כמו קודם באמצעות מערכי נתונים מתאימים.

model.load_weights(tf.train.latest_checkpoint(checkpoint_dir))

eval_loss, eval_acc = model.evaluate(eval_dataset)

print('Eval loss: {}, Eval Accuracy: {}'.format(eval_loss, eval_acc))
157/157 [==============================] - 2s 4ms/step - loss: 0.0396 - accuracy: 0.9867
Eval loss: 0.03959868103265762, Eval Accuracy: 0.9866999983787537

כדי לראות את הפלט, אתה יכול להוריד ולהציג את יומני TensorBoard במסוף.

$ tensorboard --logdir=path/to/log-directory
ls -sh ./logs
total 4.0K
4.0K train

ייצא ל- SavedModel

ייצא את הגרף והמשתנים לפורמט SavedModel לפלטפורמה-אגנוסטית. לאחר שמירת המודל שלך, תוכל לטעון אותו עם או בלי ההיקף.

path = 'saved_model/'
model.save(path, save_format='tf')
INFO:tensorflow:Assets written to: saved_model/assets
INFO:tensorflow:Assets written to: saved_model/assets

טען את המודל ללא strategy.scope .

unreplicated_model = tf.keras.models.load_model(path)

unreplicated_model.compile(
    loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
    optimizer=tf.keras.optimizers.Adam(),
    metrics=['accuracy'])

eval_loss, eval_acc = unreplicated_model.evaluate(eval_dataset)

print('Eval loss: {}, Eval Accuracy: {}'.format(eval_loss, eval_acc))
157/157 [==============================] - 0s 2ms/step - loss: 0.0396 - accuracy: 0.9867
Eval loss: 0.03959868103265762, Eval Accuracy: 0.9866999983787537

טען את המודל strategy.scope .

with strategy.scope():
  replicated_model = tf.keras.models.load_model(path)
  replicated_model.compile(loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
                           optimizer=tf.keras.optimizers.Adam(),
                           metrics=['accuracy'])

  eval_loss, eval_acc = replicated_model.evaluate(eval_dataset)
  print ('Eval loss: {}, Eval Accuracy: {}'.format(eval_loss, eval_acc))
157/157 [==============================] - 3s 3ms/step - loss: 0.0396 - accuracy: 0.9867
Eval loss: 0.03959868103265762, Eval Accuracy: 0.9866999983787537

דוגמאות והדרכות

להלן מספר דוגמאות לשימוש באסטרטגיית הפצה עם התאמת / הידור של keras:

  1. שנאי למשל מאומנים באמצעות tf.distribute.MirroredStrategy
  2. דוגמה ל- NCF שהוכשרה באמצעות tf.distribute.MirroredStrategy .

דוגמאות נוספות המופיעות במדריך האסטרטגיה להפצה

הצעדים הבאים