কেরাসের সাথে বহু-কর্মী প্রশিক্ষণ

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

ওভারভিউ

এই টিউটোরিয়ালটি দেখায় কিভাবে একটি Keras মডেল এবং Model.fit API-এর সাথে tf.distribute.Strategy API-বিশেষ করে tf.distribute.MultiWorkerMirroredStrategy ক্লাস ব্যবহার করে মাল্টি-ওয়ার্কার বিতরণ করা প্রশিক্ষণ। এই কৌশলটির সাহায্যে, একটি কেরাস মডেল যা একক-শ্রমিকের উপর চালানোর জন্য ডিজাইন করা হয়েছিল, ন্যূনতম কোড পরিবর্তন সহ একাধিক কর্মীদের উপর নির্বিঘ্নে কাজ করতে পারে।

যারা tf.distribute.Strategy APIs সম্পর্কে গভীরভাবে বুঝতে আগ্রহী তাদের জন্য, TensorFlow সমর্থন করে এমন বিতরণ কৌশলগুলির একটি ওভারভিউয়ের জন্য TensorFlow গাইডে বিতরণ করা প্রশিক্ষণ উপলব্ধ।

Keras এবং একটি কাস্টম প্রশিক্ষণ লুপের সাথে MultiWorkerMirroredStrategy কীভাবে ব্যবহার করবেন তা শিখতে, Keras এবং MultiWorkerMirroredStrategy সহ কাস্টম প্রশিক্ষণ লুপ পড়ুন।

মনে রাখবেন যে এই টিউটোরিয়ালটির উদ্দেশ্য হল দুটি কর্মী সহ একটি ন্যূনতম বহু-কর্মী উদাহরণ প্রদর্শন করা।

সেটআপ

কিছু প্রয়োজনীয় আমদানি দিয়ে শুরু করুন:

import json
import os
import sys

TensorFlow আমদানি করার আগে, পরিবেশে কিছু পরিবর্তন করুন:

  1. সমস্ত GPU নিষ্ক্রিয় করুন। এটি একই GPU ব্যবহার করার চেষ্টাকারী কর্মীদের দ্বারা সৃষ্ট ত্রুটিগুলিকে প্রতিরোধ করে৷ একটি বাস্তব-বিশ্বের অ্যাপ্লিকেশনে, প্রতিটি কর্মী আলাদা মেশিনে থাকবে।
os.environ["CUDA_VISIBLE_DEVICES"] = "-1"
  1. TF_CONFIG এনভায়রনমেন্ট ভেরিয়েবল রিসেট করুন (আপনি এই সম্পর্কে পরে আরও জানবেন):
os.environ.pop('TF_CONFIG', None)
  1. নিশ্চিত করুন যে বর্তমান ডিরেক্টরিটি পাইথনের পথে রয়েছে—এটি নোটবুককে পরে %%writefile দ্বারা লেখা ফাইলগুলি আমদানি করতে দেয়:
if '.' not in sys.path:
  sys.path.insert(0, '.')

এখন TensorFlow আমদানি করুন:

import tensorflow as tf

ডেটাসেট এবং মডেল সংজ্ঞা

এরপরে, একটি সাধারণ মডেল এবং ডেটাসেট সেটআপ সহ একটি mnist_setup.py ফাইল তৈরি করুন। এই টিউটোরিয়ালে এই পাইথন ফাইলটি কর্মী প্রসেস দ্বারা ব্যবহার করা হবে:

%%writefile mnist_setup.py

import os
import tensorflow as tf
import numpy as np

def mnist_dataset(batch_size):
  (x_train, y_train), _ = tf.keras.datasets.mnist.load_data()
  # The `x` arrays are in uint8 and have values in the [0, 255] range.
  # You need to convert them to float32 with values in the [0, 1] range.
  x_train = x_train / np.float32(255)
  y_train = y_train.astype(np.int64)
  train_dataset = tf.data.Dataset.from_tensor_slices(
      (x_train, y_train)).shuffle(60000).repeat().batch(batch_size)
  return train_dataset

def build_and_compile_cnn_model():
  model = tf.keras.Sequential([
      tf.keras.layers.InputLayer(input_shape=(28, 28)),
      tf.keras.layers.Reshape(target_shape=(28, 28, 1)),
      tf.keras.layers.Conv2D(32, 3, activation='relu'),
      tf.keras.layers.Flatten(),
      tf.keras.layers.Dense(128, activation='relu'),
      tf.keras.layers.Dense(10)
  ])
  model.compile(
      loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
      optimizer=tf.keras.optimizers.SGD(learning_rate=0.001),
      metrics=['accuracy'])
  return model
Writing mnist_setup.py

একক কর্মীর উপর মডেল প্রশিক্ষণ

অল্প সংখ্যক যুগের জন্য মডেলটি প্রশিক্ষণের চেষ্টা করুন এবং সবকিছু সঠিকভাবে কাজ করছে তা নিশ্চিত করতে একজন একক কর্মীর ফলাফল পর্যবেক্ষণ করুন। প্রশিক্ষণের অগ্রগতির সাথে সাথে ক্ষতি হ্রাস করা উচিত এবং নির্ভুলতা বৃদ্ধি করা উচিত।

import mnist_setup

batch_size = 64
single_worker_dataset = mnist_setup.mnist_dataset(batch_size)
single_worker_model = mnist_setup.build_and_compile_cnn_model()
single_worker_model.fit(single_worker_dataset, epochs=3, steps_per_epoch=70)
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz
11493376/11490434 [==============================] - 0s 0us/step
11501568/11490434 [==============================] - 0s 0us/step
2022-02-05 02:20:59.945141: E tensorflow/stream_executor/cuda/cuda_driver.cc:271] failed call to cuInit: CUDA_ERROR_NO_DEVICE: no CUDA-capable device is detected
Epoch 1/3
70/70 [==============================] - 1s 12ms/step - loss: 2.2839 - accuracy: 0.1788
Epoch 2/3
70/70 [==============================] - 1s 12ms/step - loss: 2.2492 - accuracy: 0.3185
Epoch 3/3
70/70 [==============================] - 1s 12ms/step - loss: 2.2012 - accuracy: 0.4795
<keras.callbacks.History at 0x7f666a2e4510>

মাল্টি-কর্মী কনফিগারেশন

এখন মাল্টি-কর্মী প্রশিক্ষণের জগতে প্রবেশ করা যাক।

কাজ এবং কাজ সহ একটি ক্লাস্টার

