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

Đào tạo phân tán là một loại đào tạo mô hình trong đó các yêu cầu về tài nguyên máy tính (ví dụ: CPU, RAM) được phân phối giữa nhiều máy tính. Đào tạo phân tán cho phép đào tạo nhanh hơn và trên các tập dữ liệu lớn hơn (lên tới vài tỷ ví dụ).

Đào tạo phân tán cũng hữu ích cho việc tối ưu hóa siêu tham số tự động trong đó nhiều mô hình được đào tạo song song.

Trong tài liệu này, bạn sẽ học cách:

  • Huấn luyện mô hình TF-DF bằng cách sử dụng huấn luyện phân tán.
  • Điều chỉnh các siêu tham số của mô hình TF-DF bằng cách sử dụng đào tạo phân tán.

Hạn chế

Tính đến thời điểm hiện tại, đào tạo phân tán được hỗ trợ cho:

  • Đào tạo các mô hình Cây tăng cường gradient với tfdf.keras.DistributedGradientBoostedTreesModel . Các mô hình Cây tăng cường độ dốc phân tán tương đương với các mô hình không được phân phối của chúng.
  • Tìm kiếm siêu tham số cho bất kỳ loại mô hình TF-DF nào.

Cách kích hoạt đào tạo phân tán

Phần này liệt kê các bước để kích hoạt đào tạo phân tán. Để biết ví dụ đầy đủ, hãy xem phần tiếp theo.

Phạm vi chiến lược máy chủ tham số

Mô hình và tập dữ liệu được xác định trong phạm vi 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)

Định dạng tập dữ liệu

Giống như đối với đào tạo không phân phối, bộ dữ liệu có thể được cung cấp dưới dạng

  1. Một tập dữ liệu phân tán tensorflow hữu hạn, hoặc
  2. đường dẫn đến các tệp dữ liệu bằng một trong các định dạng dữ liệu tương thích .

Việc sử dụng các tệp được phân đoạn đơn giản hơn đáng kể so với việc sử dụng phương pháp tiếp cận tập dữ liệu phân tán dòng chảy hữu hạn (1 dòng so với ~ 20 dòng mã). Tuy nhiên, chỉ có phương pháp tiếp cận tập dữ liệu tensorflow mới hỗ trợ tiền xử lý TensorFlow. Nếu quy trình của bạn không chứa bất kỳ quy trình xử lý trước nào thì nên sử dụng tùy chọn tập dữ liệu được phân chia.

Trong cả hai trường hợp, tập dữ liệu phải được chia thành nhiều tệp để phân phối việc đọc tập dữ liệu một cách hiệu quả.

Công nhân thiết lập

Quy trình chính là chương trình chạy mã python xác định mô hình TensorFlow. Quá trình này không chạy bất kỳ tính toán nặng nào. Việc tính toán đào tạo hiệu quả được thực hiện bởi công nhân . Công nhân là các quy trình chạy Máy chủ tham số TensorFlow.

Người đứng đầu phải được cấu hình bằng địa chỉ IP của công nhân. Điều này có thể được thực hiện bằng cách sử dụng biến môi trường TF_CONFIG hoặc bằng cách tạo ClusterResolver . Xem Đào tạo về máy chủ tham số với ParameterServerStrategy để biết thêm chi tiết.

ParameterServerStrategy của TensorFlow xác định hai loại công nhân: "công nhân" và "máy chủ tham số". TensorFlow yêu cầu ít nhất một trong mỗi loại nhân viên phải được khởi tạo. Tuy nhiên, TF-DF chỉ sử dụng "công nhân". Vì vậy, một "máy chủ tham số" cần được khởi tạo nhưng TF-DF sẽ không sử dụng. Ví dụ: cấu hình đào tạo TF-DF có thể như sau:

  • 1 trưởng phòng
  • 50 công nhân
  • 1 máy chủ tham số

Các công nhân cần có quyền truy cập vào các hoạt động đào tạo tùy chỉnh của TensorFlow Decision Forest. Có hai tùy chọn để cho phép truy cập:

  1. Sử dụng Máy chủ tham số TF-DF C++ được cấu hình sẵn //third_party/tensorflow_decision_forests/tensorflow/distribute:tensorflow_std_server .
  2. Tạo một máy chủ tham số bằng cách gọi tf.distribute.Server() . Trong trường hợp này, TF-DF phải được nhập import tensorflow_decision_forests .

Ví dụ

Phần này hiển thị các ví dụ đầy đủ về cấu hình đào tạo phân tán. Để biết thêm ví dụ, hãy kiểm tra các bài kiểm tra đơn vị TF-DF .

Ví dụ: Đào tạo phân tán trên đường dẫn dữ liệu

Chia tập dữ liệu của bạn thành một tập hợp các tệp được phân chia bằng cách sử dụng một trong các định dạng tập dữ liệu tương thích . Ví dụ: nên đặt tên các tệp như sau: /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
...

Để đạt hiệu quả tối đa, số lượng tệp ít nhất phải gấp 10 lần số lượng công nhân. Ví dụ: nếu bạn đang đào tạo với 100 công nhân, hãy đảm bảo tập dữ liệu được chia thành ít nhất 1000 tệp.

Sau đó, các tệp có thể được tham chiếu bằng biểu thức sharding, chẳng hạn như:

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

Đào tạo phân tán được thực hiện như sau. Trong ví dụ này, tập dữ liệu được lưu trữ dưới dạng TFRecord của các ví dụ TensorFlow (được xác định bằng khóa 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()

Ví dụ: Đào tạo phân tán trên tập dữ liệu phân tán TensorFlow hữu hạn

TF-DF mong đợi một bộ dữ liệu TensorFlow phân chia công nhân hữu hạn được phân phối:

  • Đã phân phối : Một tập dữ liệu không được phân phối được gói trong strategy.distribute_datasets_from_function .
  • hữu hạn : Tập dữ liệu phải đọc từng ví dụ chính xác một lần. Tập dữ liệu không được chứa bất kỳ hướng dẫn repeat .
  • worker-sharded : Mỗi công nhân nên đọc một phần riêng biệt của tập dữ liệu.

Đây là một ví dụ:

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

Ví dụ: Điều chỉnh siêu tham số được phân phối trên đường dẫn tập dữ liệu

Điều chỉnh siêu tham số phân tán trên đường dẫn tập dữ liệu tương tự như đào tạo phân tán. Sự khác biệt duy nhất là tùy chọn này tương thích với các mẫu không được phân phối. Ví dụ: bạn có thể phân phối điều chỉnh siêu tham số của mô hình Cây tăng cường độ dốc (không phân phối).

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

Ví dụ: Kiểm tra đơn vị

Để kiểm tra đơn vị đào tạo phân tán, bạn có thể tạo các quy trình nhân viên mô phỏng. Xem phương thức _create_in_process_tf_ps_cluster trong bài kiểm tra đơn vị TF-DF để biết thêm thông tin.