বিতরণ করা প্রশিক্ষণ

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

বিতরণ করা প্রশিক্ষণ স্বয়ংক্রিয় হাইপার-প্যারামিটার অপ্টিমাইজেশনের জন্যও দরকারী যেখানে একাধিক মডেল সমান্তরালভাবে প্রশিক্ষিত হয়।

এই নথিতে আপনি শিখবেন কিভাবে:

  • বিতরণকৃত প্রশিক্ষণ ব্যবহার করে একটি TF-DF মডেলকে প্রশিক্ষণ দিন।
  • বিতরণকৃত প্রশিক্ষণ ব্যবহার করে একটি TF-DF মডেলের হাইপার-প্যারামিটার টিউন করুন।

সীমাবদ্ধতা

এখন পর্যন্ত, বিতরণ করা প্রশিক্ষণ এর জন্য সমর্থিত:

  • tfdf.keras.DistributedGradientBoostedTreesModel সহ গ্রেডিয়েন্ট বুস্টেড ট্রি মডেলের প্রশিক্ষণ। ডিস্ট্রিবিউটেড গ্রেডিয়েন্ট বুস্টেড ট্রি মডেলগুলি তাদের অ-ডিস্ট্রিবিউটেড পার্টনারের সমতুল্য।
  • যেকোনো TF-DF মডেলের জন্য হাইপার-প্যারামিটার অনুসন্ধান করুন।

কীভাবে বিতরণ করা প্রশিক্ষণ সক্ষম করবেন

এই বিভাগে সক্রিয় বিতরণ প্রশিক্ষণের পদক্ষেপের তালিকা রয়েছে। সম্পূর্ণ উদাহরণের জন্য, পরবর্তী বিভাগটি দেখুন।

প্যারামিটার সার্ভার স্ট্র্যাটেজি স্কোপ

মডেল এবং ডেটাসেট একটি ParameterServerStrategy সুযোগে সংজ্ঞায়িত করা হয়েছে।

strategy = tf.distribute.experimental.ParameterServerStrategy(...)
with strategy.scope():
  model = tfdf.keras.DistributedGradientBoostedTreesModel()
  distributed_train_dataset = strategy.distribute_datasets_from_function(dataset_fn)
model.fit(distributed_train_dataset)

ডেটাসেট বিন্যাস

অ-বিতরিত প্রশিক্ষণের মতো, ডেটাসেটগুলি প্রদান করা যেতে পারে

  1. একটি সীমিত টেনসরফ্লো বিতরণ করা ডেটাসেট, বা
  2. সামঞ্জস্যপূর্ণ ডেটাসেট বিন্যাসগুলির একটি ব্যবহার করে ডেটাসেট ফাইলগুলির একটি পথ৷

সীমিত টেনসরফ্লো ডিস্ট্রিবিউটেড ডেটাসেট পদ্ধতির (1 লাইন বনাম ~20 লাইন কোড) ব্যবহার করার চেয়ে শার্ডেড ফাইলগুলি ব্যবহার করা উল্লেখযোগ্যভাবে সহজ। যাইহোক, শুধুমাত্র টেনসরফ্লো ডেটাসেট পদ্ধতি টেনসরফ্লো প্রাক-প্রক্রিয়াকরণকে সমর্থন করে। যদি আপনার পাইপলাইনে কোনো প্রাক-প্রসেসিং না থাকে, তাহলে শার্ড ডেটাসেট বিকল্পটি সুপারিশ করা হয়।

উভয় ক্ষেত্রেই, দক্ষতার সাথে ডেটাসেট পড়ার বিতরণ করার জন্য ডেটাসেটটিকে একাধিক ফাইলে ভাগ করা উচিত।

সেটআপ কর্মীরা

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

প্রধানকে কর্মীদের আইপি ঠিকানা দিয়ে কনফিগার করতে হবে। এটি TF_CONFIG এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করে বা একটি ClusterResolver তৈরি করে করা যেতে পারে। আরও বিস্তারিত জানার জন্য প্যারামিটার সার্ভার স্ট্র্যাটেজি সহ প্যারামিটার সার্ভার প্রশিক্ষণ দেখুন।