TensorFlow-এ, বিতরণ করা প্রশিক্ষণের মধ্যে রয়েছে: একটি 'cluster' যার বেশ কয়েকটি কাজ রয়েছে এবং প্রতিটি কাজের এক বা একাধিক 'task' থাকতে পারে।

একাধিক মেশিনে প্রশিক্ষণের জন্য আপনার TF_CONFIG কনফিগারেশন এনভায়রনমেন্ট ভেরিয়েবলের প্রয়োজন হবে, যার প্রতিটির একটি আলাদা ভূমিকা থাকতে পারে। TF_CONFIG হল একটি JSON স্ট্রিং যা ক্লাস্টারের অংশ এমন প্রতিটি কর্মীর জন্য ক্লাস্টার কনফিগারেশন নির্দিষ্ট করতে ব্যবহৃত হয়।

একটি TF_CONFIG ভেরিয়েবলের দুটি উপাদান রয়েছে: 'cluster' এবং 'task'

  • একটি 'cluster' সমস্ত কর্মীদের জন্য একই এবং প্রশিক্ষণ ক্লাস্টার সম্পর্কে তথ্য প্রদান করে, যা 'worker' বা 'chief' এর মতো বিভিন্ন ধরণের কাজের সমন্বয়ে একটি নির্দেশনা।

    • tf.distribute.MultiWorkerMirroredStrategy এর সাথে বহু-কর্মী প্রশিক্ষণে, সাধারণত একজন 'worker' থাকে যে দায়িত্ব নেয়, যেমন একটি চেকপয়েন্ট সংরক্ষণ করা এবং টেনসরবোর্ডের জন্য একটি সারসংক্ষেপ ফাইল লেখা, একজন নিয়মিত 'worker' যা করে তা ছাড়াও। এই ধরনের 'worker' প্রধান কর্মী হিসাবে উল্লেখ করা হয় (একটি কাজের নাম 'chief' সহ)।
    • 'chief' প্রধান'-এর জন্য 'index' 0 নিযুক্ত করা প্রথাগত (আসলে, এইভাবে tf.distribute.Strategy .কৌশল প্রয়োগ করা হয়)।
  • একটি 'task' বর্তমান কাজের তথ্য প্রদান করে এবং প্রতিটি কর্মীর জন্য আলাদা। এটি সেই কর্মীর 'type' এবং 'index' নির্দিষ্ট করে।

নীচে একটি উদাহরণ কনফিগারেশন:

tf_config = {
    'cluster': {
        'worker': ['localhost:12345', 'localhost:23456']
    },
    'task': {'type': 'worker', 'index': 0}
}

এখানে একটি JSON স্ট্রিং হিসাবে একই TF_CONFIG সিরিয়াল করা হয়েছে:

json.dumps(tf_config)
'{"cluster": {"worker": ["localhost:12345", "localhost:23456"]}, "task": {"type": "worker", "index": 0} }'

মনে রাখবেন যে tf_config পাইথনের একটি স্থানীয় পরিবর্তনশীল। একটি প্রশিক্ষণ কনফিগারেশনের জন্য এটি ব্যবহার করতে সক্ষম হওয়ার জন্য, এই ডিক্টটিকে একটি JSON হিসাবে সিরিয়াল করা দরকার এবং একটি TF_CONFIG পরিবেশ পরিবর্তনশীলে স্থাপন করা দরকার।

উপরের উদাহরণের কনফিগারেশনে, আপনি টাস্ক 'type' কে 'worker' এবং টাস্ক 'index' 0 এ সেট করেছেন। অতএব, এই মেশিন প্রথম কর্মী. এটি 'chief' কর্মী হিসেবে নিয়োগ পাবে এবং অন্যদের চেয়ে বেশি কাজ করবে।

দৃষ্টান্তের উদ্দেশ্যে, এই টিউটোরিয়ালটি দেখায় কিভাবে আপনি একটি localhost দুইজন শ্রমিকের সাথে একটি TF_CONFIG ভেরিয়েবল সেট আপ করতে পারেন।

অনুশীলনে, আপনি বাহ্যিক আইপি ঠিকানা/পোর্টে একাধিক কর্মী তৈরি করবেন এবং সেই অনুযায়ী প্রতিটি কর্মীর জন্য একটি TF_CONFIG ভেরিয়েবল সেট করবেন।

এই টিউটোরিয়ালে, আপনি দুটি কর্মী ব্যবহার করবেন:

  • প্রথম ( 'chief' ) কর্মীর TF_CONFIG উপরে দেখানো হয়েছে।
  • দ্বিতীয় কর্মীর জন্য, আপনি tf_config['task']['index']=1 সেট করবেন

নোটবুকগুলিতে পরিবেশের পরিবর্তনশীল এবং সাবপ্রসেস

সাবপ্রসেসগুলি তাদের পিতামাতার কাছ থেকে এনভায়রনমেন্ট ভেরিয়েবলের উত্তরাধিকারী হয়।

উদাহরণস্বরূপ, আপনি এই জুপিটার নোটবুক প্রক্রিয়ায় একটি পরিবেশ পরিবর্তনশীল সেট করতে পারেন:

os.environ['GREETINGS'] = 'Hello TensorFlow!'

তারপর, আপনি একটি সাবপ্রসেস থেকে পরিবেশ পরিবর্তনশীল অ্যাক্সেস করতে পারেন:

echo ${GREETINGS}
Hello TensorFlow!

পরবর্তী বিভাগে, আপনি কর্মী সাবপ্রসেসে TF_CONFIG পাস করার জন্য একটি অনুরূপ পদ্ধতি ব্যবহার করবেন। একটি বাস্তব-বিশ্বের পরিস্থিতিতে, আপনি এইভাবে আপনার কাজগুলি চালু করবেন না, তবে এই উদাহরণে এটি যথেষ্ট।

সঠিক কৌশল বেছে নিন

টেনসরফ্লোতে, বিতরণ করা প্রশিক্ষণের দুটি প্রধান রূপ রয়েছে:

  • সিঙ্ক্রোনাস ট্রেনিং , যেখানে প্রশিক্ষণের ধাপগুলি কর্মীদের এবং প্রতিলিপিগুলি জুড়ে সিঙ্ক করা হয়, এবং
  • অ্যাসিঙ্ক্রোনাস প্রশিক্ষণ , যেখানে প্রশিক্ষণের ধাপগুলি কঠোরভাবে সিঙ্ক করা হয় না (উদাহরণস্বরূপ, প্যারামিটার সার্ভার প্রশিক্ষণ )।

