वितरित प्रशिक्षण

वितरित प्रशिक्षण एक प्रकार का मॉडल प्रशिक्षण है जहां कंप्यूटिंग संसाधनों की आवश्यकताओं (जैसे, सीपीयू, रैम) को कई कंप्यूटरों के बीच वितरित किया जाता है। वितरित प्रशिक्षण तेजी से और बड़े डेटासेट (कुछ अरब उदाहरणों तक) पर प्रशिक्षित करने की अनुमति देता है।

वितरित प्रशिक्षण स्वचालित हाइपर-पैरामीटर अनुकूलन के लिए भी उपयोगी है जहां कई मॉडलों को समानांतर में प्रशिक्षित किया जाता है।

इस दस्तावेज़ में आप सीखेंगे कि कैसे:

  • वितरित प्रशिक्षण का उपयोग करके टीएफ-डीएफ मॉडल को प्रशिक्षित करें।
  • वितरित प्रशिक्षण का उपयोग करके टीएफ-डीएफ मॉडल के हाइपर-पैरामीटर को ट्यून करें।

सीमाएँ

अब तक, वितरित प्रशिक्षण इसके लिए समर्थित है:

  • tfdf.keras.DistributedGradientBoostedTreesModel के साथ ग्रैडिएंट बूस्टेड ट्रीज़ मॉडल का प्रशिक्षण। वितरित ग्रेडिएंट बूस्टेड ट्री मॉडल उनके गैर-वितरित समकक्षों के बराबर हैं।
  • किसी भी टीएफ-डीएफ मॉडल प्रकार के लिए हाइपर-पैरामीटर खोज।

वितरित प्रशिक्षण कैसे सक्षम करें

यह अनुभाग वितरित प्रशिक्षण को सक्षम करने के चरणों को सूचीबद्ध करता है। संपूर्ण उदाहरणों के लिए, अगला भाग देखें।

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. एक परिमित टेंसरफ़्लो वितरित डेटासेट, या
  2. संगत डेटासेट प्रारूपों में से किसी एक का उपयोग करके डेटासेट फ़ाइलों का पथ।

परिमित टेंसरफ़्लो वितरित डेटासेट दृष्टिकोण (कोड की 1 पंक्ति बनाम ~ 20 पंक्तियाँ) का उपयोग करने की तुलना में शार्प फ़ाइलों का उपयोग करना काफी सरल है। हालाँकि, केवल टेंसरफ़्लो डेटासेट दृष्टिकोण ही टेंसरफ़्लो प्री-प्रोसेसिंग का समर्थन करता है। यदि आपकी पाइपलाइन में कोई प्री-प्रोसेसिंग नहीं है, तो शार्प्ड डेटासेट विकल्प की अनुशंसा की जाती है।

दोनों ही मामलों में, डेटासेट रीडिंग को कुशलतापूर्वक वितरित करने के लिए डेटासेट को कई फाइलों में विभाजित किया जाना चाहिए।

सेटअप कार्यकर्ता

एक मुख्य प्रक्रिया पायथन कोड चलाने वाला प्रोग्राम है जो TensorFlow मॉडल को परिभाषित करता है। यह प्रक्रिया कोई भारी गणना नहीं चला रही है. प्रभावी प्रशिक्षण गणना श्रमिकों द्वारा की जाती है। वर्कर्स TensorFlow पैरामीटर सर्वर चलाने वाली प्रक्रियाएं हैं।

प्रमुख को कार्यकर्ताओं के आईपी पते से कॉन्फ़िगर किया जाना चाहिए। यह TF_CONFIG पर्यावरण चर का उपयोग करके, या ClusterResolver बनाकर किया जा सकता है। अधिक विवरण के लिए ParameterServerStrategy के साथ पैरामीटर सर्वर प्रशिक्षण देखें।

TensorFlow की ParameterServerStrategy दो प्रकार के श्रमिकों को परिभाषित करती है: "श्रमिक" और "पैरामीटर सर्वर"। TensorFlow को प्रत्येक प्रकार के कम से कम एक कार्यकर्ता को तत्काल चालू करने की आवश्यकता होती है। हालाँकि, टीएफ-डीएफ केवल "श्रमिकों" का उपयोग करता है। इसलिए, एक "पैरामीटर सर्वर" को तुरंत चालू करने की आवश्यकता है लेकिन टीएफ-डीएफ द्वारा इसका उपयोग नहीं किया जाएगा। उदाहरण के लिए, टीएफ-डीएफ प्रशिक्षण का विन्यास इस प्रकार दिख सकता है:

  • 1 मुखिया
  • 50 श्रमिक
  • 1 पैरामीटर सर्वर

श्रमिकों को टेन्सरफ्लो डिसीजन फॉरेस्ट के कस्टम प्रशिक्षण ऑप्स तक पहुंच की आवश्यकता होती है। पहुंच सक्षम करने के लिए दो विकल्प हैं:

  1. पूर्व-कॉन्फ़िगर TF-DF C++ पैरामीटर सर्वर //third_party/tensorflow_decision_forests/tensorflow/distribute:tensorflow_std_server उपयोग करें।
  2. tf.distribute.Server() पर कॉल करके एक पैरामीटर सर्वर बनाएं। इस मामले में, टीएफ-डीएफ को 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 फ़ाइलों में विभाजित है।

फिर फ़ाइलों को एक शार्डिंग अभिव्यक्ति के साथ संदर्भित किया जा सकता है जैसे:

  • /पथ/से/डेटासेट/ट्रेन@1000
  • /पथ/से/डेटासेट/ट्रेन@*

वितरित प्रशिक्षण निम्नानुसार किया जाता है। इस उदाहरण में, डेटासेट को TensorFlow उदाहरणों के 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 वितरित डेटासेट पर वितरित प्रशिक्षण

टीएफ-डीएफ एक वितरित परिमित कार्यकर्ता-शाखारित टेन्सरफ्लो डेटासेट की अपेक्षा करता है:

  • वितरित : एक गैर-वितरित डेटासेट को 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()

उदाहरण: डेटासेट पथ पर वितरित हाइपर-पैरामीटर ट्यूनिंग

डेटासेट पथ पर वितरित हाइपर-पैरामीटर ट्यूनिंग वितरित प्रशिक्षण के समान है। अंतर केवल इतना है कि यह विकल्प गैर-वितरित मॉडल के साथ संगत है। उदाहरण के लिए, आप (गैर-वितरित) ग्रेडिएंट बूस्टेड ट्रीज़ मॉडल की हाइपर-पैरामीटर ट्यूनिंग वितरित कर सकते हैं।

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 विधि देखें।