Spec-Zone.ru › TensorFlow 2.3

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

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

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

Руководства

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

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

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

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

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

    Переменные SyncOnRead вносят много трудностей в настройку для базовой логики, поэтому мы не рекомендуем пользователям создавать и использовать переменные SyncOnRead самостоятельно. Мы в основном использовали переменные SyncOnRead для таких случаев, как batch norm и метрики. По соображениям производительности часто не нужно синхронизировать эти статистические данные каждый шаг, и они могут накапливаться на каждой реплике независимо. Единственный момент, когда мы хотим их синхронизировать — это отчёт или сохранение контрольных точек, что обычно происходит в межрепликационном контексте. Переменные 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 HierarchicalCopyAllReduce: Сокращение с использованием иерархического копирования все-сокращения.

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

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 для алгоритмов, которые должны учитывать распределение.

Функции

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

Spec-Zone.ru

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