এই টিউটোরিয়ালটি দেখায় কিভাবে tf.distribute.MultiWorkerMirroredStrategy এর একটি উদাহরণ ব্যবহার করে সিঙ্ক্রোনাস মাল্টি-ওয়ার্কার প্রশিক্ষণ সম্পাদন করতে হয়।

MultiWorkerMirroredStrategy সমস্ত কর্মী জুড়ে প্রতিটি ডিভাইসে মডেলের স্তরগুলিতে সমস্ত ভেরিয়েবলের কপি তৈরি করে। এটি CollectiveOps ব্যবহার করে, সমষ্টিগত যোগাযোগের জন্য একটি TensorFlow অপ, গ্রেডিয়েন্টগুলিকে একত্রিত করতে এবং ভেরিয়েবলগুলিকে সিঙ্কে রাখতে। tf.distribute.Strategy এই কৌশল সম্পর্কে আরও বিশদ রয়েছে।

strategy = tf.distribute.MultiWorkerMirroredStrategy()
WARNING:tensorflow:Collective ops is not configured at program startup. Some performance features may not be enabled.
INFO:tensorflow:Single-worker MultiWorkerMirroredStrategy with local_devices = ('/device:CPU:0',), communication = CommunicationImplementation.AUTO

MultiWorkerMirroredStrategy tf.distribute.experimental.CommunicationOptions প্যারামিটারের মাধ্যমে একাধিক বাস্তবায়ন প্রদান করে: 1) RING ক্রস-হোস্ট কমিউনিকেশন লেয়ার হিসাবে gRPC ব্যবহার করে রিং-ভিত্তিক সমষ্টি প্রয়োগ করে; 2) NCCL যৌথ বাস্তবায়নের জন্য NVIDIA কালেক্টিভ কমিউনিকেশন লাইব্রেরি ব্যবহার করে; এবং 3) স্বয়ংক্রিয় AUTO পছন্দকে পিছিয়ে দেয়। যৌথ বাস্তবায়নের সর্বোত্তম পছন্দ নির্ভর করে GPU-এর সংখ্যা এবং প্রকারের উপর এবং ক্লাস্টারে নেটওয়ার্ক আন্তঃসংযোগ।

মডেলকে প্রশিক্ষণ দিন

tf.kerastf.distribute.Strategy API-এর একীকরণের সাথে, আপনি একাধিক-কর্মীদের প্রশিক্ষণ বিতরণ করার জন্য একমাত্র পরিবর্তন করতে পারবেন তা হল মডেল বিল্ডিং এবং model.compile() কলের ভিতরে strategy.scope() । বন্টন কৌশলের সুযোগ নির্দেশ করে কিভাবে এবং কোথায় ভেরিয়েবল তৈরি করা হয়, এবং MultiWorkerMirroredStrategy এর ক্ষেত্রে, তৈরি করা ভেরিয়েবলগুলি হল MirroredVariable s, এবং সেগুলি প্রতিটি শ্রমিকের উপর প্রতিলিপি করা হয়।

with strategy.scope():
  # Model building/compiling need to be within `strategy.scope()`.
  multi_worker_model = mnist_setup.build_and_compile_cnn_model()

আসলে MultiWorkerMirroredStrategy সাথে চালানোর জন্য আপনাকে কর্মী প্রক্রিয়া চালাতে হবে এবং তাদের কাছে একটি TF_CONFIG হবে।

আগে লেখা mnist_setup.py ফাইলের মতো, এখানে main.py যেটি প্রতিটি কর্মী চলবে:

%%writefile main.py

import os
import json

import tensorflow as tf
import mnist_setup

per_worker_batch_size = 64
tf_config = json.loads(os.environ['TF_CONFIG'])
num_workers = len(tf_config['cluster']['worker'])

strategy = tf.distribute.MultiWorkerMirroredStrategy()

global_batch_size = per_worker_batch_size * num_workers
multi_worker_dataset = mnist_setup.mnist_dataset(global_batch_size)

with strategy.scope():
  # Model building/compiling need to be within `strategy.scope()`.
  multi_worker_model = mnist_setup.build_and_compile_cnn_model()


multi_worker_model.fit(multi_worker_dataset, epochs=3, steps_per_epoch=70)
Writing main.py

উপরের কোড স্নিপেটে লক্ষ্য করুন যে global_batch_size , যা Dataset.batch-এ পাস করা হয়, Dataset.batch per_worker_batch_size * num_workers সেট করা হয়। এটি নিশ্চিত করে যে প্রতিটি কর্মী কর্মীদের সংখ্যা নির্বিশেষে per_worker_batch_size উদাহরণগুলির ব্যাচ প্রক্রিয়া করে।

বর্তমান ডিরেক্টরিতে এখন উভয় পাইথন ফাইল রয়েছে:

ls *.py
main.py
mnist_setup.py

তাই TF_CONFIG-কে TF_CONFIG ক্রমিক করুন এবং পরিবেশের ভেরিয়েবলে যোগ করুন:

os.environ['TF_CONFIG'] = json.dumps(tf_config)

এখন, আপনি একটি কর্মী প্রক্রিয়া চালু করতে পারেন যা TF_CONFIG চালাবে এবং main.py ব্যবহার করবে:

# first kill any previous runs
%killbgscripts
All background processes were killed.
python main.py &> job_0.log

উপরের কমান্ড সম্পর্কে নোট করার জন্য কয়েকটি জিনিস রয়েছে:

  1. এটি %%bash ব্যবহার করে যা কিছু ব্যাশ কমান্ড চালানোর জন্য একটি নোটবুক "জাদু"
  2. এটি ব্যাকগ্রাউন্ডে bash প্রক্রিয়া চালানোর জন্য --bg পতাকা ব্যবহার করে, কারণ এই কর্মী শেষ হবে না। এটি শুরু হওয়ার আগে সমস্ত কর্মীদের জন্য অপেক্ষা করে।

ব্যাকগ্রাউন্ডেড ওয়ার্কার প্রসেস এই নোটবুকে আউটপুট প্রিন্ট করবে না, তাই &> তার আউটপুটকে একটি ফাইলে রিডাইরেক্ট করে যাতে আপনি পরে একটি লগ ফাইলে কি ঘটেছে তা পরিদর্শন করতে পারেন।

