Đào tạo phân tán

Giới thiệu

Đào tạo phân tán giúp bạn có thể đào tạo mô hình một cách nhanh chóng trên các tập dữ liệu lớn. Không phải tất cả các mô hình đều hỗ trợ đào tạo phân tán. Điều chỉnh siêu tham số luôn được hưởng lợi từ đào tạo phân tán.

Xem phần đào tạo phân tán trong sổ tay hướng dẫn sử dụng Rừng Quyết định Yggdrasil để biết chi tiết về các thuật toán đào tạo phân tán có sẵn. Khi sử dụng đào tạo phân tán với Máy chủ tham số TF trong TF-DF, Rừng Quyết định Yggdrasil đang chạy triển khai phân phối TF_DIST một cách hiệu quả.

Trong khi các thuật toán học tập vẫn giữ nguyên, TF-DF hỗ trợ ba cách để thực hiện đào tạo phân tán:

  1. [Tùy chọn đơn giản nhất] Sử dụng Rừng Quyết định Yggdrasil để đọc tập dữ liệu và Máy chủ tham số TF để đào tạo mô hình.
  2. [Tùy chọn thích TensorFlow nhất] Sử dụng Máy chủ tham số TF để đọc tập dữ liệu và đào tạo mô hình.
  3. Sử dụng Rừng Quyết định Yggdrasil cho cả việc đọc tập dữ liệu và đào tạo mô hình.

Hạn chế:

  • Hiện tại (tháng 5 năm 2022), phiên bản TF-DF được phân phối trên PyPi không hỗ trợ đào tạo phân tán với chiến lược phân phối Máy chủ tham số TF. Trong trường hợp này, hãy sử dụng Rừng Quyết định Yggdrasil cho cả việc đọc tập dữ liệu và đào tạo mô hình, tức là sử dụng chiến lược phân phối GRPC.
  • Việc sử dụng Rừng Quyết định Yggdrasil để đọc tập dữ liệu không hỗ trợ tiền xử lý TensorFlow.

Các ví dụ

Sau đây là một số ví dụ về đào tạo phân tán.

[Tùy chọn đơn giản nhất] Sử dụng Rừng Quyết định Yggdrasil để đọc tập dữ liệu và Máy chủ tham số TF để đào tạo mô hình.

Bắt đầu một tập hợp các công nhân Chiến lược Máy chủ Tham số . Sau đó:

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

Xem các định dạng được hỗ trợ của Rừng Quyết định Yggdrasil để biết các giá trị có thể có của dataset_format .

[Tùy chọn thích TensorFlow nhất] Sử dụng Máy chủ tham số TF để đọc tập dữ liệu và đào tạo mô hình

Bắt đầu một tập hợp các công nhân Chiến lược Máy chủ Tham số . Sau đó:

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

Sử dụng Rừng Quyết định Yggdrasil cho cả việc đọc tập dữ liệu và đào tạo mô hình

Bắt đầu một nhóm công nhân GRPC trên các máy khác nhau. Bạn có thể sử dụng:

  1. Trình nhị phân YDF worker ( doc ) có sẵn trong các gói phát hành YDF .
  2. Sử dụng nhị phân công nhân TF-DF có sẵn trong gói TF-DF PyPi.

Cả hai mã nhị phân đều tương đương và có cùng chữ ký. Tuy nhiên, không giống như nhị phân YDF, nhị phân TF-DF yêu cầu tệp .so TensorFlow.

Ví dụ về cách khởi động tệp nhị phân công nhân 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

Đào tạo phân tán

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

Xem các định dạng được hỗ trợ của Rừng Quyết định Yggdrasil để biết các giá trị có thể có của dataset_format .