Spec-Zone.ru › TensorFlow 2.9

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

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

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

Руководства

  • TensorFlow v2.x
  • TensorFlow v1.x

Учебники

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

    В учебниках описывается, как использовать tf.distribute.Strategy для распределённого обучения с помощью собственных API Keras, пользовательских циклов обучения и API Estimator. Они также описывают, как сохранять/загружать модель при использовании 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 полезно для представления значений на нескольких устройствах, и оно содержит отображение из id реплики в значения. Два представительных вида 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 будет иметь отображение, принимающее id реплики 0 в w0, id реплики 1 в w1 и т. д. strategy.run() распаковывает w перед вызовом fn, поэтому она вызывает fn(w0) на устройстве d0, fn(w1) на устройстве d1 и т. д. Затем она объединяет возвращаемые значения от fn(), что приводит к одному общему объекту, если возвращаемые значения являются одним и тем же объектом от каждой репликации, или объекту DistributedValues в противном случае.

  • Суммирование и все-reduce: Суммирование — это метод агрегирования нескольких значений в одно значение, например "сумма" или "среднее". Если стратегия выполняет синхронное обучение, мы выполним суммирование градиентов к параметру от всех репликаций перед применением обновления. Все-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 HierarchicalCopyAllReduce: Иерархическая реализация copy all-reduce алгоритма 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 если в контексте между репликами.

© 2022 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 4.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r2.9/api_docs/python/tf/compat/v1/distribute

Spec-Zone.ru

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