সুতরাং, প্রক্রিয়াটি শুরু হওয়ার জন্য কয়েক সেকেন্ড অপেক্ষা করুন:

import time
time.sleep(10)

এখন, এখন পর্যন্ত কর্মীর লগ ফাইলে কী আউটপুট হয়েছে তা পরিদর্শন করুন:

cat job_0.log
2022-02-05 02:21:06.348503: E tensorflow/stream_executor/cuda/cuda_driver.cc:271] failed call to cuInit: CUDA_ERROR_NO_DEVICE: no CUDA-capable device is detected

লগ ফাইলের শেষ লাইনে বলা উচিত: Started server with target: grpc://localhost:12345 । প্রথম কর্মী এখন প্রস্তুত, এবং অন্য সমস্ত কর্মী(গুলি) এগিয়ে যাওয়ার জন্য প্রস্তুত হওয়ার জন্য অপেক্ষা করছে৷

সুতরাং দ্বিতীয় কর্মীর প্রক্রিয়া বাছাই করার জন্য tf_config আপডেট করুন:

tf_config['task']['index'] = 1
os.environ['TF_CONFIG'] = json.dumps(tf_config)

দ্বিতীয় কর্মী চালু করুন। এটি প্রশিক্ষণ শুরু করবে যেহেতু সমস্ত কর্মী সক্রিয় রয়েছে (তাই এই প্রক্রিয়াটির ব্যাকগ্রাউন্ড করার দরকার নেই):

python main.py
Epoch 1/3
70/70 [==============================] - 6s 51ms/step - loss: 2.2766 - accuracy: 0.1722
Epoch 2/3
70/70 [==============================] - 3s 48ms/step - loss: 2.2172 - accuracy: 0.4157
Epoch 3/3
70/70 [==============================] - 3s 49ms/step - loss: 2.1471 - accuracy: 0.5901
2022-02-05 02:21:16.367945: E tensorflow/stream_executor/cuda/cuda_driver.cc:271] failed call to cuInit: CUDA_ERROR_NO_DEVICE: no CUDA-capable device is detected
2022-02-05 02:21:17.234030: W tensorflow/core/grappler/optimizers/data/auto_shard.cc:776] AUTO sharding policy will apply DATA sharding policy as it failed to apply FILE sharding policy because of the following reason: Found an unshardable source dataset: name: "TensorSliceDataset/_2"
op: "TensorSliceDataset"
input: "Placeholder/_0"
input: "Placeholder/_1"
attr {
  key: "Toutput_types"
  value {
    list {
      type: DT_FLOAT
      type: DT_INT64
    }
  }
}
attr {
  key: "_cardinality"
  value {
    i: 60000
  }
}
attr {
  key: "is_files"
  value {
    b: false
  }
}
attr {
  key: "metadata"
  value {
    s: "\n\024TensorSliceDataset:0"
  }
}
attr {
  key: "output_shapes"
  value {
    list {
      shape {
        dim {
          size: 28
        }
        dim {
          size: 28
        }
      }
      shape {
      }
    }
  }
}
experimental_type {
  type_id: TFT_PRODUCT
  args {
    type_id: TFT_DATASET
    args {
      type_id: TFT_PRODUCT
      args {
        type_id: TFT_TENSOR
        args {
          type_id: TFT_FLOAT
        }
      }
      args {
        type_id: TFT_TENSOR
        args {
          type_id: TFT_INT64
        }
      }
    }
  }
  args {
    type_id: TFT_DATASET
    args {
      type_id: TFT_PRODUCT
      args {
        type_id: TFT_TENSOR
        args {
          type_id: TFT_FLOAT
        }
      }
      args {
        type_id: TFT_TENSOR
        args {
          type_id: TFT_INT64
        }
      }
    }
  }
}

2022-02-05 02:21:17.450972: W tensorflow/core/framework/dataset.cc:768] Input of GeneratorDatasetOp::Dataset will not be optimized because the dataset does not implement the AsGraphDefInternal() method needed to apply optimizations.

আপনি যদি প্রথম কর্মী দ্বারা লিখিত লগগুলি পুনরায় পরীক্ষা করেন, আপনি শিখবেন যে এটি সেই মডেলের প্রশিক্ষণে অংশগ্রহণ করেছিল:

cat job_0.log
2022-02-05 02:21:06.348503: E tensorflow/stream_executor/cuda/cuda_driver.cc:271] failed call to cuInit: CUDA_ERROR_NO_DEVICE: no CUDA-capable device is detected
2022-02-05 02:21:17.232316: W tensorflow/core/grappler/optimizers/data/auto_shard.cc:776] AUTO sharding policy will apply DATA sharding policy as it failed to apply FILE sharding policy because of the following reason: Found an unshardable source dataset: name: "TensorSliceDataset/_2"
op: "TensorSliceDataset"
input: "Placeholder/_0"
input: "Placeholder/_1"
attr {
  key: "Toutput_types"
  value {
    list {
      type: DT_FLOAT
      type: DT_INT64
    }
  }
}
attr {
  key: "_cardinality"
  value {
    i: 60000
  }
}
attr {
  key: "is_files"
  value {
    b: false
  }
}
attr {
  key: "metadata"
  value {
    s: "\n\024TensorSliceDataset:0"
  }
}
attr {
  key: "output_shapes"
  value {
    list {
      shape {
        dim {
          size: 28
        }
        dim {
          size: 28
        }
      }
      shape {
      }
    }
  }
}
experimental_type {
  type_id: TFT_PRODUCT
  args {
    type_id: TFT_DATASET
    args {
      type_id: TFT_PRODUCT
      args {
        type_id: TFT_TENSOR
        args {
          type_id: TFT_FLOAT
        }
      }
      args {
        type_id: TFT_TENSOR
        args {
          type_id: TFT_INT64
        }
      }
    }
  }
  args {
    type_id: TFT_DATASET
    args {
      type_id: TFT_PRODUCT
      args {
        type_id: TFT_TENSOR
        args {
          type_id: TFT_FLOAT
        }
      }
      args {
        type_id: TFT_TENSOR
        args {
          type_id: TFT_INT64
        }
      }
    }
  }
}

2022-02-05 02:21:17.457812: W tensorflow/core/framework/dataset.cc:768] Input of GeneratorDatasetOp::Dataset will not be optimized because the dataset does not implement the AsGraphDefInternal() method needed to apply optimizations.
Epoch 1/3
70/70 [==============================] - 6s 51ms/step - loss: 2.2766 - accuracy: 0.1722
Epoch 2/3
70/70 [==============================] - 3s 48ms/step - loss: 2.2172 - accuracy: 0.4157
Epoch 3/3
70/70 [==============================] - 3s 49ms/step - loss: 2.1471 - accuracy: 0.5901

