Spec-Zone.ru › TensorFlow 2.4

Модуль: tf.compat.v1.distribute

Библиотека для выполнения вычислений на нескольких устройствах.

Цель этой библиотеки — позволить вам писать алгоритм стилизованным способом, который будет пригоден для различных tf.distribute.Strategy реализаций. Каждый потомок будет реализовывать различную стратегию распределения алгоритма по нескольким устройствам/машинам. Кроме того, эти изменения могут быть скрыты внутри конкретных слоёв и других классов библиотеки, требующих специального обращения для работы в распределённой среде, так что большинство кода определения модели пользователя может выполняться без изменений. tf.distribute.Strategy API работает одинаково с немедленным и графическим выполнением.

Руководства

  • TensorFlow v2.x
  • TensorFlow v1.x

Учебники

  • Учебники по распределённому обучению

    Учебники охватывают, как использовать tf.distribute.Strategy для распределённого обучения с помощью собственных API Keras, пользовательских циклов обучения и API Esitmator. Они также охватывают, как сохранять/загружать модель при использовании tf.distribute.Strategy.

Глоссарий

  • Параллельное распределение данных — это когда мы запускаем несколько копий модели на разных наборах входных данных. Это контрастирует с параллелизмом модели, где мы разбиваем одну копию модели на несколько устройств. Примечание: мы пока поддерживаем только параллельное распределение данных, но надеемся добавить поддержку параллелизма модели в будущем.
  • Устройство — это процессор или ускоритель (например, GPU, TPU) на какой-либо машине, на котором TensorFlow может выполнять операции (см., например, tf.device). Вы можете иметь несколько устройств на одной машине или быть подключены к устройствам на нескольких машинах. Устройства, используемые для выполнения вычислений, называются рабочими устройствами. Устройства, используемые для хранения переменных, являются параметрическими устройствами. Для некоторых стратегий, таких как tf.distribute.MirroredStrategy, рабочие и параметрические устройства будут совпадать (см. зеркальные переменные ниже). Для других они будут разными. Например, tf.distribute.experimental.CentralStorageStrategy помещает переменные на одно устройство (которое может быть рабочим устройством или процессором), а tf.distribute.experimental.ParameterServerStrategy помещает переменные на отдельные машины, называемые серверами параметров (см. ниже).
  • Реплика — это одна копия модели, выполняемая на одном наборе входных данных. В настоящее время каждая реплика выполняется на своём собственном рабочем устройстве, но как только мы добавим поддержку параллелизма модели, реплика может охватывать несколько рабочих устройств.
  • Хост — это процессорное устройство на машине с рабочими устройствами, обычно используемое для запуска конвейеров входных данных.
  • Рабочий определяется как физическая машина(ы), содержащая физические устройства (например, GPU, TPU), на которых выполняется дублирующее вычисление. Рабочий может содержать одну или несколько реплик, но содержит по крайней мере одну реплику. Обычно один рабочий будет соответствовать одной машине, но в случае очень больших моделей с параллелизмом моделей один рабочий может охватывать несколько машин. Обычно мы запускаем один конвейер входных данных на один рабочий, подавая все реплики на этом рабочем.
  • Синхронное, или чаще синхронное, обучение — это когда обновления от каждой реплики агрегируются вместе перед обновлением переменных модели. Это в отличие от асинхронного, или асинхронного, обучения, где каждая реплика обновляет переменные модели независимо. Также могут быть реплики, разделённые на группы, которые синхронизированы внутри каждой группы, но асинхронны между группами.
  • Серверы параметров: Это машины, которые хранят одну копию параметров/переменных, используемые некоторыми стратегиями (на данный момент только tf.distribute.experimental.ParameterServerStrategy). Все реплики, которые хотят работать с переменной, извлекают её в начале шага и отправляют обновление для применения в конце шага. В принципе, они могут поддерживать как синхронное, так и асинхронное обучение, но на данный момент мы поддерживаем только асинхронное обучение с серверами параметров. Сравните с tf.distribute.experimental.CentralStorageStrategy, который помещает все переменные на одно устройство на одной машине (и выполняет синхронное обучение), и tf.distribute.MirroredStrategy, который дублирует переменные на несколько устройств (см. ниже).

  • Контекст реплики против межрепликационного контекста против контекста обновления

    Контекст реплики применяется при выполнении функции вычисления, которая была вызвана с strategy.run. Понятийно, вы находитесь в контексте реплики при выполнении функции вычисления, которая дублируется.

    Контекст обновления вводится в вызове tf.distribute.StrategyExtended.update.

    Межрепликационный контекст вводится при входе в strategy.scope. Это полезно для вызова методов tf.distribute.Strategy, которые работают с репликами (например, reduce_to()). По умолчанию вы начинаете в контексте реплики («по умолчанию единственный контекст реплики»), а затем некоторые методы могут переключать вас туда и обратно.

  • Распределённое значение: Распределённое значение представлено базовым классом tf.distribute.DistributedValues. tf.distribute.DistributedValues полезно для представления значений на нескольких устройствах, и оно содержит отображение от идентификатора реплики к значениям. Два представительных типа tf.distribute.DistributedValues — «PerReplica» и «Mirrored» значения.

    Значения «PerReplica» существуют на рабочих устройствах с разными значениями для каждой реплики. Они генерируются путем итерации по распределённому набору данных, возвращаемому tf.distribute.Strategy.experimental_distribute_dataset и tf.distribute.Strategy.distribute_datasets_from_function. Они также являются типичным результатом, возвращаемым tf.distribute.Strategy.run.

    Значения «Mirrored» похожи на значения «PerReplica», за исключением того, что мы знаем, что значение на всех репликах одинаково. Мы можем безопасно читать значение «Mirrored» в межрепликационном контексте, используя значение любой реплики.

  • Распаковка и слияние: Рассмотрим вызов функции fn на нескольких репликах, как strategy.run(fn, args=[w]) с аргументом w , который является tf.distribute.DistributedValues. Это означает, что w будет иметь отображение, принимающее идентификатор реплики 0 к w0, идентификатор реплики 1 к w1 и т. д. strategy.run() распаковывает w перед вызовом fn, поэтому он вызывает fn(w0) на устройстве d0, fn(w1) на устройстве d1 и т. д. Затем он объединяет возвращаемые значения от fn(), что приводит к одному общему объекту, если возвращаемые значения являются одним и тем же объектом от каждой реплики, или объекту DistributedValues в противном случае.

  • Сведения и все-сведение: Сведение — это метод агрегирования нескольких значений в одно значение, например, «сумма» или «среднее». Если стратегия выполняет синхронное обучение, мы выполним сведение градиентов к параметру со всех реплик перед применением обновления. Все-сведение — это алгоритм выполнения сведения над значениями с нескольких устройств и обеспечения доступности результата на всех этих устройствах.

  • Зеркальные переменные: Это переменные, созданные на нескольких устройствах, где мы сохраняем переменные в синхронизации, применяя одни и те же обновления к каждой копии. Зеркальные переменные создаются с помощью tf.Variable(...synchronization=tf.VariableSynchronization.ON_WRITE...). Обычно они используются только в синхронном обучении.

  • Переменные SyncOnRead

    Переменные SyncOnRead создаются с помощью tf.Variable(...synchronization=tf.VariableSynchronization.ON_READ...), и они создаются на нескольких устройствах. В контексте реплики каждая компонента переменной локальной реплики может выполнять чтение и запись без синхронизации друг с другом. Когда переменная SyncOnRead читается в межрепликационном контексте, значения компонентов переменных агрегируются и возвращаются.

    Переменные SyncOnRead вносят много проблем с настройкой в основной логике, поэтому мы не рекомендуем пользователям создавать и использовать переменные SyncOnRead самостоятельно. Мы в основном использовали переменные SyncOnRead для таких случаев, как нормализация по партиям и метрики. По соображениям производительности нам часто не нужно синхронизировать эти статистические данные каждый шаг, и их можно накапливать на каждой реплике независимо. Единственное время, когда мы хотим их синхронизировать, — это отчёт или создание контрольных точек, что обычно происходит в межрепликационном контексте. Переменные SyncOnRead также часто используются продвинутыми пользователями, которые хотят контролировать время агрегирования значений переменных. Например, пользователи иногда хотят поддерживать градиенты независимо на каждой реплике в течение нескольких шагов без агрегирования.

  • Слои, учитывающие распределение

    Слои обычно вызываются в контексте реплики, за исключением определения модели Keras функционального типа. tf.distribute.in_cross_replica_context позволит вам определить, в каком случае вы находитесь. Если вы находитесь в контексте реплики, функция tf.distribute.get_replica_context вернёт контекст реплики по умолчанию за пределами области стратегии, None внутри области стратегии и объект tf.distribute.ReplicaContext внутри области стратегии и внутри функции tf.distribute.Strategy.run. Объект ReplicaContext имеет метод all_reduce для агрегирования по всем репликам.

