Spec-Zone.ru › TensorFlow 2.3

tf.compat.v1.distribute.StrategyExtended

Дополнительные API для алгоритмов, которые должны быть aware распределения.

Унаследован от: StrategyExtended

tf.compat.v1.distribute.StrategyExtended(
    container_strategy
)
Примечание: При большинстве применений tf.distribute.Strategy, вызова этих методов не требуется, так как библиотеки TensorFlow (например, оптимизаторы) уже вызывают эти методы при необходимости от вашего имени.

Некоторые общие случаи использования функций на этой странице:

  • Локализация

tf.distribute.DistributedValues может иметь ту же локализацию, что и распределённая переменная, что приводит к наличию зеркального значения на тех же устройствах, что и переменная (в отличие от вычислительных устройств). Такие значения могут быть переданы в вызов tf.distribute.StrategyExtended.update для обновления значения переменной. Вы можете использовать tf.distribute.StrategyExtended.colocate_vars_with для присвоения переменной той же локализации, что и другой переменной. Вы можете преобразовать значение «PerReplica» в локализацию переменной, используя tf.distribute.StrategyExtended.reduce_to или tf.distribute.StrategyExtended.batch_reduce_to.

  • Как обновить распределённую переменную

Распределённая переменная — это переменные, созданные на нескольких устройствах. Как обсуждалось в словаре терминов, зеркальная переменная и переменная SyncOnRead являются двумя примерами. Стандартный шаблон для обновления распределённых переменных состоит в следующем:

  1. В вашей функции, переданной в tf.distribute.Strategy.run, вычислите список пар (обновление, переменная). Например, обновление может быть градиентом потери относительно переменной.
  2. Переключитесь на межрепликационный режим, вызвав tf.distribute.get_replica_context().merge_call() с обновлениями и переменными в качестве аргументов.
  3. Вызовите tf.distribute.StrategyExtended.reduce_to(VariableAggregation.SUM, t, v) (для одной переменной) или tf.distribute.StrategyExtended.batch_reduce_to (для списка переменных) для суммирования обновлений.
  4. Вызовите tf.distribute.StrategyExtended.update(v) для каждой переменной, чтобы обновить её значение.

Шаги 2–4 выполняются автоматически классом tf.keras.optimizers.Optimizer, если вы вызываете его метод tf.keras.optimizers.Optimizer.apply_gradients в контексте реплики.

На самом деле, более высокое решение для обновления распределённой переменной — это вызов assign на переменной, как вы это делали бы с обычной tf.Variable. Вы можете вызвать метод как в контексте реплики, так и в контексте межрепликации. Для зеркальной переменной вызов assign в контексте реплики требует указания типа aggregation в конструкторе переменной. В этом случае переключение контекста и синхронизация, описанные в шагах 2–4, выполняются за вас. Если вы вызываете assign на зеркальной переменной в контексте межрепликации, вы можете присвоить только одно значение или значения из другой зеркальной переменной или зеркального tf.distribute.DistributedValues. Для переменной SyncOnRead в контексте реплики вы можете просто вызвать assign на ней, и агрегация не происходит в фоновом режиме. В контексте межрепликации вы можете присвоить только одно значение переменной SyncOnRead. Один примерный случай — восстановление из контрольной точки: если тип aggregation переменной — tf.VariableAggregation.SUM, предполагается, что репликационные значения были добавлены до создания контрольной точки, поэтому во время восстановления значение делится на количество реплик, а затем присваивается каждой реплике; если тип aggregation — tf.VariableAggregation.MEAN, значение присваивается каждой реплике непосредственно.

Атрибуты
experimental_between_graph Использует ли стратегия межграфическую репликацию или нет.

Ожидается, что это вернёт постоянное значение, которое не будет изменено в течение всего жизненного цикла.