আশ্চর্যজনকভাবে, এই টিউটোরিয়ালের শুরুতে পরীক্ষা চালানোর চেয়ে এটি ধীরগতিতে চলেছিল।

একটি একক মেশিনে একাধিক কর্মী চালানো শুধুমাত্র ওভারহেড যোগ করে।

এখানে লক্ষ্য ছিল প্রশিক্ষণের সময় উন্নত করা নয়, শুধুমাত্র বহু-কর্মী প্রশিক্ষণের একটি উদাহরণ দেওয়া।

# Delete the `TF_CONFIG`, and kill any background tasks so they don't affect the next section.
os.environ.pop('TF_CONFIG', None)
%killbgscripts
All background processes were killed.

গভীরভাবে বহু-কর্মী প্রশিক্ষণ

এখন পর্যন্ত, আপনি শিখেছেন কিভাবে একটি মৌলিক মাল্টি-ওয়ার্কার সেটআপ করতে হয়।

টিউটোরিয়ালের বাকি সময়, আপনি অন্যান্য বিষয় সম্পর্কে বিস্তারিতভাবে শিখবেন, যা বাস্তব ব্যবহারের ক্ষেত্রে কার্যকর বা গুরুত্বপূর্ণ হতে পারে।

ডেটাসেট শর্ডিং

মাল্টি-ওয়ার্কার ট্রেনিং-এ, কনভারজেন্স এবং পারফরম্যান্স নিশ্চিত করতে ডেটাসেট শার্ডিং প্রয়োজন।

পূর্ববর্তী বিভাগে উদাহরণটি tf.distribute.Strategy API দ্বারা প্রদত্ত ডিফল্ট অটোশার্ডিংয়ের উপর নির্ভর করে। আপনি tf.data.experimental.DistributeOptions-এর tf.data.experimental.DistributeOptions সেট করে tf.data.experimental.AutoShardPolicy নিয়ন্ত্রণ করতে পারেন।

স্বয়ংক্রিয়-শার্ডিং সম্পর্কে আরও জানতে, ডিস্ট্রিবিউটেড ইনপুট গাইড পড়ুন।

কিভাবে স্বয়ংক্রিয় শার্ডিং বন্ধ করতে হয় তার একটি দ্রুত উদাহরণ এখানে দেওয়া হল, যাতে প্রতিটি প্রতিলিপি প্রতিটি উদাহরণ প্রক্রিয়া করে ( প্রস্তাবিত নয় ):

options = tf.data.Options()
options.experimental_distribute.auto_shard_policy = tf.data.experimental.AutoShardPolicy.OFF

global_batch_size = 64
multi_worker_dataset = mnist_setup.mnist_dataset(batch_size=64)
dataset_no_auto_shard = multi_worker_dataset.with_options(options)

মূল্যায়ন

আপনি যদি Model.fitvalidation_data পাস করেন, তাহলে এটি প্রতিটি যুগের জন্য প্রশিক্ষণ এবং মূল্যায়নের মধ্যে বিকল্প হবে। validation_data গ্রহণের মূল্যায়ন একই কর্মীদের মধ্যে বিতরণ করা হয় এবং মূল্যায়নের ফলাফলগুলি একত্রিত এবং সমস্ত কর্মীদের জন্য উপলব্ধ।

প্রশিক্ষণের অনুরূপ, বৈধতা ডেটাসেট ফাইল স্তরে স্বয়ংক্রিয়ভাবে শার্ড হয়। আপনাকে বৈধতা ডেটাসেটে একটি বিশ্বব্যাপী ব্যাচের আকার সেট করতে হবে এবং validation_steps সেট করতে হবে।

একটি পুনরাবৃত্ত ডেটাসেট মূল্যায়নের জন্যও সুপারিশ করা হয়।

বিকল্পভাবে, আপনি অন্য একটি টাস্কও তৈরি করতে পারেন যা পর্যায়ক্রমে চেকপয়েন্ট পড়ে এবং মূল্যায়ন চালায়। এটিই এস্টিমেটর করে। কিন্তু এটি মূল্যায়ন করার জন্য একটি প্রস্তাবিত উপায় নয় এবং এইভাবে এর বিবরণ বাদ দেওয়া হয়েছে।

কর্মক্ষমতা

আপনার কাছে এখন একটি কেরাস মডেল রয়েছে যা MultiWorkerMirroredStrategy সহ একাধিক কর্মীদের মধ্যে চালানোর জন্য সেট আপ করা হয়েছে।

বহু-কর্মী প্রশিক্ষণের কর্মক্ষমতা পরিবর্তন করতে, আপনি নিম্নলিখিতগুলি চেষ্টা করতে পারেন:

  • tf.distribute.MultiWorkerMirroredStrategy একাধিক যৌথ যোগাযোগ বাস্তবায়ন প্রদান করে:

    • RING ক্রস-হোস্ট কমিউনিকেশন লেয়ার হিসেবে gRPC ব্যবহার করে রিং-ভিত্তিক সমষ্টি প্রয়োগ করে।
    • NCCL যৌথ বাস্তবায়নের জন্য NVIDIA কালেক্টিভ কমিউনিকেশন লাইব্রেরি ব্যবহার করে।
    • AUTO রানটাইমের পছন্দকে পিছিয়ে দেয়।

    যৌথ বাস্তবায়নের সর্বোত্তম পছন্দ নির্ভর করে GPU এর সংখ্যা, GPU-এর ধরন এবং ক্লাস্টারে নেটওয়ার্ক ইন্টারকানেক্টের উপর। স্বয়ংক্রিয় পছন্দ ওভাররাইড করতে, MultiWorkerMirroredStrategy এর কন্সট্রাক্টরের communication_options প্যারামিটার নির্দিষ্ট করুন। উদাহরণ স্বরূপ:

    communication_options=tf.distribute.experimental.CommunicationOptions(implementation=tf.distribute.experimental.CollectiveCommunication.NCCL)
    
  • যদি সম্ভব হয় tf.float এ ভেরিয়েবল কাস্ট করুন:

    • অফিসিয়াল ResNet মডেল এটি কিভাবে করা যেতে পারে তার একটি উদাহরণ অন্তর্ভুক্ত করে।

