Spec-Zone.ru › TensorFlow

tf.compat.v1.train.SyncReplicasOptimizer

Класс для синхронизации и агрегирования градиентов с последующей передачей их оптимизатору.

Наследуется от: Optimizer

tf.compat.v1.train.SyncReplicasOptimizer(
    opt,
    replicas_to_aggregate,
    total_num_replicas=None,
    variable_averages=None,
    variables_to_average=None,
    use_locking=False,
    name='sync_replicas'
)

Этот класс устарел. Для синхронного обучения используйте стратегии распределения.

В типичной среде асинхронного обучения часто встречаются устаревшие градиенты. Например, при асинхронном обучении с N репликами градиенты независимо применяются к переменным N раз. В зависимости от скорости обучения каждой реплики некоторые градиенты могут быть вычислены на основе копий переменных, полученных несколько шагов назад (в среднем на N-1 шагов). Этот оптимизатор предотвращает использование устаревших градиентов: собирает градиенты всех реплик, усредняет их и применяет к переменным за один шаг, после чего реплики могут получить новые переменные и продолжить работу.

Создаются следующие аккумуляторы и очередь:

  • N gradient accumulators, по одному на каждую обучаемую переменную. Градиенты помещаются в них, а главный рабочий узел ожидает сбора достаточного количества градиентов, после чего усредняет их и применяет к переменным. Аккумулятор отбрасывает все устаревшие градиенты (подробнее см. в операции аккумулятора).
  • 1 token очередь, в которую оптимизатор помещает новое значение global_step после обновления всех переменных.

Создается следующая локальная переменная:

  • sync_rep_local_step, по одной на каждую реплику. Сравнивается с global_step в каждом аккумуляторе для проверки актуальности градиентов.

Оптимизатор добавляет в граф узлы для сбора градиентов и приостанавливает обучение до обновления переменных. Для задания Parameter Server:

  1. Для каждой переменной создается аккумулятор, и каждая реплика помещает градиенты в аккумуляторы, а не применяет их напрямую к переменным.
  2. Каждый аккумулятор выполняет усреднение после накопления достаточного количества градиентов (replicas_to_aggregate).
  3. Усредненные градиенты применяются к переменным.
  4. Глобальный шаг увеличивается только после обновления всех переменных.
  5. Только после шага 4 в token_queue помещаются global_step — по одному для каждой рабочей реплики. Теперь рабочие узлы могут получить глобальный шаг, использовать его для обновления своей переменной local_step и начать следующий пакет. Обратите внимание: некоторые рабочие узлы могут обработать несколько мини-пакетов, а некоторые — ни одного. Это происходит потому, что каждый рабочий узел получает мини-пакеты, пока в очереди есть токен. Если какой-либо рабочий узел по какой-то причине остановится и не использует токен, его может использовать другой узел.

Для реплик:

  1. Начните шаг: получите переменные и вычислите градиенты.
  2. После вычисления градиентов поместите их в аккумуляторы градиентов. Каждый аккумулятор проверит их актуальность и отбросит устаревшие.
  3. Поместив все градиенты, извлеките обновленное значение global_step из очереди токенов и запишите этот шаг в переменную local_step. Обратите внимание: по сути это барьер.
  4. Начните следующий пакет.

Использование

# Create any optimizer to update the variables, say a simple SGD:
opt = GradientDescentOptimizer(learning_rate=0.1)

# Wrap the optimizer with sync_replicas_optimizer with 50 replicas: at each
# step the optimizer collects 50 gradients before applying to variables.
# Note that if you want to have 2 backup replicas, you can change
# total_num_replicas=52 and make sure this number matches how many physical
# replicas you started in your job.
opt = tf.compat.v1.train.SyncReplicasOptimizer(opt, replicas_to_aggregate=50,
                               total_num_replicas=50)

# Some models have startup_delays to help stabilize the model but when using
# sync_replicas training, set it to 0.

# Now you can call `minimize()` or `compute_gradients()` and
# `apply_gradients()` normally
training_op = opt.minimize(total_loss, global_step=self.global_step)


# You can create the hook which handles initialization and queues.
sync_replicas_hook = opt.make_session_run_hook(is_chief)

В программе обучения каждый рабочий узел выполняет train_op так, как если бы синхронизация не использовалась.

with training.MonitoredTrainingSession(
    master=workers[worker_id].target, is_chief=is_chief,
    hooks=[sync_replicas_hook]) as mon_sess:
  while not mon_sess.should_stop():
    mon_sess.run(training_op)
Аргументы
opt Фактический оптимизатор, который будет использоваться для вычисления и применения градиентов. Должен быть одним из классов Optimizer.
replicas_to_aggregate Количество реплик, градиенты которых нужно агрегировать для обновления каждой переменной.
total_num_replicas Общее количество задач/рабочих узлов/реплик; оно может отличаться от replicas_to_aggregate. Если total_num_replicas > replicas_to_aggregate, значение равно backup_replicas + replicas_to_aggregate. Если total_num_replicas < replicas_to_aggregate, реплики вычисляют несколько пакетов на одно обновление переменных.
variable_averages Необязательный объект ExponentialMovingAverage для поддержания скользящих средних переданных переменных в variables_to_average.
variables_to_average Список переменных, для которых нужно вычислить среднее. Требуется только в том случае, если передан параметр variable_averages.
use_locking Если значение равно True, для операции обновления используются блокировки.
name Строка. Необязательное имя возвращаемой операции.

Методы

apply_gradients

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

apply_gradients(
    grads_and_vars, global_step=None, name=None
)

Применяет градиенты к переменным.

Содержит большую часть логики синхронизации, а также оборачивает apply_gradients() фактического оптимизатора.