experimental_require_static_shapes Возвращает True , если требуется статическая форма; False в противном случае.
experimental_should_init Требуется ли инициализация.
parameter_devices Возвращает кортеж всех устройств, используемых для размещения переменных.
should_checkpoint Требуется ли создание контрольной точки.
should_save_summary Требуется ли сохранение сводок.
worker_devices Возвращает кортеж всех устройств, используемых для вычислительной репликации.

Методы

batch_reduce_to

Просмотреть исходный код

batch_reduce_to(
    reduce_op, value_destination_pairs, experimental_hints=None
)

Объединяет несколько вызовов reduce_to в один для ускорения выполнения.

Аргументы
reduce_op Тип редукции, экземпляр перечисления tf.distribute.ReduceOp.
value_destination_pairs Последовательность пар (значение, назначения). См. reduce_to() для описания.
experimental_hints tf.distrbute.experimental.CollectiveHints. Подсказки для выполнения коллективных операций.
Возвращаемое значение
Список зеркальных значений, по одному на пару в value_destination_pairs.

broadcast_to

Просмотреть исходный код

broadcast_to(
    tensor, destinations
)

Зеркалирует тензор на одном устройстве на все рабочие устройства.

Аргументы
tensor Значение тензора для зеркалирования.
destinations Зеркальная переменная или строка устройства, указывающая устройства назначения для копирования tensor.
Возвращаемое значение
Значение, зеркально отраженное на устройствах destinations.

call_for_each_replica

Просмотреть исходный код

call_for_each_replica(
    fn, args=(), kwargs=None
)

Выполняет fn один раз для каждой реплики.

fn может вызвать tf.get_replica_context() для доступа к методам, таким как replica_id_in_sync_group и merge_call().

merge_call() используется для связи между репликами и повторного входа в межрепликационный контекст. Все реплики приостанавливают выполнение, столкнувшись с вызовом merge_call(). После этого выполняется функция merge_fn. Результаты затем распаковываются и возвращаются каждому вызову реплики. После этого выполнение возобновляется до завершения fn или встречи с другим merge_call(). Пример:

# Called once in "cross-replica" context.
def merge_fn(distribution, three_plus_replica_id):
  # sum the values across replicas
  return sum(distribution.experimental_local_results(three_plus_replica_id))

# Called once per replica in `distribution`, in a "replica" context.
def fn(three):
  replica_ctx = tf.get_replica_context()
  v = three + replica_ctx.replica_id_in_sync_group
  # Computes the sum of the `v` values across all replicas.
  s = replica_ctx.merge_call(merge_fn, args=(v,))
  return s + v

with distribution.scope():
  # in "cross-replica" context
  ...
  merged_results = distribution.run(fn, args=[3])
  # merged_results has the values from every replica execution of `fn`.
  # This statement prints a list:
  print(distribution.experimental_local_results(merged_results))
Аргументы
fn Функция для выполнения (будет выполнена один раз для каждой реплики).
args Кортеж или список с позиционными аргументами для fn.
kwargs Словарь с ключевыми аргументами для fn.
Возвращаемое значение
Объединённое возвращаемое значение fn по всем репликам.

colocate_vars_with

Просмотреть исходный код

colocate_vars_with(
    colocate_with_variable
)

Область, управляющая устройствами, на которых будут созданы переменные.

Внутри этой области не следует добавлять операции в граф, она должна использоваться только при создании переменных (некоторые реализации работают, изменяя создание переменных, другие — используя область tf.compat.v1.colocate_with()).

Это может быть использовано только внутри self.scope().

Пример использования:

with strategy.scope():
  var1 = tf.Variable(...)
  with strategy.extended.colocate_vars_with(var1):
    # var2 and var3 will be created on the same device(s) as var1
    var2 = tf.Variable(...)
    var3 = tf.Variable(...)

  def fn(v1, v2, v3):
    # operates on v1 from var1, v2 from var2, and v3 from var3

  # `fn` runs on every device `var1` is on, `var2` and `var3` will be there
  # too.
  strategy.extended.update(var1, fn, args=(var2, var3))
