Модуль: tf.distribute
Библиотека для выполнения вычислений на нескольких устройствах.
Цель этой библиотеки — позволить вам стилизованно написать алгоритм, который будет работать с различными tf.distribute.Strategy реализациями. Каждый потомок будет реализовывать различную стратегию распределения алгоритма по нескольким устройствам/машинам. Кроме того, эти изменения могут быть скрыты внутри определенных слоев и других классов библиотеки, которые требуют специального обращения для работы в распределенной среде, так что код определения модели большинства пользователей может работать без изменений. tf.distribute.Strategy API работает одинаково с выполнением eager и graph.
Руководства
Учебники
-
Учебники по распределенному обучению
Учебники описывают, как использовать
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), на которых выполняется реплицированное вычисление. Рабочий может содержать одну или несколько реплик, но содержит как минимум одну реплику. Обычно один рабочий соответствует одной машине, но в случае очень больших моделей с параллелизмом модели один рабочий может охватывать несколько машин. Обычно мы запускаем один входной конвейер на один рабочий, подавая все реплики на этом рабочем.
- Синхронное, или чаще sync, обучение — это когда обновления от каждой реплики агрегируются вместе перед обновлением переменных модели. Это в отличие от асинхронного, или async, обучения, где каждая реплика обновляет переменные модели независимо. Также у вас могут быть реплики, разделенные на группы, которые синхронизированы внутри каждой группы, но асинхронны между группами.
Серверы параметров: это машины, которые хранят одну копию параметров/переменных, используемые некоторыми стратегиями (сейчас только
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 DistributedDataset: Представляет набор данных, распределённый по устройствам и машинам.
class DistributedIterator: Итератор по tf.distribute.DistributedDataset.
class DistributedValues: Базовый класс для представления распределённых значений.
class HierarchicalCopyAllReduce: Реализация распределённого вычисления «иерархическое копирование и всеобщее сокращение» для CrossDeviceOps.
class InputContext: Класс, оборачивающий информацию, необходимую для функции ввода.
class InputOptions: Параметры выполнения для experimental_distribute_dataset(s_from_function).
class InputReplicationMode: Режим репликации для функции ввода.
class MirroredStrategy: Синхронное обучение на нескольких репликах на одном компьютере.
class MultiWorkerMirroredStrategy: Стратегия распределения для синхронного обучения на нескольких рабочих узлах.
class NcclAllReduce: Реализация распределённого вычисления «NCCL всеобщее сокращение» для CrossDeviceOps.
class OneDeviceStrategy: Стратегия распределения для работы на одном устройстве.
class ReduceOp: Указывает, как набор значений должен быть уменьшен.
class ReductionToOneDevice: Реализация CrossDeviceOps, которая копирует значения на одно устройство для уменьшения.
class ReplicaContext: Класс с набором API, которые могут вызываться в контексте реплики.
class RunOptions: Параметры выполнения для strategy.run.
class Server: Встроенный сервер TensorFlow, используемый в распределённом обучении.
class Strategy: Политика распределения состояния и вычислений на списке устройств.
class StrategyExtended: Дополнительные API для алгоритмов, которые должны учитывать распределение.
class TPUStrategy: Синхронное обучение на TPUs и кластерах 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.4/api_docs/python/tf/distribute