آموزش توزیع شده

آموزش توزیع شده نوعی آموزش مدل است که در آن منابع محاسباتی مورد نیاز (مانند CPU، RAM) بین چندین کامپیوتر توزیع می شود. آموزش توزیع شده امکان آموزش سریعتر و بر روی مجموعه داده های بزرگتر را فراهم می کند (تا چند میلیارد نمونه).

آموزش توزیع شده همچنین برای بهینه سازی هایپرپارامتر خودکار که در آن چندین مدل به صورت موازی آموزش داده می شوند مفید است.

در این سند شما یاد خواهید گرفت که چگونه:

  • یک مدل TF-DF را با استفاده از آموزش توزیع شده آموزش دهید.
  • با استفاده از آموزش توزیع شده، فراپارامترهای یک مدل TF-DF را تنظیم کنید.

محدودیت ها

در حال حاضر، آموزش توزیع شده برای موارد زیر پشتیبانی می شود:

  • آموزش مدل های Gradient Boosted Trees با tfdf.keras.DistributedGradientBoostedTreesModel . مدل‌های درختان تقویت‌شده با گرادیان توزیع شده معادل نمونه‌های توزیع نشده خود هستند.
  • جستجوی فراپارامتر برای هر نوع مدل TF-DF.

نحوه فعال کردن آموزش توزیع شده

این بخش مراحل فعال کردن آموزش توزیع شده را فهرست می کند. برای مثال های کامل، بخش بعدی را ببینید.

دامنه Strategy ParameterServer

مدل و مجموعه داده در محدوده 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 خط کد). با این حال، تنها رویکرد مجموعه داده tensorflow از پیش پردازش TensorFlow پشتیبانی می کند. اگر خط لوله شما حاوی هیچ گونه پیش پردازشی نیست، گزینه مجموعه داده خرد شده توصیه می شود.

در هر دو مورد، مجموعه داده باید در چندین فایل به اشتراک گذاشته شود تا خواندن مجموعه داده به طور موثر توزیع شود.

کارگران راه اندازی

یک فرآیند اصلی برنامه‌ای است که کد پایتون را اجرا می‌کند که مدل TensorFlow را تعریف می‌کند. این فرآیند محاسبات سنگینی را انجام نمی دهد. محاسبات آموزشی موثر توسط کارگران انجام می شود. کارگران فرآیندهایی هستند که یک سرور پارامتر TensorFlow را اجرا می کنند.

رئیس باید با آدرس IP کارگران پیکربندی شود. این کار را می توان با استفاده از متغیر محیطی TF_CONFIG یا با ایجاد یک ClusterResolver انجام داد. برای جزئیات بیشتر به آموزش سرور پارامتر با ParameterServerStrategy مراجعه کنید.

ParameterServerStrategy TensorFlow دو نوع کارگر را تعریف می کند: "workers" و "parameter server". 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 فایل تقسیم شده است.

سپس فایل ها را می توان با یک عبارت اشتراک گذاری مانند:

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

آموزش توزیع شده به شرح زیر انجام می شود. در این مثال، مجموعه داده به عنوان یک 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 باشد.
  • 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()

مثال: تنظیم فراپارامتر توزیع شده در یک مسیر داده

تنظیم فراپارامتر توزیع شده در مسیر مجموعه داده مشابه آموزش توزیع شده است. تنها تفاوت این است که این گزینه با مدل های غیر توزیع سازگار است. به عنوان مثال، می‌توانید تنظیم فراپارامتری (غیر توزیع‌شده) 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 مراجعه کنید.