Аргументы
colocate_with_variable Переменная, созданная в scope() этой стратегии. Переменные, созданные во время работы с возвращённым менеджером контекста, будут на том же наборе устройств, что и colocate_with_variable.
Возвращаемое значение
Менеджер контекста.

experimental_make_numpy_dataset

Просмотреть исходный код

experimental_make_numpy_dataset(
    numpy_input, session=None
)

Создаёт набор данных для ввода, предоставленного через массив NumPy.

Это позволяет избежать добавления numpy_input как большой константы в граф и копирует данные на машину или машины, которые будут обрабатывать ввод.

Аргументы
numpy_input Вложенный набор входных массивов NumPy, которые будут равномерно распределены по всем репликам. Обратите внимание, что списки массивов NumPy складываются, так как это стандартное tf.data.Dataset поведение.
session (Только для выполнения графа TensorFlow v1.x) Сессия, используемая для инициализации.
Возвращаемое значение
Объект tf.data.Dataset, представляющий numpy_input.

experimental_run_steps_on_iterator

Просмотреть исходный код

experimental_run_steps_on_iterator(
    fn, iterator, iterations=1, initial_loop_values=None
)

УСТЕРЕЖДАЕТСЯ: пожалуйста, используйте run вместо этого.

Выполните fn с входными данными из iterator iterations раз.

Этот метод можно использовать для многократного выполнения функции шага обучения с использованием входных данных из набора данных.

Аргументы
fn Функция, выполняемая с помощью этой стратегии распределения. Функция должна иметь следующую сигнатуру: def fn(context, inputs). context — экземпляр MultiStepContext, который будет передан при выполнении fn. context можно использовать для указания выходных данных, возвращаемых из fn вызовом context.set_last_step_output. Также его можно использовать для захвата не-тензорных выходных данных вызовом context.set_non_tensor_output. См. документацию по MultiStepContext для получения дополнительной информации. inputs будет иметь тот же тип/структуру, что и iterator.get_next(). Как правило, fn использует метод call_for_each_replica стратегии для распределения вычислений по нескольким репликам.
iterator Итератор набора данных, представляющего входные данные для fn. Вызывающая сторона отвечает за инициализацию итератора по мере необходимости.
iterations (Необязательно) Количество итераций, которое fn должен выполнить. По умолчанию равно 1.
initial_loop_values (Необязательно) Начальные значения, которые нужно передать в цикл, выполняющий fn. По умолчанию None. Агрумент initial_loop_values используется, когда у нас есть механизм для вывода результатов fn.
Возвращаемое значение
Возвращает объект MultiStepContext, который, помимо прочего, имеет следующие свойства:
  • run_op: Операция, выполняющая fn iterations раз.
  • last_step_outputs: Словарь, содержащий тензоры, установленные с помощью context.set_last_step_output. Оценка этого возвращает значение тензоров после последней итерации.
  • non_tensor_outputs: Словарь, содержащий всё, что было установлено с помощью fn вызовом context.set_non_tensor_output.

read_var

Просмотреть исходный код

read_var(
    v
)

Считывает значение переменной.

Возвращает агрегированное значение реплика-локальной переменной или (только для чтения) значение любой другой переменной.

Аргументы
v Переменная, выделенная в рамках области действия этого tf.distribute.Strategy.
Возвращаемое значение
Тензор, представляющий значение v, агрегированный по репликам при необходимости.

reduce_to

Просмотреть исходный код

reduce_to(
    reduce_op, value, destinations, experimental_hints=None
)

Объединить (например, суммировать или усреднить) значения по репликам.

Аргументы
reduce_op Тип сокращения, экземпляр перечисления tf.distribute.ReduceOp.
value Значение на каждую реплику, одно значение на реплику.
destinations Зеркальная переменная, тензор на каждую реплику или строка устройства. Возвращаемое значение будет скопировано на все целевые устройства (или все устройства, где находится значение destinations). Для выполнения all-reduction передайте value в destinations.
experimental_hints tf.distrbute.experimental.CollectiveHints. Подсказки для выполнения коллективных операций.
Возвращаемое значение
Тензор или значение, зеркально отображённое на destinations.