TensorFlow এর প্যারামিটার সার্ভার স্ট্র্যাটেজি দুই ধরনের কর্মীদের সংজ্ঞায়িত করে: "কর্মী" এবং "প্যারামিটার সার্ভার"। TensorFlow-এর জন্য প্রতিটি ধরনের কর্মীর মধ্যে অন্তত একজনকে ইনস্ট্যান্ট করা প্রয়োজন। যাইহোক, TF-DF শুধুমাত্র "শ্রমিক" ব্যবহার করে। সুতরাং, একটি "প্যারামিটার সার্ভার" তাত্ক্ষণিক করা প্রয়োজন কিন্তু TF-DF দ্বারা ব্যবহার করা হবে না। উদাহরণস্বরূপ, একটি TF-DF প্রশিক্ষণের কনফিগারেশন নিম্নরূপ দেখতে পারে:

  • 1 প্রধান
  • 50 জন শ্রমিক
  • 1 প্যারামিটার সার্ভার

কর্মীদের টেনসরফ্লো ডিসিশন ফরেস্টের কাস্টম ট্রেনিং অপারেশনগুলিতে অ্যাক্সেস প্রয়োজন। অ্যাক্সেস সক্ষম করার জন্য দুটি বিকল্প রয়েছে:

  1. আগে থেকে কনফিগার করা TF-DF C++ প্যারামিটার সার্ভার //third_party/tensorflow_decision_forests/tensorflow/distribute:tensorflow_std_server ব্যবহার করুন।
  2. tf.distribute.Server() কল করে একটি প্যারামিটার সার্ভার তৈরি করুন। এই ক্ষেত্রে, TF-DF import tensorflow_decision_forests আমদানি করা উচিত।

উদাহরণ

এই বিভাগটি বিতরণকৃত প্রশিক্ষণ কনফিগারেশনের সম্পূর্ণ উদাহরণ দেখায়। আরও উদাহরণের জন্য, TF-DF ইউনিট পরীক্ষা দেখুন।

উদাহরণ: ডেটাসেট পাথে বিতরণ করা প্রশিক্ষণ

সামঞ্জস্যপূর্ণ ডেটাসেট বিন্যাসগুলির মধ্যে একটি ব্যবহার করে আপনার ডেটাসেটটিকে শার্ডেড ফাইলগুলির একটি সেটে ভাগ করুন৷ ফাইলগুলির নাম নিম্নরূপ রাখা বাঞ্ছনীয়: /path/to/dataset/train-<5 digit index>-of-<total files> , উদাহরণস্বরূপ

/path/to/dataset/train-00000-of-00100
/path/to/dataset/train-00001-of-00005
/path/to/dataset/train-00002-of-00005
...

সর্বাধিক দক্ষতার জন্য, ফাইলের সংখ্যা কমপক্ষে 10x কর্মীদের সংখ্যা হওয়া উচিত। উদাহরণস্বরূপ, আপনি যদি 100 জন শ্রমিকের সাথে প্রশিক্ষণ নিচ্ছেন, নিশ্চিত করুন যে ডেটাসেটটি কমপক্ষে 1000টি ফাইলে বিভক্ত হয়েছে।

তারপরে ফাইলগুলিকে একটি শার্ডিং এক্সপ্রেশনের সাথে উল্লেখ করা যেতে পারে যেমন:

  • /path/to/dataset/train@1000
  • /path/to/dataset/train@*

বিতরণ প্রশিক্ষণ নিম্নরূপ সম্পন্ন করা হয়. এই উদাহরণে, ডেটাসেটটি টেনসরফ্লো উদাহরণগুলির একটি TFRecord হিসাবে সংরক্ষণ করা হয়েছে (কী tfrecord+tfe দ্বারা সংজ্ঞায়িত)।

import tensorflow_decision_forests as tfdf
import tensorflow as tf

strategy = tf.distribute.experimental.ParameterServerStrategy(...)

with strategy.scope():
  model = tfdf.keras.DistributedGradientBoostedTreesModel()

model.fit_on_dataset_path(
    train_path="/path/to/dataset/train@1000",
    label_key="label_key",
    dataset_format="tfrecord+tfe")

print("Trained model")
model.summary()

উদাহরণ: একটি সীমিত TensorFlow বিতরণ করা ডেটাসেটে বিতরণ করা প্রশিক্ষণ

TF-DF একটি বিতরণ করা সীমিত কর্মী-শার্ডেড টেনসরফ্লো ডেটাসেট আশা করে:

  • বিতরণ করা : একটি অ-বিতরণ করা ডেটাসেট strategy.distribute_datasets_from_function এ মোড়ানো হয়।
  • finite : ডেটাসেটের প্রতিটি উদাহরণ ঠিক একবার পড়া উচিত। ডেটাসেটে কোনো repeat নির্দেশনা থাকা উচিত নয়
  • worker-sharded : প্রতিটি কর্মীকে ডেটাসেটের একটি পৃথক অংশ পড়তে হবে।

