Модуль: tf.compat.v1.data.experimental.service
API для использования сервиса tf.data.
Этот модуль содержит:
- Реализации серверов tf.data для запуска сервиса tf.data.
- Преобразование набора данных
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). При включенном режиме устойчивости к отказам диспечер будет записывать свое состояние в рабочую директорию, чтобы при перезапуске диспечера не терялось состояние.
WorkerServers можно свободно перезапускать, добавлять или удалять во время обучения. При запуске рабочие узлы регистрируются у диспечера и начинают обрабатывать все ожидающие задания с самого начала.
Использование сервиса 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 DispatcherConfig: Класс конфигурации для диспечеров сервиса tf.data.
class WorkerConfig: Класс конфигурации для рабочих узлов сервиса 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/compat/v1/data/experimental/service