التدريب الموزع

التدريب الموزع هو نوع من التدريب النموذجي حيث يتم توزيع متطلبات موارد الحوسبة (على سبيل المثال، وحدة المعالجة المركزية وذاكرة الوصول العشوائي) بين أجهزة كمبيوتر متعددة. يسمح التدريب الموزع بالتدريب بشكل أسرع وعلى مجموعات بيانات أكبر (ما يصل إلى بضعة مليارات من الأمثلة).

يعد التدريب الموزع مفيدًا أيضًا في التحسين الآلي للمعلمات الفائقة حيث يتم تدريب نماذج متعددة بالتوازي.

في هذا المستند سوف تتعلم كيفية:

  • تدريب نموذج TF-DF باستخدام التدريب الموزع.
  • قم بضبط المعلمات الفائقة لنموذج TF-DF باستخدام التدريب الموزع.

محددات

اعتبارًا من الآن، يتم دعم التدريب الموزع من أجل:

  • تدريب نماذج الأشجار المعززة بالتدرج باستخدام tfdf.keras.DistributedGradientBoostedTreesModel . نماذج الأشجار المعززة المتدرجة الموزعة تعادل نظيراتها غير الموزعة.
  • البحث عن المعلمات الفائقة لأي نوع من طراز TF-DF.

كيفية تمكين التدريب الموزع

يسرد هذا القسم خطوات تمكين التدريب الموزع. للحصول على أمثلة كاملة، راجع القسم التالي.

نطاق ParameterServerStrategy

يتم تعريف النموذج ومجموعة البيانات في نطاق 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. مجموعة بيانات موزعة من Tensorflow محدودة، أو
  2. مسار إلى ملفات مجموعة البيانات باستخدام أحد تنسيقات مجموعة البيانات المتوافقة .

يعد استخدام الملفات المجزأة أبسط بكثير من استخدام نهج مجموعة البيانات الموزعة من Tensorflow (سطر واحد مقابل ~ 20 سطرًا من التعليمات البرمجية). ومع ذلك، فإن نهج مجموعة بيانات Tensorflow هو الوحيد الذي يدعم المعالجة المسبقة لـ TensorFlow. إذا كان المسار الخاص بك لا يحتوي على أي معالجة مسبقة، فمن المستحسن استخدام خيار مجموعة البيانات المجزأة.

في كلتا الحالتين، يجب تقسيم مجموعة البيانات إلى ملفات متعددة لتوزيع قراءة مجموعة البيانات بكفاءة.

عمال الإعداد

العملية الرئيسية هي البرنامج الذي يقوم بتشغيل كود بايثون الذي يحدد نموذج TensorFlow. هذه العملية لا تقوم بأي حسابات ثقيلة. يتم حساب التدريب الفعال من قبل العمال . العمال عبارة عن عمليات تقوم بتشغيل خادم TensorFlow Parameter Server.

يجب تكوين الرئيس باستخدام عنوان IP الخاص بالعاملين. يمكن القيام بذلك باستخدام متغير البيئة TF_CONFIG ، أو عن طريق إنشاء ClusterResolver . راجع تدريب خادم المعلمة باستخدام ParameterServerStrategy لمزيد من التفاصيل.

تحدد ParameterServerStrategy الخاصة بـ TensorFlow نوعين من العمال: "العمال" و"خادم المعلمات". يتطلب TensorFlow إنشاء مثيل واحد على الأقل من كل نوع من العاملين. ومع ذلك، يستخدم TF-DF فقط "العمال". لذلك، يجب إنشاء "خادم معلمة" واحد ولكن لن يتم استخدامه بواسطة TF-DF. على سبيل المثال، قد يبدو تكوين تدريب TF-DF كما يلي:

  • 1 رئيس
  • 50 عاملاً
  • 1 خادم المعلمة

يحتاج العمال إلى الوصول إلى عمليات التدريب المخصصة لـ TensorFlow Decision Forests. هناك خياران لتمكين الوصول:

  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
...

لتحقيق أقصى قدر من الكفاءة، يجب أن يكون عدد الملفات على الأقل 10 أضعاف عدد العاملين. على سبيل المثال، إذا كنت تقوم بالتدريب مع 100 عامل، فتأكد من تقسيم مجموعة البيانات إلى 1000 ملف على الأقل.

يمكن بعد ذلك الرجوع إلى الملفات باستخدام تعبير تقسيم مثل:

  • /المسار/إلى/dataset/train@1000
  • /المسار/إلى/مجموعة البيانات/القطار@*

يتم التدريب الموزع على النحو التالي. في هذا المثال، يتم تخزين مجموعة البيانات على هيئة TFRecord لأمثلة TensorFlow (المحددة بواسطة المفتاح 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 مجموعة بيانات TensorFlow موزعة ومقسمة على العمال:

  • الموزعة : يتم تغليف مجموعة البيانات غير الموزعة في strategy.distribute_datasets_from_function .
  • محدود : يجب أن تقرأ مجموعة البيانات كل مثال مرة واحدة بالضبط. يجب ألا تحتوي مجموعة البيانات على أي تعليمات repeat .
  • العامل المجزأ : يجب على كل عامل قراءة جزء منفصل من مجموعة البيانات.

هنا مثال:

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()

مثال: ضبط المعلمات الفائقة الموزعة على مسار مجموعة البيانات

يشبه ضبط المعلمات الفائقة الموزعة على مسار مجموعة البيانات التدريب الموزع. والفرق الوحيد هو أن هذا الخيار متوافق مع النماذج غير الموزعة. على سبيل المثال، يمكنك توزيع ضبط المعلمات الفائقة لنموذج Gradient Boosted Trees (غير الموزع).

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()

مثال: اختبار الوحدة

لاختبار وحدة التدريب الموزع، يمكنك إنشاء عمليات عاملة وهمية. راجع طريقة _create_in_process_tf_ps_cluster في اختبارات وحدة TF-DF لمزيد من المعلومات.