দোষ সহনশীলতা

সিঙ্ক্রোনাস প্রশিক্ষণে, ক্লাস্টার ব্যর্থ হবে যদি একজন কর্মী ব্যর্থ হয় এবং কোনো ব্যর্থতা-পুনরুদ্ধারের ব্যবস্থা বিদ্যমান না থাকে।

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

যখন একজন কর্মী অনুপলব্ধ হয়ে যায়, তখন অন্যান্য কর্মীরা ব্যর্থ হবে (সম্ভবত সময় শেষ হওয়ার পরে)। এই ধরনের ক্ষেত্রে, অনুপলব্ধ কর্মীকে পুনরায় চালু করতে হবে, সেইসাথে অন্যান্য কর্মী যারা ব্যর্থ হয়েছে।

মডেলচেকপয়েন্ট কলব্যাক

ModelCheckpoint কলব্যাক আর দোষ সহনশীলতা কার্যকারিতা প্রদান করে না, দয়া করে পরিবর্তে BackupAndRestore কলব্যাক ব্যবহার করুন।

ModelCheckpoint কলব্যাক এখনও চেকপয়েন্ট সংরক্ষণ করতে ব্যবহার করা যেতে পারে। তবে এর সাথে, যদি প্রশিক্ষণ বাধাগ্রস্ত হয় বা সফলভাবে শেষ হয়, চেকপয়েন্ট থেকে প্রশিক্ষণ চালিয়ে যাওয়ার জন্য, ব্যবহারকারী নিজেই মডেলটি লোড করার জন্য দায়ী।

ঐচ্ছিকভাবে ব্যবহারকারী ModelCheckpoint কলব্যাকের বাইরে মডেল/ওজন সংরক্ষণ এবং পুনরুদ্ধার করতে বেছে নিতে পারেন।

মডেল সংরক্ষণ এবং লোড হচ্ছে

model.save বা tf.saved_model.save ব্যবহার করে আপনার মডেল সংরক্ষণ করতে, সংরক্ষণের গন্তব্য প্রতিটি কর্মীর জন্য আলাদা হতে হবে।

  • অ-প্রধান কর্মীদের জন্য, আপনাকে মডেলটিকে একটি অস্থায়ী ডিরেক্টরিতে সংরক্ষণ করতে হবে।
  • প্রধানের জন্য, আপনাকে প্রদত্ত মডেল ডিরেক্টরিতে সংরক্ষণ করতে হবে।

একাধিক কর্মী একই অবস্থানে লেখার চেষ্টা করার ফলে ত্রুটিগুলি প্রতিরোধ করতে কর্মীর অস্থায়ী ডিরেক্টরিগুলি অনন্য হতে হবে।

সমস্ত ডিরেক্টরিতে সংরক্ষিত মডেলটি অভিন্ন, এবং সাধারণত শুধুমাত্র প্রধান দ্বারা সংরক্ষিত মডেলটি পুনরুদ্ধার বা পরিবেশনের জন্য উল্লেখ করা উচিত।

আপনার কিছু ক্লিনআপ যুক্তি থাকা উচিত যা আপনার প্রশিক্ষণ শেষ হয়ে গেলে কর্মীদের দ্বারা তৈরি অস্থায়ী ডিরেক্টরিগুলি মুছে দেয়।

একই সময়ে প্রধান এবং কর্মীদের সংরক্ষণ করার কারণ হল আপনি চেকপয়েন্টিংয়ের সময় ভেরিয়েবলগুলিকে একত্রিত করতে পারেন যার জন্য প্রধান এবং কর্মীদের উভয়েরই কমিউনিকেশন প্রোটোকল কমিউনিকেশনে অংশগ্রহণ করতে হবে। অন্যদিকে, প্রধান এবং কর্মীদের একই মডেল ডিরেক্টরিতে সংরক্ষণ করতে দিলে বিতর্কের কারণে ত্রুটি দেখা দেবে।

MultiWorkerMirroredStrategy ব্যবহার করে, প্রোগ্রামটি প্রতিটি কর্মীর উপর চালিত হয়, এবং বর্তমান কর্মী প্রধান কিনা তা জানার জন্য, এটি ক্লাস্টার সমাধানকারী অবজেক্টের সুবিধা গ্রহণ করে যার বৈশিষ্ট্য রয়েছে task_type এবং task_id :

  • task_type আপনাকে বলে বর্তমান কাজ কি (যেমন 'worker' )।
  • task_id আপনাকে কর্মীর সনাক্তকারী বলে।
  • task_id == 0 সহ কর্মীকে প্রধান কর্মী হিসাবে মনোনীত করা হয়েছে।

নীচের কোড স্নিপেটে, write_filepath ফাংশন লেখার জন্য ফাইল পাথ প্রদান করে, যা শ্রমিকের task_id এর উপর নির্ভর করে:

  • প্রধান কর্মীর জন্য ( task_id == 0 সহ), এটি মূল ফাইল পাথে লেখে।
  • অন্যান্য কর্মীদের জন্য, এটি একটি অস্থায়ী ডিরেক্টরি তৈরি করে — temp_dir — যাতে লেখার জন্য ডিরেক্টরি পাথে task_id থাকে:
model_path = '/tmp/keras-model'

def _is_chief(task_type, task_id):
  # Note: there are two possible `TF_CONFIG` configuration.
  #   1) In addition to `worker` tasks, a `chief` task type is use;
  #      in this case, this function should be modified to
  #      `return task_type == 'chief'`.
  #   2) Only `worker` task type is used; in this case, worker 0 is
  #      regarded as the chief. The implementation demonstrated here
  #      is for this case.
  # For the purpose of this Colab section, the `task_type is None` case
  # is added because it is effectively run with only a single worker.
  return (task_type == 'worker' and task_id == 0) or task_type is None

def _get_temp_dir(dirpath, task_id):
  base_dirpath = 'workertemp_' + str(task_id)
  temp_dir = os.path.join(dirpath, base_dirpath)
  tf.io.gfile.makedirs(temp_dir)
  return temp_dir

def write_filepath(filepath, task_type, task_id):
  dirpath = os.path.dirname(filepath)
  base = os.path.basename(filepath)
  if not _is_chief(task_type, task_id):
    dirpath = _get_temp_dir(dirpath, task_id)
  return os.path.join(dirpath, base)

task_type, task_id = (strategy.cluster_resolver.task_type,
                      strategy.cluster_resolver.task_id)