এখানে একটি উদাহরণ:

import tensorflow_decision_forests as tfdf
import tensorflow as tf


def dataset_fn(context, paths):
  """Create a worker-sharded finite dataset from paths.

  Like for non-distributed training, each example should be visited exactly
  once (and by only one worker) during the training. In addition, for optimal
  training speed, the reading of the examples should be distributed among the
  workers (instead of being read by a single worker, or read and discarded
  multiple times).

  In other words, don't add a "repeat" statement and make sure to shard the
  dataset at the file level and not at the example level.
  """

  # List the dataset files
  ds_path = tf.data.Dataset.from_tensor_slices(paths)

  # Make sure the dataset is used with distributed training.
  assert context is not None


  # Split the among the workers.
  #
  # Note: The "shard" is applied on the file path. The shard should not be
  # applied on the examples directly.
  # Note: You cannot use 'context.num_input_pipelines' with ParameterServerV2.
  current_worker = tfdf.keras.get_worker_idx_and_num_workers(context)
  ds_path = ds_path.shard(
      num_shards=current_worker.num_workers,
      index=current_worker.worker_idx)

  def read_csv_file(path):
    """Reads a single csv file."""

    numerical = tf.constant([0.0], dtype=tf.float32)
    categorical_string = tf.constant(["NA"], dtype=tf.string)
    csv_columns = [
        numerical,  # feature 1
        categorical_string,  # feature 2
        numerical,  # feature 3
        # ... define the features here.
    ]
    return tf.data.experimental.CsvDataset(path, csv_columns, header=True)

  ds_columns = ds_path.interleave(read_csv_file)

  # We assume a binary classification label with the following possible values.
  label_values = ["<=50K", ">50K"]

  # Convert the text labels into integers:
  # "<=50K" => 0
  # ">50K" => 1
  init_label_table = tf.lookup.KeyValueTensorInitializer(
      keys=tf.constant(label_values),
      values=tf.constant(range(label_values), dtype=tf.int64))
  label_table = tf.lookup.StaticVocabularyTable(
      init_label_table, num_oov_buckets=1)

  def extract_label(*columns):
    return columns[0:-1], label_table.lookup(columns[-1])

  ds_dataset = ds_columns.map(extract_label)

  # The batch size has no impact on the quality of the model. However, a larger
  # batch size generally is faster.
  ds_dataset = ds_dataset.batch(500)
  return ds_dataset


strategy = tf.distribute.experimental.ParameterServerStrategy(...)
with strategy.scope():
  model = tfdf.keras.DistributedGradientBoostedTreesModel()

  train_dataset = strategy.distribute_datasets_from_function(
      lambda context: dataset_fn(context, [...list of csv files...])
  )

model.fit(train_dataset)

print("Trained model")
model.summary()

উদাহরণ: ডেটাসেট পাথে ডিস্ট্রিবিউটেড হাইপার-প্যারামিটার টিউনিং

একটি ডেটাসেট পাথে বিতরণ করা হাইপার-প্যারামিটার টিউনিং বিতরণ করা প্রশিক্ষণের অনুরূপ। শুধুমাত্র পার্থক্য হল যে এই বিকল্পটি অ-বিতরণ করা মডেলগুলির সাথে সামঞ্জস্যপূর্ণ। উদাহরণস্বরূপ, আপনি (নন-ডিস্ট্রিবিউটেড) গ্রেডিয়েন্ট বুস্টেড ট্রিস মডেলের হাইপার-প্যারামিটার টিউনিং বিতরণ করতে পারেন।

with strategy.scope():
  tuner = tfdf.tuner.RandomSearch(num_trials=30, use_predefined_hps=True)
  model = tfdf.keras.GradientBoostedTreesModel(tuner=tuner)

training_history = model.fit_on_dataset_path(
  train_path=train_path,
  label_key=label,
  dataset_format="csv",
  valid_path=test_path)

logging.info("Trained model:")
model.summary()

উদাহরণ: ইউনিট পরীক্ষা

ইউনিট পরীক্ষা বিতরণ প্রশিক্ষণের জন্য, আপনি মক কর্মী প্রক্রিয়া তৈরি করতে পারেন। আরও তথ্যের জন্য TF-DF ইউনিট পরীক্ষায় _create_in_process_tf_ps_cluster পদ্ধতিটি দেখুন।