Обратите внимание, что мы предоставляем по умолчанию версию tf.distribute.Strategy, которая используется, когда ни одна другая стратегия не находится в области действия, обеспечивая тот же API с разумным поведением по умолчанию.

Модули

cluster_resolver модуль: Импорты библиотек для ClusterResolvers.

experimental модуль: Публичный API для пространства имён tf.distribute.experimental.

Классы

class CrossDeviceOps: Базовый класс для алгоритмов меж-устройства сведения и трансляции.

class HierarchicalCopyAllReduce: Иерархическая копия реализации все-сведения CrossDeviceOps.

END_OF_DOCUMENT_MARKER

class InputContext: Класс, оборачивающий информацию, необходимую для функции ввода.

class InputReplicationMode: Режим репликации для функции ввода.

class MirroredStrategy: Синхронное обучение на нескольких репликах на одном компьютере.

class NcclAllReduce: Реализация NCCL all-reduce для CrossDeviceOps.

class OneDeviceStrategy: Стратегия распределения для выполнения на одном устройстве.

class ReduceOp: Указывает, как набор значений должен быть уменьшен.

class ReductionToOneDevice: Реализация CrossDeviceOps, копирующая значения на одно устройство для уменьшения.

class ReplicaContext: Класс с набором API, которые можно вызывать в контексте реплики.

class RunOptions: Параметры запуска для strategy.run.

class Server: Сервер TensorFlow в процессе, для использования в распределенном обучении.

class Strategy: Список устройств с политикой распределения состояния и вычислений.

class StrategyExtended: Дополнительные API для алгоритмов, которые должны учитывать распределение.

Функции

experimental_set_strategy(...): Установка tf.distribute.Strategy в качестве текущей без with strategy.scope().

get_loss_reduction(...): tf.distribute.ReduceOp, соответствующий последнему уменьшению потерь.

get_replica_context(...): Возвращает текущий tf.distribute.ReplicaContext или None.

get_strategy(...): Возвращает текущий объект tf.distribute.Strategy.

has_strategy(...): Возвращает значение, если существует текущая не по умолчанию tf.distribute.Strategy.

in_cross_replica_context(...): Возвращает True если находится в контексте между репликами.

© 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/distribute

Spec-Zone.ru

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