write_model_path = write_filepath(model_path, task_type, task_id)

এর সাথে, আপনি এখন সংরক্ষণ করতে প্রস্তুত:

multi_worker_model.save(write_model_path)
2022-02-05 02:21:31.809502: 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: /tmp/keras-model/assets
INFO:tensorflow:Assets written to: /tmp/keras-model/assets

উপরে বর্ণিত হিসাবে, পরবর্তীতে মডেলটি শুধুমাত্র পাথ প্রধান থেকে লোড করা উচিত যাতে সংরক্ষিত হয়, তাই চলুন অপ্রধান কর্মীরা সংরক্ষিত অস্থায়ীকে সরিয়ে ফেলি:

if not _is_chief(task_type, task_id):
  tf.io.gfile.rmtree(os.path.dirname(write_model_path))

এখন, যখন লোড করার সময়, আসুন সুবিধাজনক tf.keras.models.load_model API ব্যবহার করি এবং পরবর্তী কাজ চালিয়ে যাই।

এখানে, অনুমান করুন শুধুমাত্র একক কর্মী ব্যবহার করে প্রশিক্ষণ লোড করতে এবং চালিয়ে যেতে, সেক্ষেত্রে আপনি tf.keras.models.load_model কে অন্য কোনো strategy.scope() এর মধ্যে কল করবেন না (মনে রাখবেন যে strategy = tf.distribute.MultiWorkerMirroredStrategy() , যেমনটি আগে সংজ্ঞায়িত করা হয়েছে ):

loaded_model = tf.keras.models.load_model(model_path)

# Now that the model is restored, and can continue with the training.
loaded_model.fit(single_worker_dataset, epochs=2, steps_per_epoch=20)
Epoch 1/2
20/20 [==============================] - 1s 12ms/step - loss: 2.2949 - accuracy: 0.0492
Epoch 2/2
20/20 [==============================] - 0s 13ms/step - loss: 2.2680 - accuracy: 0.0773
<keras.callbacks.History at 0x7f6669989750>

চেকপয়েন্ট সংরক্ষণ এবং পুনঃস্থাপন

অন্যদিকে, চেকপয়েন্টিং আপনাকে আপনার মডেলের ওজন সংরক্ষণ করতে এবং পুরো মডেলটিকে সংরক্ষণ না করেই সেগুলি পুনরুদ্ধার করতে দেয়।

এখানে, আপনি একটি tf.train.Checkpoint তৈরি করবেন যা মডেলটিকে ট্র্যাক করে, যা tf.train.CheckpointManager দ্বারা পরিচালিত হয়, যাতে শুধুমাত্র সর্বশেষ চেকপয়েন্টটি সংরক্ষিত থাকে:

checkpoint_dir = '/tmp/ckpt'

checkpoint = tf.train.Checkpoint(model=multi_worker_model)
write_checkpoint_dir = write_filepath(checkpoint_dir, task_type, task_id)
checkpoint_manager = tf.train.CheckpointManager(
    checkpoint, directory=write_checkpoint_dir, max_to_keep=1)

একবার CheckpointManager সেট আপ হয়ে গেলে, আপনি এখন অ-প্রধান কর্মীরা যে চেকপয়েন্টগুলি সংরক্ষণ করেছিলেন সেগুলি সংরক্ষণ এবং সরাতে প্রস্তুত:

checkpoint_manager.save()
if not _is_chief(task_type, task_id):
  tf.io.gfile.rmtree(write_checkpoint_dir)

এখন, যখন আপনাকে মডেলটি পুনরুদ্ধার করতে হবে, আপনি সুবিধাজনক tf.train.latest_checkpoint ফাংশন ব্যবহার করে সংরক্ষিত সর্বশেষ চেকপয়েন্টটি খুঁজে পেতে পারেন। চেকপয়েন্ট পুনরুদ্ধার করার পরে, আপনি প্রশিক্ষণ চালিয়ে যেতে পারেন।

latest_checkpoint = tf.train.latest_checkpoint(checkpoint_dir)
checkpoint.restore(latest_checkpoint)
multi_worker_model.fit(multi_worker_dataset, epochs=2, steps_per_epoch=20)
2022-02-05 02:21:33.584421: W tensorflow/core/grappler/optimizers/data/auto_shard.cc:776] AUTO sharding policy will apply DATA sharding policy as it failed to apply FILE sharding policy because of the following reason: Found an unshardable source dataset: name: "TensorSliceDataset/_2"
op: "TensorSliceDataset"
input: "Placeholder/_0"
input: "Placeholder/_1"
attr {
  key: "Toutput_types"
  value {
    list {
      type: DT_FLOAT
      type: DT_INT64
    }
  }
}
attr {
  key: "_cardinality"
  value {
    i: 60000
  }
}
attr {
  key: "is_files"
  value {
    b: false
  }
}
attr {
  key: "metadata"
  value {
    s: "\n\024TensorSliceDataset:5"
  }
}
attr {
  key: "output_shapes"
  value {
    list {
      shape {
        dim {
          size: 28
        }
        dim {
          size: 28
        }
      }
      shape {
      }
    }
  }
}
experimental_type {
  type_id: TFT_PRODUCT
  args {
    type_id: TFT_DATASET
    args {
      type_id: TFT_PRODUCT
      args {
        type_id: TFT_TENSOR
        args {
          type_id: TFT_FLOAT
        }
      }
      args {
        type_id: TFT_TENSOR
        args {
          type_id: TFT_INT64
        }
      }
    }
  }
  args {
    type_id: TFT_DATASET
    args {
      type_id: TFT_PRODUCT
      args {
        type_id: TFT_TENSOR
        args {
          type_id: TFT_FLOAT
        }
      }
      args {
        type_id: TFT_TENSOR
        args {
          type_id: TFT_INT64
        }
      }
    }
  }
}
Epoch 1/2
2022-02-05 02:21:33.803317: W tensorflow/core/framework/dataset.cc:768] Input of GeneratorDatasetOp::Dataset will not be optimized because the dataset does not implement the AsGraphDefInternal() method needed to apply optimizations.
20/20 [==============================] - 3s 13ms/step - loss: 2.2970 - accuracy: 0.0547
Epoch 2/2
20/20 [==============================] - 0s 13ms/step - loss: 2.2690 - accuracy: 0.0938
<keras.callbacks.History at 0x7f6669589850>

