Spec-Zone.ru › TensorFlow 2.4

Модуль: tf.data.experimental.service

API для использования службы tf.data.

Этот модуль содержит:

  1. Реализации сервера tf.data для запуска службы tf.data.
  2. Преобразование набора данных distribute, которое перемещает предварительную обработку набора данных в службу tf.data.

Служба tf.data предлагает способ ускорения обучения, когда хост, подключенный к устройству обучения, не успевает за потреблением данных моделью. Например, предположим, что хост может генерировать 100 примеров/секунду, но модель может обрабатывать 200 примеров/секунду. Скорость обучения можно удвоить, используя службу tf.data для генерации 200 примеров/секунду.

Перед использованием службы tf.data

Прежде чем использовать службу tf.data для ускорения обучения, необходимо выполнить несколько шагов.

Понимание параметра processing_mode

Служба tf.data использует кластер рабочих узлов для подготовки данных для обучения вашей модели. Аргумент processing_mode в tf.data.experimental.service.distribute описывает, как использовать несколько рабочих узлов для обработки входного набора данных. В настоящее время доступны два режима обработки: «distributed_epoch» и «parallel_epochs».

«distributed_epoch» означает, что набор данных будет разделен между всеми рабочими узлами службы tf.data. Диспечер создает «разбиения» для набора данных и отправляет их рабочим узлам для дальнейшей обработки. Например, если набор данных начинается со списка имен файлов, диспечер будет перебирать имена файлов и отправлять их рабочим узлам tf.data, которые выполнят оставшиеся преобразования набора данных для этих файлов. «distributed_epoch» полезен, когда ваша модель должна видеть каждый элемент набора данных ровно один раз или если ей нужен порядок данных в целом последовательный. «distributed_epoch» работает только для наборов данных со своими разделимыми источниками, такими как Dataset.from_tensor_slices, Dataset.list_files или Dataset.range.

«parallel_epochs» означает, что весь входной набор данных будет обрабатываться независимо каждым из рабочих узлов службы tf.data. По этой причине важно не детерминированно перемешивать данные (например, имена файлов), чтобы каждый рабочий узел обрабатывал элементы набора данных в разном порядке. «parallel_epochs» может использоваться для распределения наборов данных, которые нельзя разбить.

Измерение потенциального влияния

Перед использованием службы tf.data полезно измерить потенциальное улучшение производительности. Для этого добавьте

dataset = dataset.take(1).cache().repeat()

в конец вашего набора данных и посмотрите, как это повлияет на время шага вашей модели. take(1).cache().repeat() будет кэшировать первый элемент вашего набора данных и повторять его. Это должно сделать набор данных очень быстрым, чтобы модель стала узким местом, и вы могли определить идеальную скорость модели. С достаточным количеством рабочих узлов служба tf.data должна достичь аналогичной скорости.

Запуск службы tf.data

Серверы tf.data должны запускаться вместе с задачами обучения и останавливаться по завершении задач. Служба tf.data использует один DispatchServer и любое количество WorkerServers. См. https://github.com/tensorflow/ecosystem/tree/master/data_service для примера использования Google Kubernetes Engine (GKE) для управления службой tf.data. Реализация сервера в tf_std_data_server.py не зависит от GKE и может использоваться для запуска службы tf.data в других контекстах.

Устойчивость к сбоям

По умолчанию сервер диспетчера tf.data хранит свое состояние в оперативной памяти, что делает его единственной точкой отказа во время обучения. Чтобы этого избежать, передайте fault_tolerant_mode=True при создании вашего DispatchServer. Устойчивость к сбоям диспетчера требует, чтобы work_dir была настроена и доступна диспетчеру до и после перезапуска (например, путь в GCS). При включенном режиме устойчивости к сбоям диспетчер будет записывать свое состояние в рабочую директорию, чтобы при перезапуске диспетчера не потерялось состояние.

Серверы рабочих узлов можно свободно перезапускать, добавлять или удалять во время обучения. При запуске рабочие узлы регистрируются у диспетчера и начинают обрабатывать все ожидающие задания с самого начала.

Использование службы tf.data в вашей задаче обучения

После запуска кластера службы tf.data обратите внимание на IP-адрес и порт диспетчера. Для подключения к службе вы будете использовать строку в формате «grpc://:».

# Create the dataset however you were before using the tf.data service.
dataset = your_dataset_factory()

service = "grpc://{}:{}".format(dispatcher_address, dispatcher_port)
# This will register the dataset with the tf.data service cluster so that
# tf.data workers can run the dataset to produce elements. The dataset returned
# from applying `distribute` will fetch elements produced by tf.data workers.
dataset = dataset.apply(tf.data.experimental.service.distribute(
    processing_mode="parallel_epochs", service=service))

Ниже приведен пример, который вы можете запустить сами.

dispatcher = tf.data.experimental.service.DispatchServer()
dispatcher_address = dispatcher.target.split("://")[1]
worker = tf.data.experimental.service.WorkerServer(
    tf.data.experimental.service.WorkerConfig(
        dispatcher_address=dispatcher_address))
dataset = tf.data.Dataset.range(10)
dataset = dataset.apply(tf.data.experimental.service.distribute(
    processing_mode="parallel_epochs", service=dispatcher.target))
print(list(dataset.as_numpy_iterator()))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

См. документацию по tf.data.experimental.service.distribute для получения более подробной информации об использовании преобразования distribute.

Классы

class DispatchServer: Сервер диспетчера службы tf.data в процессе.

class DispatcherConfig: Класс конфигурации для диспетчеров службы tf.data.

class WorkerConfig: Класс конфигурации для диспетчеров службы tf.data.

class WorkerServer: Сервер рабочих узлов службы tf.data в процессе.

Функции

distribute(...): Преобразование, которое перемещает обработку набора данных в службу tf.data.

from_dataset_id(...): Создает набор данных, который считывает данные из службы tf.data.

register_dataset(...): Регистрирует набор данных в службе tf.data.

© 2020 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 3.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r2.4/api_docs/python/tf/data/experimental/service

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API