Spec-Zone.ru › TensorFlow 2.3

Модуль: tf.distribute

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

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

Руководства

  • 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.experimental_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 в противном случае.

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

  • Зеркальные переменные: это переменные, создаваемые на нескольких устройствах, где мы поддерживаем синхронизацию переменных, применяя одни и те же обновления к каждой копии. Зеркальные переменные создаются с помощью 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 модуль: экспериментальная библиотека стратегий распределения.

Классы

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

class DistributedDataset: Представляет набор данных, распределённый между устройствами и машинами.

class DistributedIterator: Итератор по tf.distribute.DistributedDataset.

END_OF_DOCUMENT_MARKER

class DistributedValues: Базовый класс для представления распределённых значений.

class HierarchicalCopyAllReduce: Редукция с помощью иерархического копирования all-reduce.

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

class InputOptions: Параметры выполнения для experimental_distribute_dataset(s_from_function).

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

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

class NcclAllReduce: Редукция с использованием NCCL all-reduce.

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

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

class ReductionToOneDevice: Всегда сначала выполняется редукция на одно устройство, а затем вещание.

class ReplicaContext: tf.distribute.Strategy API в контексте реплики.

class RunOptions: Параметры выполнения для strategy.run.

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

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

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

class TPUStrategy: Синхронное обучение на TPU и TPU-подсистемах.

Функции

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

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.3/api_docs/python/tf/distribute

Spec-Zone.ru

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