ব্যাকআপ এবং কলব্যাক পুনরুদ্ধার করুন

tf.keras.callbacks.BackupAndRestore কলব্যাক BackupAndRestorebackup_dir আর্গুমেন্টের অধীনে একটি অস্থায়ী চেকপয়েন্ট ফাইলে মডেল এবং বর্তমান যুগের নম্বর ব্যাক আপ করে ত্রুটি সহনশীলতা কার্যকারিতা প্রদান করে। এটি প্রতিটি যুগের শেষে করা হয়।

একবার কাজগুলি বাধাগ্রস্ত হয়ে পুনরায় চালু হলে, কলব্যাক শেষ চেকপয়েন্টটি পুনরুদ্ধার করে এবং বাধাপ্রাপ্ত যুগের শুরু থেকে প্রশিক্ষণ চলতে থাকে। বাধার আগে অসমাপ্ত যুগে ইতিমধ্যে সম্পন্ন করা যেকোন আংশিক প্রশিক্ষণকে ফেলে দেওয়া হবে, যাতে এটি চূড়ান্ত মডেল অবস্থাকে প্রভাবিত না করে।

এটি ব্যবহার করতে, Model.fit কলে tf.keras.callbacks.BackupAndRestore এর একটি উদাহরণ প্রদান করুন।

MultiWorkerMirroredStrategy এর মাধ্যমে, একজন কর্মী বাধাগ্রস্ত হলে, বাধাপ্রাপ্ত কর্মী পুনরায় চালু না হওয়া পর্যন্ত পুরো ক্লাস্টারটি বিরতি দেয়। অন্যান্য কর্মীরাও পুনরায় চালু হবে এবং বাধাপ্রাপ্ত কর্মী ক্লাস্টারে পুনরায় যোগদান করবে। তারপরে, প্রতিটি কর্মী চেকপয়েন্ট ফাইলটি পড়ে যা পূর্বে সংরক্ষিত ছিল এবং এর আগের অবস্থা তুলে নেয়, যার ফলে ক্লাস্টারটিকে সিঙ্কে ফিরে যেতে দেয়। তারপর, প্রশিক্ষণ চলতে থাকে।

BackupAndRestore কলব্যাক CheckpointManager ম্যানেজার ব্যবহার করে প্রশিক্ষণের অবস্থা সংরক্ষণ এবং পুনরুদ্ধার করতে, যা চেকপয়েন্ট নামক একটি ফাইল তৈরি করে যা বিদ্যমান চেকপয়েন্টগুলিকে সর্বশেষের সাথে একসাথে ট্র্যাক করে। এই কারণে, নাম সংঘর্ষ এড়াতে backup_dir অন্য চেকপয়েন্ট সংরক্ষণ করার জন্য পুনরায় ব্যবহার করা উচিত নয়।

বর্তমানে, BackupAndRestore কলব্যাক কোনো কৌশল ছাড়াই একক-কর্মী প্রশিক্ষণকে সমর্থন করে — MirroredStrategy —এবং MultiWorkerMirroredStrategy সাথে বহু-কর্মী প্রশিক্ষণ।

মাল্টি-কর্মী প্রশিক্ষণ এবং একক-কর্মী প্রশিক্ষণ উভয়ের জন্য নীচে দুটি উদাহরণ রয়েছে:

# Multi-worker training with `MultiWorkerMirroredStrategy`
# and the `BackupAndRestore` callback.

callbacks = [tf.keras.callbacks.BackupAndRestore(backup_dir='/tmp/backup')]
with strategy.scope():
  multi_worker_model = mnist_setup.build_and_compile_cnn_model()
multi_worker_model.fit(multi_worker_dataset,
                       epochs=3,
                       steps_per_epoch=70,
                       callbacks=callbacks)
2022-02-05 02:21:37.063622: W tensorflow/core/grappler/optimizers/data/auto_shard.cc:776] AUTO sharding policy will apply DATA sharding policy as it failed to apply FILE sharding policy because of the following reason: Found an unshardable source dataset: name: "TensorSliceDataset/_2"
op: "TensorSliceDataset"
input: "Placeholder/_0"
input: "Placeholder/_1"
attr {
  key: "Toutput_types"
  value {
    list {
      type: DT_FLOAT
      type: DT_INT64
    }
  }
}
attr {
  key: "_cardinality"
  value {
    i: 60000
  }
}
attr {
  key: "is_files"
  value {
    b: false
  }
}
attr {
  key: "metadata"
  value {
    s: "\n\024TensorSliceDataset:5"
  }
}
attr {
  key: "output_shapes"
  value {
    list {
      shape {
        dim {
          size: 28
        }
        dim {
          size: 28
        }
      }
      shape {
      }
    }
  }
}
experimental_type {
  type_id: TFT_PRODUCT
  args {
    type_id: TFT_DATASET
    args {
      type_id: TFT_PRODUCT
      args {
        type_id: TFT_TENSOR
        args {
          type_id: TFT_FLOAT
        }
      }
      args {
        type_id: TFT_TENSOR
        args {
          type_id: TFT_INT64
        }
      }
    }
  }
  args {
    type_id: TFT_DATASET
    args {
      type_id: TFT_PRODUCT
      args {
        type_id: TFT_TENSOR
        args {
          type_id: TFT_FLOAT
        }
      }
      args {
        type_id: TFT_TENSOR
        args {
          type_id: TFT_INT64
        }
      }
    }
  }
}
Epoch 1/3
70/70 [==============================] - 3s 13ms/step - loss: 2.2667 - accuracy: 0.2123
Epoch 2/3
70/70 [==============================] - 1s 13ms/step - loss: 2.1925 - accuracy: 0.4509
Epoch 3/3
70/70 [==============================] - 1s 13ms/step - loss: 2.1057 - accuracy: 0.5614
<keras.callbacks.History at 0x7f6669555d90>

আপনি যদি BackupAndRestore backup_dir ডিরেক্টরি পরিদর্শন করেন, আপনি কিছু অস্থায়ীভাবে জেনারেট করা চেকপয়েন্ট ফাইল লক্ষ্য করতে পারেন। পূর্বে হারিয়ে যাওয়া দৃষ্টান্তগুলি পুনরুদ্ধার করার জন্য এই ফাইলগুলি প্রয়োজন, এবং আপনার প্রশিক্ষণ সফলভাবে প্রস্থান করার পরে Model.fit এর শেষে লাইব্রেরি দ্বারা সেগুলি সরানো হবে৷

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

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