কেরাসহ প্রশিক্ষণ বিতরণ করেন

TensorFlow.org এ দেখুন Google Colab-এ চালান GitHub-এ উৎস দেখুন নোটবুক ডাউনলোড করুন

ওভারভিউ

tf.distribute.Strategy API একাধিক প্রক্রিয়াকরণ ইউনিট জুড়ে আপনার প্রশিক্ষণ বিতরণের জন্য একটি বিমূর্ততা প্রদান করে। এটি আপনাকে ন্যূনতম পরিবর্তন সহ বিদ্যমান মডেল এবং প্রশিক্ষণ কোড ব্যবহার করে বিতরণ করা প্রশিক্ষণ পরিচালনা করতে দেয়।

এই টিউটোরিয়ালটি দেখায় কিভাবে tf.distribute.MirroredStrategy ব্যবহার করতে হয় একটি মেশিনে অনেক GPU-তে সিঙ্ক্রোনাস প্রশিক্ষণের সাথে ইন-গ্রাফ রেপ্লিকেশন করতে। কৌশলটি মূলত প্রতিটি প্রসেসরে মডেলের সমস্ত ভেরিয়েবল কপি করে। তারপর, এটি সমস্ত প্রসেসরের গ্রেডিয়েন্টগুলিকে একত্রিত করতে অল-রিডুস ব্যবহার করে এবং মডেলের সমস্ত কপিতে মিলিত মান প্রয়োগ করে।

আপনি মডেলটি তৈরি করতে tf.keras API এবং প্রশিক্ষণের জন্য Model.fit ব্যবহার করবেন। (একটি কাস্টম প্রশিক্ষণ লুপ এবং MirroredStrategy সহ বিতরণ করা প্রশিক্ষণ সম্পর্কে জানতে, এই টিউটোরিয়ালটি দেখুন ।)

MirroredStrategy আপনার মডেলকে একটি মেশিনে একাধিক GPU-তে প্রশিক্ষণ দেয়। একাধিক কর্মীদের অনেক GPU-তে সিঙ্ক্রোনাস প্রশিক্ষণের জন্য, Keras Model.fit বা একটি কাস্টম প্রশিক্ষণ লুপের সাথে tf.distribute.MultiWorkerMirroredStrategy ব্যবহার করুন। অন্যান্য বিকল্পের জন্য, বিতরণ করা প্রশিক্ষণ নির্দেশিকা পড়ুন।

অন্যান্য বিভিন্ন কৌশল সম্পর্কে জানার জন্য, TensorFlow গাইড সহ বিতরণ করা প্রশিক্ষণ রয়েছে

সেটআপ

import tensorflow_datasets as tfds
import tensorflow as tf

import os

# Load the TensorBoard notebook extension.
%load_ext tensorboard
print(tf.__version__)
2.8.0-rc1

ডেটাসেট ডাউনলোড করুন

TensorFlow ডেটাসেট থেকে MNIST ডেটাসেট লোড করুন। এটি 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 অবজেক্ট তৈরি করুন। এটি ডিস্ট্রিবিউশন পরিচালনা করবে এবং আপনার মডেলটি ভিতরে তৈরি করতে একটি প্রসঙ্গ পরিচালক ( MirroredStrategy.scope ) প্রদান করবে।

strategy = tf.distribute.MirroredStrategy()
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

ইনপুট পাইপলাইন সেট আপ করুন

একাধিক GPU সহ একটি মডেলকে প্রশিক্ষণ দেওয়ার সময়, আপনি ব্যাচের আকার বাড়িয়ে অতিরিক্ত কম্পিউটিং শক্তি কার্যকরভাবে ব্যবহার করতে পারেন। সাধারণভাবে, 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

প্রশিক্ষণ এবং পরীক্ষার ডেটাতে এই scale ফাংশনটি প্রয়োগ করুন, এবং তারপর প্রশিক্ষণের ডেটা ( Dataset.shuffle ) এলোমেলো করতে tf.data.Dataset API ব্যবহার করুন এবং এটি ( Dataset.batch ) ব্যাচ করুন। লক্ষ্য করুন যে আপনি কর্মক্ষমতা উন্নত করতে প্রশিক্ষণের ডেটার একটি ইন-মেমরি ক্যাশেও রাখছেন ( Dataset.cache )।

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

মডেল তৈরি করুন

Strategy.scope এর প্রেক্ষাপটে Keras মডেল তৈরি করুন এবং কম্পাইল করুন:

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',).

কলব্যাক সংজ্ঞায়িত করুন

নিম্নলিখিত tf.keras.callbacks সংজ্ঞায়িত করুন:

  • tf.keras.callbacks.TensorBoard : টেনসরবোর্ডের জন্য একটি লগ লেখে, যা আপনাকে গ্রাফগুলি কল্পনা করতে দেয়।
  • tf.keras.callbacks.ModelCheckpoint : মডেলটিকে একটি নির্দিষ্ট ফ্রিকোয়েন্সিতে সংরক্ষণ করে, যেমন প্রতিটি যুগের পরে।
  • tf.keras.callbacks.LearningRateScheduler : শেখার হার পরিবর্তন করার জন্য নির্ধারিত করে, উদাহরণস্বরূপ, প্রতিটি যুগ/ব্যাচের পরে।

