Spec-Zone.ru › TensorFlow 2.9

Модуль: tf.distribute

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

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

Руководства

  • 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 полезна для представления значений на нескольких устройствах, и она содержит отображение от идентификатора реплики к значениям. Два представительных вида 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.

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

experimental модуль: Экспериментальная библиотека стратегии распределения.

Классы

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

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

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

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

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

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

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

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

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

class MultiWorkerMirroredStrategy: Стратегия распределения для синхронного обучения на нескольких узлах.

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

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

class ParameterServerStrategy: Стратегия tf.distribute для многоузлового обучения с параметровыми серверами.

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

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

class ReplicaContext: Класс с набором 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 если в контексте межрепликационного взаимодействия.

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

Spec-Zone.ru

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