Spec-Zone.ru › TensorFlow 2.9

tf.compat.v1.distribute.StrategyExtended

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

Наследуется от: 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, options=None
)

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

Аналогично reduce_to, но принимает список пар (значение, назначения). Это более эффективно, чем уменьшение каждого значения по отдельности.

В настоящее время этот API может вызываться только в межрепликационном контексте. Другие варианты уменьшения значений по репликам:

  • tf.distribute.StrategyExtended.reduce_to: не-пакетная версия этого API.
  • tf.distribute.ReplicaContext.all_reduce: аналог этого API в репликационном контексте. Он поддерживает как пакетное, так и непакетное all-reduce.
  • tf.distribute.Strategy.reduce: более удобный метод для уменьшения до хоста в межрепликационном контексте.

См. reduce_to для получения дополнительной информации.

@tf.function
def step_fn(var):

  def merge_fn(strategy, value, var):
    # All-reduce the value. Note that `value` here is a
    # `tf.distribute.DistributedValues`.
    reduced = strategy.extended.batch_reduce_to(
        tf.distribute.ReduceOp.SUM, [(value, var)])[0]
    strategy.extended.update(var, lambda var, value: var.assign(value),
        args=(reduced,))

  value = tf.identity(1.)
  tf.distribute.get_replica_context().merge_call(merge_fn,
    args=(value, var))

def run(strategy):
  with strategy.scope():
    v = tf.Variable(0.)
    strategy.run(step_fn, args=(v,))
    return v

run(tf.distribute.MirroredStrategy(["GPU:0", "GPU:1"]))
MirroredVariable:{
  0: <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=2.0>,
  1: <tf.Variable 'Variable/replica_1:0' shape=() dtype=float32, numpy=2.0>
}
run(tf.distribute.experimental.CentralStorageStrategy(
    compute_devices=["GPU:0", "GPU:1"], parameter_device="CPU:0"))
<tf.Variable 'Variable:0' shape=() dtype=float32, numpy=2.0>
run(tf.distribute.OneDeviceStrategy("GPU:0"))
<tf.Variable 'Variable:0' shape=() dtype=float32, numpy=1.0>
Аргументы
reduce_op значение tf.distribute.ReduceOp, определяющее, как должны комбинироваться значения. Разрешает использовать строковое представление перечисления, например, "SUM", "MEAN".
value_destination_pairs последовательность пар (значение, назначения). См. tf.distribute.Strategy.reduce_to для описаний.
options tf.distribute.experimental.CommunicationOptions. Параметры для выполнения коллективных операций. Это переопределяет значения по умолчанию, если tf.distribute.Strategy принимает их в конструкторе. См. tf.distribute.experimental.CommunicationOptions для получения подробностей о параметрах.
Возвращает
Список уменьшенных значений, по одному на пару в 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 вместо этого. (устаревшее)
Устаревшее: ЭТА ФУНКЦИЯ УСТАРЕЛА. Она будет удалена в будущих версиях. Инструкции по обновлению: используйте 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.

non_slot_devices

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

non_slot_devices(
    var_list
)

Устройство(я) для переменных, не являющихся слотами.

Устаревшее: ТОЛЬКО TF 1.x.

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

with tf.distribute.StrategyExtended.colocate_vars_with(tf.distribute.StrategyExtended.non_slot_devices(...)):
  ...
Аргументы
var_list Список переменных, оптимизируемых, необходимых со стандартным tf.distribute.Strategy.
Возвращаемое значение
Последовательность устройств для переменных, не являющихся слотами.

read_var

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

read_var(
    v
)

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

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

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

reduce_to

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

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

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

reduce_to агрегирует tf.distribute.DistributedValues и распределённые переменные. Поддерживает как плотные значения, так и tf.IndexedSlices.

В настоящее время к этому API можно обращаться только в контексте между репликами. Другие варианты для уменьшения значений по репликам:

  • tf.distribute.StrategyExtended.batch_reduce_to: пакетная версия этого API.
  • tf.distribute.ReplicaContext.all_reduce: аналог этого API в контексте реплики. Поддерживает как пакетное, так и непакетное all-reduce.
  • tf.distribute.Strategy.reduce: более удобный метод для уменьшения до хоста в контексте между репликами.

destinations указывает, куда уменьшить значение, например, "GPU:0". Также можно передать Tensor, и пункты назначения будут устройством этого тензора. Для all-reduce передайте то же самое в value и destinations.

Он может использоваться в tf.distribute.ReplicaContext.merge_call для написания кода, который работает со всеми tf.distribute.Strategy.

@tf.function
def step_fn(var):

  def merge_fn(strategy, value, var):
    # All-reduce the value. Note that `value` here is a
    # `tf.distribute.DistributedValues`.
    reduced = strategy.extended.reduce_to(tf.distribute.ReduceOp.SUM,
        value, destinations=var)
    strategy.extended.update(var, lambda var, value: var.assign(value),
        args=(reduced,))

  value = tf.identity(1.)
  tf.distribute.get_replica_context().merge_call(merge_fn,
    args=(value, var))

def run(strategy):
  with strategy.scope():
    v = tf.Variable(0.)
    strategy.run(step_fn, args=(v,))
    return v

run(tf.distribute.MirroredStrategy(["GPU:0", "GPU:1"]))
MirroredVariable:{
  0: <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=2.0>,
  1: <tf.Variable 'Variable/replica_1:0' shape=() dtype=float32, numpy=2.0>
}
run(tf.distribute.experimental.CentralStorageStrategy(
    compute_devices=["GPU:0", "GPU:1"], parameter_device="CPU:0"))
<tf.Variable 'Variable:0' shape=() dtype=float32, numpy=2.0>
run(tf.distribute.OneDeviceStrategy("GPU:0"))
<tf.Variable 'Variable:0' shape=() dtype=float32, numpy=1.0>
Аргументы
reduce_op значение tf.distribute.ReduceOp, определяющее, как должны комбинироваться значения. Разрешает использовать строковое представление перечисления, например, "SUM", "MEAN".
value tf.distribute.DistributedValues или объект, подобный tf.Tensor.
destinations tf.distribute.DistributedValues, tf.Variable, объект, подобный tf.Tensor, или строка устройства. Указывает устройства для уменьшения. Для выполнения all-reduce передайте то же самое в value и destinations. Обратите внимание, что если это tf.Variable, значение уменьшается до устройств этой переменной, и этот метод не обновляет переменную.
options tf.distribute.experimental.CommunicationOptions. Параметры для выполнения коллективных операций. Переопределяет параметры по умолчанию, если tf.distribute.Strategy принимает их в конструкторе. См. tf.distribute.experimental.CommunicationOptions для подробностей о параметрах.
Возвращаемое значение
Тензор или значение, уменьшенное до 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", эта функция вернёт вложенный список списков, где каждый список содержит элемент на реплику, и вызывающая сторона отвечает за обеспечение выполнения всех элементов.

update_non_slot

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

update_non_slot(
    colocate_with, fn, args=(), kwargs=None, group=True
)

Выполняет fn(*args, **kwargs) на устройствах colocate_with.

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

Устарело: ТОЛЬКО TF 1.x.
Аргументы
colocate_with Устройства, возвращённые non_slot_devices().
fn Функция для выполнения.
args Кортеж или список. Позиционные аргументы для передачи в fn().
kwargs Словарь с ключевыми аргументами для передачи в fn().
group Булево значение. По умолчанию True. Если False, возвращаемое значение будет распаковано.
Возвращаемое значение
Возвращаемое значение fn, возможно, объединённое по устройствам.

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

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

Spec-Zone.ru

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