দৃষ্টান্তমূলক উদ্দেশ্যে, নোটবুকে শেখার হার প্রদর্শন করতে PrintLR নামে একটি কাস্টম কলব্যাক যোগ করুন।

# Define the checkpoint directory to store the checkpoints.
checkpoint_dir = './training_checkpoints'
# Define the name of the checkpoint files.
checkpoint_prefix = os.path.join(checkpoint_dir, "ckpt_{epoch}")
# Define a 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
# Define a callback for printing the learning rate 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()))
# Put all the callbacks together.
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()
]

প্রশিক্ষণ এবং মূল্যায়ন

এখন, মডেলটিতে Model.fit কল করে এবং টিউটোরিয়ালের শুরুতে তৈরি করা ডেটাসেটে পাস করে মডেলটিকে স্বাভাবিক পদ্ধতিতে প্রশিক্ষণ দিন। আপনি প্রশিক্ষণ বিতরণ করছেন বা না করছেন এই ধাপটি একই।

EPOCHS = 12

model.fit(train_dataset, epochs=EPOCHS, callbacks=callbacks)
2022-01-26 05:38:28.865380: W tensorflow/core/grappler/optimizers/data/auto_shard.cc:547] The `assert_cardinality` transformation is currently not handled by the auto-shard rewrite and will be removed.
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',).
933/938 [============================>.] - ETA: 0s - loss: 0.2029 - accuracy: 0.9399
Learning rate for epoch 1 is 0.0010000000474974513
938/938 [==============================] - 10s 4ms/step - loss: 0.2022 - accuracy: 0.9401 - lr: 0.0010
Epoch 2/12
930/938 [============================>.] - ETA: 0s - loss: 0.0654 - accuracy: 0.9813
Learning rate for epoch 2 is 0.0010000000474974513
938/938 [==============================] - 3s 3ms/step - loss: 0.0652 - accuracy: 0.9813 - lr: 0.0010
Epoch 3/12
931/938 [============================>.] - ETA: 0s - loss: 0.0453 - accuracy: 0.9864
Learning rate for epoch 3 is 0.0010000000474974513
938/938 [==============================] - 3s 3ms/step - loss: 0.0453 - accuracy: 0.9864 - lr: 0.0010
Epoch 4/12
923/938 [============================>.] - ETA: 0s - loss: 0.0246 - accuracy: 0.9933
Learning rate for epoch 4 is 9.999999747378752e-05
938/938 [==============================] - 3s 3ms/step - loss: 0.0244 - accuracy: 0.9934 - lr: 1.0000e-04
Epoch 5/12
929/938 [============================>.] - ETA: 0s - loss: 0.0211 - accuracy: 0.9944
Learning rate for epoch 5 is 9.999999747378752e-05
938/938 [==============================] - 3s 3ms/step - loss: 0.0212 - accuracy: 0.9944 - lr: 1.0000e-04
Epoch 6/12
930/938 [============================>.] - ETA: 0s - loss: 0.0192 - accuracy: 0.9950
Learning rate for epoch 6 is 9.999999747378752e-05
938/938 [==============================] - 3s 3ms/step - loss: 0.0194 - accuracy: 0.9950 - lr: 1.0000e-04
Epoch 7/12
927/938 [============================>.] - ETA: 0s - loss: 0.0179 - accuracy: 0.9953
Learning rate for epoch 7 is 9.999999747378752e-05
938/938 [==============================] - 3s 3ms/step - loss: 0.0179 - accuracy: 0.9953 - lr: 1.0000e-04
Epoch 8/12
938/938 [==============================] - ETA: 0s - loss: 0.0153 - accuracy: 0.9966
Learning rate for epoch 8 is 9.999999747378752e-06
938/938 [==============================] - 3s 3ms/step - loss: 0.0153 - accuracy: 0.9966 - lr: 1.0000e-05
Epoch 9/12
927/938 [============================>.] - ETA: 0s - loss: 0.0151 - accuracy: 0.9966
Learning rate for epoch 9 is 9.999999747378752e-06
938/938 [==============================] - 3s 3ms/step - loss: 0.0150 - accuracy: 0.9966 - lr: 1.0000e-05
Epoch 10/12
935/938 [============================>.] - ETA: 0s - loss: 0.0148 - accuracy: 0.9966
Learning rate for epoch 10 is 9.999999747378752e-06
938/938 [==============================] - 3s 3ms/step - loss: 0.0148 - accuracy: 0.9966 - lr: 1.0000e-05
Epoch 11/12
937/938 [============================>.] - ETA: 0s - loss: 0.0146 - accuracy: 0.9967
Learning rate for epoch 11 is 9.999999747378752e-06
938/938 [==============================] - 3s 3ms/step - loss: 0.0146 - accuracy: 0.9967 - lr: 1.0000e-05
Epoch 12/12
926/938 [============================>.] - ETA: 0s - loss: 0.0145 - accuracy: 0.9967
Learning rate for epoch 12 is 9.999999747378752e-06
938/938 [==============================] - 3s 3ms/step - loss: 0.0144 - accuracy: 0.9967 - lr: 1.0000e-05
<keras.callbacks.History at 0x7fad70067c10>

