분산 교육

소개

분산 교육을 사용하면 대규모 데이터 세트에서 모델을 빠르게 교육할 수 있습니다. 모든 모델이 분산 교육을 지원하는 것은 아닙니다. 초매개변수 조정은 항상 분산 교육의 이점을 얻습니다.

사용 가능한 분산 교육 알고리즘에 대한 자세한 내용은 Yggdrasil Decision Forests 사용자 매뉴얼의 분산 교육 섹션을 참조하십시오. TF-DF에서 TF Parameter Server와 함께 분산 교육을 사용할 때 Yggdrasil Decision Forests는 TF_DIST 분산 구현을 효과적으로 실행하고 있습니다.

학습 알고리즘은 동일하게 유지되지만 TF-DF는 분산 학습을 실행하는 세 가지 방법을 지원합니다.

  1. [가장 간단한 옵션] 데이터 세트 읽기에는 Yggdrasil Decision Forest를 사용하고 모델 교육에는 TF Parameter Server를 사용합니다.
  2. [TensorFlow와 가장 유사한 옵션] 데이터 세트 읽기 및 모델 교육 모두에 TF 매개변수 서버 사용.
  3. 데이터 세트 읽기와 모델 훈련 모두에 Yggdrasil Decision Forest 사용.

제한 사항:

  • 현재(2022년 5월) PyPi에 배포된 TF-DF 버전은 TF Parameter Server 배포 전략을 사용한 분산 교육을 지원하지 않습니다. 이 경우 데이터 세트 읽기와 모델 교육 모두에 Yggdrasil Decision Forest를 사용하십시오. 즉, GRPC 배포 전략을 사용하십시오.
  • 데이터 세트 읽기에 Yggdrasil Decision Forest를 사용하는 것은 TensorFlow 사전 처리를 지원하지 않습니다.

다음은 분산 교육의 몇 가지 예입니다.

[가장 간단한 옵션] 데이터 세트 읽기에는 Yggdrasil Decision Forest를 사용하고 모델 교육에는 TF Parameter Server를 사용합니다.

매개변수 서버 전략 작업자 세트를 시작합니다. 그 다음에:

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@100000",
    label_key="label_key",
    dataset_format="tfrecord+tfe")

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

dataset_format 의 가능한 값은 Yggdrasil Decision Forests 지원 형식 을 참조하세요.

[TensorFlow와 가장 유사한 옵션] 데이터 세트 읽기와 모델 학습 모두에 TF Parameter Server 사용

매개변수 서버 전략 작업자 세트를 시작합니다. 그 다음에:

import tensorflow_decision_forests as tfdf
import tensorflow as tf

def dataset_fn(context, paths):

  # Like for non-distributed training, each example should be visited exactly
  # once 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.

  ds_path = tf.data.Dataset.from_tensor_slices(paths)

  if context is not None:
    # Split the dataset among the workers.
    # 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):
    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)

  label_values = ["<=50K", ">50K"]

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

데이터 세트 읽기 및 모델 학습 모두에 Yggdrasil Decision Forest 사용

다른 컴퓨터에서 GRPC 작업자 집합을 시작합니다. 다음 중 하나를 사용할 수 있습니다.

  1. YDF 릴리스 패키지 에서 사용할 수 있는 YDF 작업자 바이너리( doc ).
  2. TF-DF PyPi 패키지에서 사용 가능한 TF-DF 작업자 바이너리를 사용합니다.

두 바이너리는 동일하고 서명이 동일합니다. 그러나 YDF 바이너리와 달리 TF-DF 바이너리에는 TensorFlow .so 파일이 필요합니다.

TF-DF 작업자 바이너리를 시작하는 방법의 예

# Locate the installed pypi package of TF-DF.
pip show tensorflow-decision-forests
# Look for the "Location:" path.
LOCATION=...
WORKER_BINARY=${LOCATION}/tensorflow_decision_forests/keras/grpc_worker_main

# Run the worker binary
export LD_LIBRARY_PATH=${LOCATION}/tensorflow && ${WORKER_BINARY} --port=2001

분산 교육

import tensorflow_decision_forests as tfdf
import tensorflow as tf

deployment_config = tfdf.keras.core.YggdrasilDeploymentConfig()
deployment_config.try_resume_training = True
deployment_config.distribute.implementation_key = "GRPC"
socket_addresses = deployment_config.distribute.Extensions[
    tfdf.keras.core.grpc_pb2.grpc].socket_addresses

# Socket addresses of ":grpc_worker_main" running instances.
socket_addresses.addresses.add(ip="127.0.0.1", port=2001)
socket_addresses.addresses.add(ip="127.0.0.2", port=2001)
socket_addresses.addresses.add(ip="127.0.0.3", port=2001)
socket_addresses.addresses.add(ip="127.0.0.4", port=2001)

model = tfdf.keras.DistributedGradientBoostedTreesModel(
    advanced_arguments=tfdf.keras.AdvancedArguments(
        yggdrasil_deployment_config=deployment_config))

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

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

dataset_format 의 가능한 값은 Yggdrasil Decision Forests 지원 형식 을 참조하세요.