Аргументы
grads_and_vars Список пар (градиент, переменная), возвращаемый методом compute_gradients().
global_step Необязательная переменная, значение которой увеличивается на единицу после обновления переменных.
name Необязательное имя возвращаемой операции. По умолчанию используется имя, переданное конструктору Optimizer.
Возвращает
train_op Операцию извлечения токена, позволяющую репликам завершить этот пакет и начать следующий. Выполняется каждой репликой.
Вызывает исключения
ValueError Если grads_and_vars пуст.
ValueError Если глобальный шаг не задан, проверить актуальность градиентов невозможно.

compute_gradients

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

compute_gradients(
    *args, **kwargs
)

Вычисляет градиенты функции потерь "loss" для переменных из "var_list".

Метод просто оборачивает compute_gradients() фактического оптимизатора. Градиенты агрегируются в apply_gradients(), чтобы пользователь мог при необходимости изменять их, например обрезать по глобальной норме для каждой реплики. Глобальная норма агрегированных градиентов может быть неудачным решением, поскольку огромные градиенты одной реплики могут ухудшить градиенты остальных реплик.

Аргументы
*args Аргументы для compute_gradients().
**kwargs Именованные аргументы для compute_gradients().
Возвращает
Список пар (градиент, переменная).

get_chief_queue_runner

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

get_chief_queue_runner()

Возвращает QueueRunner для выполнения главным рабочим узлом.

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

Обратите внимание: этот метод можно вызвать только после apply_gradients(), который создает этот QueueRunner.

Возвращает
QueueRunner для выполнения главным рабочим узлом.
Вызывает исключения
ValueError Если метод вызван до apply_gradients().

get_init_tokens_op

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

get_init_tokens_op(
    num_tokens=-1
)

Возвращает операцию заполнения sync_token_queue токенами.

Она должна выполняться в начале работы главного/синхронизирующего потока, чтобы модель могла продолжать работу даже в том случае, если total_num_replicas меньше replicas_to_aggregate, поскольку реплики могут выполнять несколько шагов на одно обновление переменных. Убедитесь, что выполнено условие: num_tokens >= replicas_to_aggregate - total_num_replicas.

Аргументы
num_tokens Количество токенов, добавляемых в очередь.
Возвращает
Операцию заполнения очереди токенов главным/синхронизирующим рабочим узлом.
Вызывает исключения
ValueError Если метод вызван до apply_gradients().
ValueError Если num_tokens меньше, чем replicas_to_aggregate - total_num_replicas.

get_name

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

get_name()

get_slot

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

get_slot(
    *args, **kwargs
)

Возвращает слот с именем "name", созданный оптимизатором для "var".

Метод просто оборачивает get_slot() фактического оптимизатора.

Аргументы
*args Аргументы для get_slot().
**kwargs Именованные аргументы для get_slot().
Возвращает
Variable слота, если он был создан, и None в противном случае.

get_slot_names

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

get_slot_names(
    *args, **kwargs
)

Возвращает список имен слотов, созданных Optimizer.

Метод просто оборачивает get_slot_names() фактического оптимизатора.

Аргументы
*args Аргументы для get_slot().
**kwargs Именованные аргументы для get_slot().
Возвращает
Список строк.

make_session_run_hook

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

make_session_run_hook(
    is_chief, num_tokens=-1
)

Создает хук для обработки операций SyncReplicasHook, например инициализации.

minimize

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

minimize(
    loss,
    global_step=None,
    var_list=None,
    gate_gradients=GATE_OP,
    aggregation_method=None,
    colocate_gradients_with_ops=False,
    name=None,
    grad_loss=None
)

Добавляет операции для минимизации loss путем обновления var_list.

Этот метод объединяет вызовы compute_gradients() и apply_gradients(). Если перед применением нужно обработать градиент, вместо этой функции явно вызовите compute_gradients() и apply_gradients().

Аргументы
loss Tensor, содержащее значение, которое нужно минимизировать.
global_step Необязательный Variable, значение которого увеличивается на единицу после обновления переменных.
var_list Необязательный список или кортеж объектов Variable для обновления с целью минимизации loss. По умолчанию используется список переменных, собранных в графе под ключом GraphKeys.TRAINABLE_VARIABLES.
gate_gradients Способ управления вычислением градиентов. Может принимать значения GATE_NONE, GATE_OP или GATE_GRAPH.
aggregation_method Задает способ объединения слагаемых градиента. Допустимые значения определены в классе AggregationMethod.
colocate_gradients_with_ops Если значение равно True, предпринимается попытка разместить градиенты рядом с соответствующей операцией.
name Необязательное имя возвращаемой операции.
grad_loss Необязательный параметр. Tensor, содержащий градиент, вычисленный для loss.
Возвращает
Операцию, которая обновляет переменные в var_list. Если global_step не был None, эта операция также увеличивает global_step.
Вызывает исключения
ValueError Если некоторые переменные не являются объектами Variable.

совместимость с eager-режимом

Если eager-выполнение включено, loss должна быть функцией Python без аргументов, вычисляющей минимизируемое значение. Минимизация (и вычисление градиента) выполняется относительно элементов var_list, если он не равен None, либо относительно любых обучаемых переменных, созданных во время выполнения функции loss. При включенном eager-выполнении параметры gate_gradients, aggregation_method, colocate_gradients_with_ops и grad_loss игнорируются.

variables

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

variables()

Получает список переменных оптимизатора в графе по умолчанию.

Оборачивает variables() фактического оптимизатора. Не включает локальный шаг SyncReplicasOptimizer.

Возвращает
Список переменных.
Переменные класса
GATE_GRAPH 2
GATE_NONE 0
GATE_OP 1

© 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/api_docs/python/tf/compat/v1/train/SyncReplicasOptimizer

Spec-Zone.ru

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