সংরক্ষিত চেকপয়েন্টের জন্য পরীক্ষা করুন:

# 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

মডেলটি কতটা ভালো পারফর্ম করে তা পরীক্ষা করতে, সর্বশেষ চেকপয়েন্ট লোড করুন এবং পরীক্ষার ডেটাতে Model.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))
2022-01-26 05:39:15.260539: W tensorflow/core/grappler/optimizers/data/auto_shard.cc:547] The `assert_cardinality` transformation is currently not handled by the auto-shard rewrite and will be removed.
157/157 [==============================] - 2s 4ms/step - loss: 0.0373 - accuracy: 0.9879
Eval loss: 0.03732967749238014, Eval accuracy: 0.9879000186920166

আউটপুটটি কল্পনা করতে, টেনসরবোর্ড চালু করুন এবং লগগুলি দেখুন:

%tensorboard --logdir=logs

ls -sh ./logs
total 4.0K
4.0K train

SavedModel এ রপ্তানি করুন

Model.save ব্যবহার করে গ্রাফ এবং ভেরিয়েবল প্ল্যাটফর্ম-অজ্ঞেয়বাদী Model.save বিন্যাসে রপ্তানি করুন। আপনার মডেল সংরক্ষিত হওয়ার পরে, আপনি Strategy.scope এর সাথে বা ছাড়াই এটি লোড করতে পারেন।

path = 'saved_model/'
model.save(path, save_format='tf')
2022-01-26 05:39:18.012847: W tensorflow/python/util/util.cc:368] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them.
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 [==============================] - 1s 2ms/step - loss: 0.0373 - accuracy: 0.9879
Eval loss: 0.03732967749238014, Eval Accuracy: 0.9879000186920166

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))
2022-01-26 05:39:19.489971: W tensorflow/core/grappler/optimizers/data/auto_shard.cc:547] The `assert_cardinality` transformation is currently not handled by the auto-shard rewrite and will be removed.
157/157 [==============================] - 3s 3ms/step - loss: 0.0373 - accuracy: 0.9879
Eval loss: 0.03732967749238014, Eval Accuracy: 0.9879000186920166

অতিরিক্ত সম্পদ

Model.fit API এর সাথে বিভিন্ন বন্টন কৌশল ব্যবহার করে এমন আরও উদাহরণ:

  1. TPU টিউটোরিয়ালে BERT ব্যবহার করে GLUE টাস্কগুলি GPUs এবং tf.distribute.TPUStrategy — TPU-তে প্রশিক্ষণের জন্য tf.distribute.MirroredStrategy ব্যবহার করে।
  2. একটি বিতরণ কৌশল টিউটোরিয়াল ব্যবহার করে একটি মডেল সংরক্ষণ করুন এবং লোড করুন tf.distribute.Strategy-এর সাথে tf.distribute.Strategy API ব্যবহার করতে হয় তা দেখায়।
  3. অফিসিয়াল টেনসরফ্লো মডেলগুলি একাধিক বিতরণ কৌশল চালানোর জন্য কনফিগার করা যেতে পারে।

TensorFlow বিতরণ কৌশল সম্পর্কে আরও জানতে:

  1. tf.distribute.Strategy টিউটোরিয়াল সহ কাস্টম ট্রেনিং দেখায় কিভাবে একটি কাস্টম ট্রেনিং লুপ সহ একক-কর্মী প্রশিক্ষণের জন্য tf.distribute.MirroredStrategy ব্যবহার করতে হয়।
  2. Keras টিউটোরিয়াল সহ মাল্টি-ওয়ার্কার ট্রেনিং দেখায় কিভাবে MultiWorkerMirroredStrategy এর সাথে Model.fit ব্যবহার করতে হয়।
  3. Keras এবং MultiWorkerMirroredStrategy টিউটোরিয়াল সহ কাস্টম প্রশিক্ষণ লুপ দেখায় কিভাবে Keras এবং একটি কাস্টম প্রশিক্ষণ লুপের সাথে MultiWorkerMirroredStrategy ব্যবহার করতে হয়।
  4. TensorFlow গাইডে বিতরণ করা প্রশিক্ষণ উপলব্ধ বিতরণ কৌশলগুলির একটি ওভারভিউ প্রদান করে।
  5. tf.function গাইডের সাথে আরও ভাল পারফরম্যান্স অন্যান্য কৌশল এবং টুলস সম্পর্কে তথ্য প্রদান করে, যেমন TensorFlow প্রোফাইলার যা আপনি আপনার TensorFlow মডেলের কর্মক্ষমতা অপ্টিমাইজ করতে ব্যবহার করতে পারেন।