update

Просмотреть исходный код

update(
    var, fn, args=(), kwargs=None, group=True
)

Выполнить fn для обновления var с использованием входных данных, зеркально отображённых на одних и тех же устройствах.

tf.distribute.StrategyExtended.update принимает распределённую переменную var для обновления, функцию обновления fn, а также args и kwargs для fn. Она применяет fn к каждой составляющей переменной var и передаёт соответствующие значения из args и kwargs. Ни args, ни kwargs не могут содержать значения на каждую реплику. Если они содержат зеркальные значения, они будут распакованы перед вызовом fn. Например, fn может быть assign_add, а args — зеркальным DistributedValues, где каждый компонент содержит значение, которое нужно добавить к этой зеркальной переменной var. Вызов update вызовет assign_add для каждой составляющей переменной var со соответствующим тензорным значением на этом устройстве.

Пример использования:

strategy = tf.distribute.MirroredStrategy(['/gpu:0', '/gpu:1']) # With 2 devices
with strategy.scope():
  v = tf.Variable(5.0, aggregation=tf.VariableAggregation.SUM)
def update_fn(v):
  return v.assign(1.0)
result = strategy.extended.update(v, update_fn)
# result is
# Mirrored:{
#  0: tf.Tensor(1.0, shape=(), dtype=float32),
#  1: tf.Tensor(1.0, shape=(), dtype=float32)
# }

Если var зеркально отображается на нескольких устройствах, этот метод реализует следующий алгоритм:

results = {}
for device, v in var:
  with tf.device(device):
    # args and kwargs will be unwrapped if they are mirrored.
    results[device] = fn(v, *args, **kwargs)
return merged(results)

В противном случае, этот метод возвращает fn(var, *args, **kwargs) с размещением на том же устройстве, что и var.

Аргументы
var Переменная, возможно, зеркально отображённая на нескольких устройствах, для обработки.
fn Функция для вызова. Должна принимать переменную в качестве первого аргумента.
args Кортеж или список. Дополнительные позиционные аргументы для передачи в fn().
kwargs Словарь с именованными аргументами для передачи в fn().
group Булево значение. По умолчанию True. Если False, возвращаемое значение будет распаковано.
Возвращаемое значение
По умолчанию, объединённое возвращаемое значение fn по всем репликам. Объединённый результат имеет зависимости, чтобы гарантировать, что если он вообще оценивается, побочные эффекты (обновления) произойдут на каждой реплике. Если вместо этого задано «group=False», эта функция вернёт вложенный список списков, где каждый список имеет элемент на каждую реплику, и вызывающая сторона отвечает за обеспечение выполнения всех элементов.

value_container

Просмотреть исходный код

value_container(
    value
)

Возвращает контейнер, к которому принадлежит эта реплика value.

Аргументы
value Значение, возвращённое run() или переменная, созданная в scope().
Возвращаемое значение
Контейнер, к которому принадлежит value. Если значение не принадлежит ни одному контейнеру (включая случай, когда контейнер был уничтожен), возвращает само значение. value in experimental_local_results(value_container(value)) всегда будет истинным.

variable_created_in_scope

Просмотреть исходный код

variable_created_in_scope(
    v
)

Проверяет, была ли v создана во время активности области действия этой стратегии.

Переменные, созданные внутри области действия стратегии, «принадлежат» ей:

strategy = tf.distribute.MirroredStrategy()
with strategy.scope():
  v = tf.Variable(1.)
strategy.extended.variable_created_in_scope(v)
True

Переменные, созданные за пределами области действия стратегии, ей не принадлежат:

strategy = tf.distribute.MirroredStrategy()
v = tf.Variable(1.)
strategy.extended.variable_created_in_scope(v)
False
Аргументы
v Экземпляр tf.Variable.
Возвращаемое значение
True, если v была создана внутри области действия, False — в противном случае.

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

Spec-Zone.ru

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