প্রশিক্ষণ চেকপয়েন্ট

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

"একটি টেনসরফ্লো মডেল সংরক্ষণ" বাক্যাংশটি সাধারণত দুটি জিনিসের মধ্যে একটিকে বোঝায়:

  1. চেকপয়েন্ট, বা
  2. সংরক্ষিত মডেল।

চেকপয়েন্ট একটি মডেল দ্বারা ব্যবহৃত সমস্ত পরামিতি ( tf.Variable . পরিবর্তনশীল বস্তু) এর সঠিক মান ক্যাপচার করে। চেকপয়েন্টগুলিতে মডেল দ্বারা সংজ্ঞায়িত গণনার কোনও বিবরণ থাকে না এবং এইভাবে সাধারণত শুধুমাত্র তখনই উপযোগী হয় যখন সংরক্ষিত প্যারামিটার মানগুলি ব্যবহার করবে এমন উত্স কোড উপলব্ধ থাকে৷

অন্যদিকে SavedModel বিন্যাসে প্যারামিটার মান (চেকপয়েন্ট) ছাড়াও মডেল দ্বারা সংজ্ঞায়িত গণনার একটি ক্রমিক বিবরণ অন্তর্ভুক্ত রয়েছে। এই ফর্ম্যাটে মডেলগুলি মডেল তৈরি করা সোর্স কোড থেকে স্বাধীন। এইভাবে এগুলি TensorFlow Serving, TensorFlow Lite, TensorFlow.js, বা অন্যান্য প্রোগ্রামিং ভাষায় (C, C++, Java, Go, Rust, C# ইত্যাদি। TensorFlow API) এর মাধ্যমে স্থাপনের জন্য উপযুক্ত।

এই গাইড চেকপয়েন্ট লেখা এবং পড়ার জন্য API গুলি কভার করে৷

সেটআপ

import tensorflow as tf
class Net(tf.keras.Model):
  """A simple linear model."""

  def __init__(self):
    super(Net, self).__init__()
    self.l1 = tf.keras.layers.Dense(5)

  def call(self, x):
    return self.l1(x)
net = Net()

tf.keras প্রশিক্ষণ API থেকে সংরক্ষণ করা হচ্ছে

সংরক্ষণ এবং পুনরুদ্ধারের বিষয়ে tf.keras নির্দেশিকা দেখুন।

tf.keras.Model.save_weights একটি টেনসরফ্লো চেকপয়েন্ট সংরক্ষণ করে।

net.save_weights('easy_checkpoint')

চেকপয়েন্ট লেখা

একটি tf.Variable মডেলের স্থায়ী অবস্থা tf. পরিবর্তনশীল বস্তুতে সংরক্ষিত হয়। এগুলি সরাসরি তৈরি করা যেতে পারে, তবে প্রায়শই tf.keras.layers বা tf.keras.Model এর মতো উচ্চ-স্তরের API-এর মাধ্যমে তৈরি করা হয়।

ভেরিয়েবলগুলি পরিচালনা করার সবচেয়ে সহজ উপায় হল সেগুলিকে পাইথন অবজেক্টের সাথে সংযুক্ত করা, তারপর সেই বস্তুগুলিকে উল্লেখ করা।

tf.train.Checkpoint , tf.keras.layers.Layer , এবং tf.keras.Model এর সাবক্লাসগুলি স্বয়ংক্রিয়ভাবে তাদের বৈশিষ্ট্যগুলির জন্য নির্ধারিত ভেরিয়েবলগুলিকে ট্র্যাক করে৷ নিম্নলিখিত উদাহরণটি একটি সাধারণ রৈখিক মডেল তৈরি করে, তারপরে চেকপয়েন্টগুলি লেখে যা মডেলের সমস্ত ভেরিয়েবলের মান ধারণ করে।

আপনি Model.save_weights দিয়ে সহজেই একটি মডেল-চেকপয়েন্ট সংরক্ষণ করতে পারেন।

ম্যানুয়াল চেকপয়েন্টিং

সেটআপ

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

def toy_dataset():
  inputs = tf.range(10.)[:, None]
  labels = inputs * 5. + tf.range(5.)[None, :]
  return tf.data.Dataset.from_tensor_slices(
    dict(x=inputs, y=labels)).repeat().batch(2)
def train_step(net, example, optimizer):
  """Trains `net` on `example` using `optimizer`."""
  with tf.GradientTape() as tape:
    output = net(example['x'])
    loss = tf.reduce_mean(tf.abs(output - example['y']))
  variables = net.trainable_variables
  gradients = tape.gradient(loss, variables)
  optimizer.apply_gradients(zip(gradients, variables))
  return loss

চেকপয়েন্ট অবজেক্ট তৈরি করুন

ম্যানুয়ালি একটি চেকপয়েন্ট তৈরি করতে একটি tf.train.Checkpoint অবজেক্ট ব্যবহার করুন, যেখানে আপনি যে বস্তুগুলিকে চেকপয়েন্ট করতে চান তা অবজেক্টের বৈশিষ্ট্য হিসাবে সেট করা আছে।

একটি tf.train.CheckpointManager একাধিক চেকপয়েন্ট পরিচালনার জন্যও সহায়ক হতে পারে।

opt = tf.keras.optimizers.Adam(0.1)
dataset = toy_dataset()
iterator = iter(dataset)
ckpt = tf.train.Checkpoint(step=tf.Variable(1), optimizer=opt, net=net, iterator=iterator)
manager = tf.train.CheckpointManager(ckpt, './tf_ckpts', max_to_keep=3)

ট্রেন এবং মডেল চেকপয়েন্ট

নিম্নলিখিত প্রশিক্ষণ লুপ মডেল এবং একটি অপ্টিমাইজারের একটি উদাহরণ তৈরি করে, তারপর তাদের একটি tf.train.Checkpoint অবজেক্টে একত্রিত করে। এটি ডেটার প্রতিটি ব্যাচের একটি লুপে প্রশিক্ষণের ধাপকে কল করে এবং পর্যায়ক্রমে ডিস্কে চেকপয়েন্টগুলি লেখে।

def train_and_checkpoint(net, manager):
  ckpt.restore(manager.latest_checkpoint)
  if manager.latest_checkpoint:
    print("Restored from {}".format(manager.latest_checkpoint))
  else:
    print("Initializing from scratch.")

  for _ in range(50):
    example = next(iterator)
    loss = train_step(net, example, opt)
    ckpt.step.assign_add(1)
    if int(ckpt.step) % 10 == 0:
      save_path = manager.save()
      print("Saved checkpoint for step {}: {}".format(int(ckpt.step), save_path))
      print("loss {:1.2f}".format(loss.numpy()))
train_and_checkpoint(net, manager)
Initializing from scratch.
Saved checkpoint for step 10: ./tf_ckpts/ckpt-1
loss 31.27
Saved checkpoint for step 20: ./tf_ckpts/ckpt-2
loss 24.68
Saved checkpoint for step 30: ./tf_ckpts/ckpt-3
loss 18.12
Saved checkpoint for step 40: ./tf_ckpts/ckpt-4
loss 11.65
Saved checkpoint for step 50: ./tf_ckpts/ckpt-5
loss 5.39

পুনরুদ্ধার করুন এবং প্রশিক্ষণ চালিয়ে যান

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

opt = tf.keras.optimizers.Adam(0.1)
net = Net()
dataset = toy_dataset()
iterator = iter(dataset)
ckpt = tf.train.Checkpoint(step=tf.Variable(1), optimizer=opt, net=net, iterator=iterator)
manager = tf.train.CheckpointManager(ckpt, './tf_ckpts', max_to_keep=3)

train_and_checkpoint(net, manager)
Restored from ./tf_ckpts/ckpt-5
Saved checkpoint for step 60: ./tf_ckpts/ckpt-6
loss 1.50
Saved checkpoint for step 70: ./tf_ckpts/ckpt-7
loss 1.27
Saved checkpoint for step 80: ./tf_ckpts/ckpt-8
loss 0.56
Saved checkpoint for step 90: ./tf_ckpts/ckpt-9
loss 0.70
Saved checkpoint for step 100: ./tf_ckpts/ckpt-10
loss 0.35

tf.train.CheckpointManager অবজেক্ট পুরানো চেকপয়েন্ট মুছে দেয়। উপরে এটি শুধুমাত্র তিনটি সাম্প্রতিক চেকপয়েন্ট রাখার জন্য কনফিগার করা হয়েছে।

print(manager.checkpoints)  # List the three remaining checkpoints
['./tf_ckpts/ckpt-8', './tf_ckpts/ckpt-9', './tf_ckpts/ckpt-10']

এই পথগুলি, যেমন './tf_ckpts/ckpt-10' , ডিস্কের ফাইল নয়৷ পরিবর্তে এগুলি একটি index ফাইল এবং এক বা একাধিক ডেটা ফাইলের উপসর্গ যা পরিবর্তনশীল মান ধারণ করে। এই উপসর্গগুলিকে একটি একক checkpoint ফাইলে ( './tf_ckpts/checkpoint' ) একসাথে গোষ্ঠীবদ্ধ করা হয় যেখানে CheckpointManager ম্যানেজার তার অবস্থা সংরক্ষণ করে।

ls ./tf_ckpts
checkpoint           ckpt-8.data-00000-of-00001  ckpt-9.index
ckpt-10.data-00000-of-00001  ckpt-8.index
ckpt-10.index            ckpt-9.data-00000-of-00001

লোডিং মেকানিক্স

TensorFlow ভেরিয়েবলকে চেকপয়েন্টেড মানগুলির সাথে মেলে, নামযুক্ত প্রান্ত সহ একটি নির্দেশিত গ্রাফ অতিক্রম করে, বস্তুটি লোড করা থেকে শুরু করে। প্রান্তের নামগুলি সাধারণত বস্তুর বৈশিষ্ট্যের নাম থেকে আসে, উদাহরণস্বরূপ self.l1 = tf.keras.layers.Dense(5)"l1"tf.train.Checkpoint তার কীওয়ার্ড আর্গুমেন্টের নাম ব্যবহার করে, যেমন tf.train.Checkpoint(step=...) এর "step" তে।

উপরের উদাহরণ থেকে নির্ভরতা গ্রাফটি এইরকম দেখাচ্ছে:

উদাহরণ প্রশিক্ষণ লুপের জন্য নির্ভরতা গ্রাফের ভিজ্যুয়ালাইজেশন

অপ্টিমাইজারটি লাল, নিয়মিত ভেরিয়েবলগুলি নীল রঙে এবং অপ্টিমাইজার স্লট ভেরিয়েবলগুলি কমলা রঙে৷ অন্যান্য নোডগুলি-উদাহরণস্বরূপ, tf.train.Checkpoint এর প্রতিনিধিত্ব করে—কালো রঙে।

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

একটি tf.train.Checkpoint অবজেক্টে restore কল করা অনুরোধকৃত পুনরুদ্ধারকে সারিবদ্ধ করে, Checkpoint অবজেক্ট থেকে একটি মিলিত পথ পাওয়া মাত্রই পরিবর্তনশীল মান পুনরুদ্ধার করে। উদাহরণস্বরূপ, আপনি নেটওয়ার্ক এবং স্তরের মাধ্যমে এটিতে একটি পথ পুনর্গঠন করে উপরে সংজ্ঞায়িত মডেল থেকে শুধুমাত্র পক্ষপাত লোড করতে পারেন।

to_restore = tf.Variable(tf.zeros([5]))
print(to_restore.numpy())  # All zeros
fake_layer = tf.train.Checkpoint(bias=to_restore)
fake_net = tf.train.Checkpoint(l1=fake_layer)
new_root = tf.train.Checkpoint(net=fake_net)
status = new_root.restore(tf.train.latest_checkpoint('./tf_ckpts/'))
print(to_restore.numpy())  # This gets the restored value.
[0. 0. 0. 0. 0.]
[2.7209885 3.7588918 4.421351  4.1466427 4.0712557]

এই নতুন অবজেক্টের জন্য নির্ভরতা গ্রাফ হল আপনার উপরে লেখা বৃহত্তর চেকপয়েন্টের অনেক ছোট সাবগ্রাফ। এটি শুধুমাত্র পক্ষপাত এবং একটি সংরক্ষণ কাউন্টার অন্তর্ভুক্ত করে যা tf.train.Checkpoint চেকপয়েন্ট সংখ্যা করতে ব্যবহার করে।

পক্ষপাত ভেরিয়েবলের জন্য একটি সাবগ্রাফের ভিজ্যুয়ালাইজেশন

restore একটি স্ট্যাটাস অবজেক্ট প্রদান করে, যার ঐচ্ছিক দাবি রয়েছে। নতুন Checkpoint তৈরি করা সমস্ত বস্তু পুনরুদ্ধার করা হয়েছে, তাই status.assert_existing_objects_matched পাস।

status.assert_existing_objects_matched()
<tensorflow.python.training.tracking.util.CheckpointLoadStatus at 0x7f93a075b9d0>

লেয়ার কার্নেল এবং অপ্টিমাইজারের ভেরিয়েবল সহ চেকপয়েন্টে অনেকগুলি বস্তু রয়েছে যা মেলেনি। status.assert_consumed শুধুমাত্র পাস হয় যদি চেকপয়েন্ট এবং প্রোগ্রাম ঠিক মেলে, এবং এখানে একটি ব্যতিক্রম নিক্ষেপ করবে।

বিলম্বিত পুনঃস্থাপন

টেনসরফ্লোতে Layer অবজেক্টগুলি ভেরিয়েবল তৈরিকে তাদের প্রথম কলে পিছিয়ে দিতে পারে, যখন ইনপুট আকার উপলব্ধ থাকে। উদাহরণস্বরূপ, একটি Dense স্তরের কার্নেলের আকৃতি লেয়ারের ইনপুট এবং আউটপুট আকার উভয়ের উপর নির্ভর করে এবং তাই কনস্ট্রাক্টর আর্গুমেন্ট হিসাবে প্রয়োজনীয় আউটপুট আকৃতিটি নিজেই ভেরিয়েবল তৈরি করার জন্য যথেষ্ট তথ্য নয়। যেহেতু একটি Layer কল করলে ভেরিয়েবলের মানও পড়ে, তাই ভেরিয়েবলের সৃষ্টি এবং এর প্রথম ব্যবহারের মধ্যে একটি পুনরুদ্ধার ঘটতে হবে।

এই বাগধারাটিকে সমর্থন করার জন্য, tf.train.Checkpoint পুনরুদ্ধারগুলিকে পিছিয়ে দেয় যেগুলির এখনও একটি মিল ভেরিয়েবল নেই৷

deferred_restore = tf.Variable(tf.zeros([1, 5]))
print(deferred_restore.numpy())  # Not restored; still zeros
fake_layer.kernel = deferred_restore
print(deferred_restore.numpy())  # Restored
[[0. 0. 0. 0. 0.]]
[[4.5854754 4.607731  4.649179  4.8474874 5.121    ]]

ম্যানুয়ালি চেকপয়েন্ট পরিদর্শন

tf.train.load_checkpoint একটি CheckpointReader প্রদান করে যা চেকপয়েন্ট বিষয়বস্তুতে নিম্ন স্তরের অ্যাক্সেস দেয়। এতে প্রতিটি ভেরিয়েবলের কী থেকে চেকপয়েন্টের প্রতিটি ভেরিয়েবলের আকৃতি এবং টাইপ পর্যন্ত ম্যাপিং রয়েছে। একটি ভেরিয়েবলের কী হল এর অবজেক্ট পাথ, যেমন উপরে প্রদর্শিত গ্রাফে।

reader = tf.train.load_checkpoint('./tf_ckpts/')
shape_from_key = reader.get_variable_to_shape_map()
dtype_from_key = reader.get_variable_to_dtype_map()

sorted(shape_from_key.keys())
['_CHECKPOINTABLE_OBJECT_GRAPH',
 'iterator/.ATTRIBUTES/ITERATOR_STATE',
 'net/l1/bias/.ATTRIBUTES/VARIABLE_VALUE',
 'net/l1/bias/.OPTIMIZER_SLOT/optimizer/m/.ATTRIBUTES/VARIABLE_VALUE',
 'net/l1/bias/.OPTIMIZER_SLOT/optimizer/v/.ATTRIBUTES/VARIABLE_VALUE',
 'net/l1/kernel/.ATTRIBUTES/VARIABLE_VALUE',
 'net/l1/kernel/.OPTIMIZER_SLOT/optimizer/m/.ATTRIBUTES/VARIABLE_VALUE',
 'net/l1/kernel/.OPTIMIZER_SLOT/optimizer/v/.ATTRIBUTES/VARIABLE_VALUE',
 'optimizer/beta_1/.ATTRIBUTES/VARIABLE_VALUE',
 'optimizer/beta_2/.ATTRIBUTES/VARIABLE_VALUE',
 'optimizer/decay/.ATTRIBUTES/VARIABLE_VALUE',
 'optimizer/iter/.ATTRIBUTES/VARIABLE_VALUE',
 'optimizer/learning_rate/.ATTRIBUTES/VARIABLE_VALUE',
 'save_counter/.ATTRIBUTES/VARIABLE_VALUE',
 'step/.ATTRIBUTES/VARIABLE_VALUE']

সুতরাং আপনি যদি net.l1.kernel এর মান সম্পর্কে আগ্রহী হন তবে আপনি নিম্নলিখিত কোডের সাথে মান পেতে পারেন:

key = 'net/l1/kernel/.ATTRIBUTES/VARIABLE_VALUE'

print("Shape:", shape_from_key[key])
print("Dtype:", dtype_from_key[key].name)
Shape: [1, 5]
Dtype: float32

এটি একটি get_tensor পদ্ধতিও প্রদান করে যা আপনাকে একটি ভেরিয়েবলের মান পরিদর্শন করতে দেয়:

reader.get_tensor(key)
array([[4.5854754, 4.607731 , 4.649179 , 4.8474874, 5.121    ]],
      dtype=float32)

অবজেক্ট ট্র্যাকিং

চেকপয়েন্টগুলি tf.Variable . ভ্যারিয়েবল অবজেক্টের মানগুলি সংরক্ষণ এবং পুনরুদ্ধার করে যে কোনও পরিবর্তনশীল বা ট্র্যাকযোগ্য বস্তুকে তার একটি বৈশিষ্ট্যে সেট করে "ট্র্যাকিং" করে। একটি সংরক্ষণ চালানোর সময়, ভেরিয়েবলগুলি পৌঁছানো যায় এমন সমস্ত ট্র্যাক করা অবজেক্ট থেকে পুনরাবৃত্তিমূলকভাবে সংগ্রহ করা হয়।

self.l1 = tf.keras.layers.Dense(5) মতো সরাসরি অ্যাট্রিবিউট অ্যাসাইনমেন্টের মতো, অ্যাট্রিবিউটগুলিতে তালিকা এবং অভিধান অ্যাসাইন করা তাদের বিষয়বস্তু ট্র্যাক করবে।

save = tf.train.Checkpoint()
save.listed = [tf.Variable(1.)]
save.listed.append(tf.Variable(2.))
save.mapped = {'one': save.listed[0]}
save.mapped['two'] = save.listed[1]
save_path = save.save('./tf_list_example')

restore = tf.train.Checkpoint()
v2 = tf.Variable(0.)
assert 0. == v2.numpy()  # Not restored yet
restore.mapped = {'two': v2}
restore.restore(save_path)
assert 2. == v2.numpy()

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

restore.listed = []
print(restore.listed)  # ListWrapper([])
v1 = tf.Variable(0.)
restore.listed.append(v1)  # Restores v1, from restore() in the previous cell
assert 1. == v1.numpy()
ListWrapper([])

ট্র্যাক করা যায় এমন বস্তুর মধ্যে রয়েছে tf.train.Checkpoint , tf.Module এবং এর সাবক্লাস (যেমন keras.layers.Layer এবং keras.Model ), এবং স্বীকৃত পাইথন পাত্রে:

  • dict (এবং collections.OrderedDict । OrderedDict )
  • list
  • tuple (এবং collections.namedtuple , typing.NamedTuple )

অন্যান্য ধারক প্রকার সমর্থিত নয় , সহ:

  • collections.defaultdict
  • set

অন্যান্য সমস্ত পাইথন বস্তু উপেক্ষা করা হয় , সহ:

  • int
  • string
  • float

সারসংক্ষেপ

TensorFlow অবজেক্টগুলি তাদের ব্যবহার করা ভেরিয়েবলের মানগুলি সংরক্ষণ এবং পুনরুদ্ধার করার জন্য একটি সহজ স্বয়ংক্রিয় প্রক্রিয়া প্রদান করে।