Spec-Zone.ru › TensorFlow 1.15

tf.train.SyncReplicasOptimizer

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

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

Просмотр псевдонимов

Псевдонимы совместимости для миграции

См. Руководство по миграции для получения более подробной информации.

tf.compat.v1.train.SyncReplicasOptimizer

tf.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 в каждом аккумуляторе для проверки устарелости градиентов.

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

  1. Для каждой переменной создается аккумулятор, и каждая реплика отправляет градиенты в аккумуляторы вместо непосредственного применения к переменным.
  2. Каждый аккумулятор усредняет градиенты, когда накопится достаточно градиентов (replicas_to_aggregate).
  3. Применить усредненные градиенты к переменным.
  4. Только после обновления всех переменных увеличивается глобальный шаг.
  5. Только после шага 4, отправляет global_step в token_queue, один раз для каждой рабочей реплики. Рабочие процессы теперь могут получить глобальный шаг, использовать его для обновления своей локальной переменной 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)

Чтобы использовать SyncReplicasOptimizer с Estimator, вам необходимо отправить sync_replicas_hook при вызове fit.

my_estimator = DNNClassifier(..., optimizer=opt)
my_estimator.fit(..., hooks=[sync_replicas_hook])
Аргументы
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. gate_gradients, aggregation_method, colocate_gradients_with_ops и grad_loss игнорируются при включенном eager выполнении.

variables

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

variables()

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

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

Возвращает
Список переменных.

Переменные класса

  • GATE_GRAPH = 2
  • GATE_NONE = 0
  • GATE_OP = 1

© 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/r1.15/api_docs/python/tf/train/SyncReplicasOptimizer

Spec-Zone.ru

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