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'
)
Этот класс устарел. Для синхронного обучения используйте стратегии распределения Distribution Strategies.
В типичной асинхронной среде обучения часто встречаются устаревшие градиенты. Например, при асинхронном обучении с N репликами градиенты будут применяться к переменным независимо N раз. В зависимости от скорости обучения каждой реплики некоторые градиенты могут быть вычислены по копиям переменной из нескольких предыдущих шагов (в среднем N-1 шаг). Этот оптимизатор избегает устаревших градиентов, собирая градиенты со всех реплик, усредняя их, а затем применяя к переменным в один шаг, после чего реплики могут получить новые переменные и продолжить.
Создаются следующие аккумуляторы/очереди:
- N
gradient accumulators, по одной на каждую переменную для обучения. Градиенты отправляются в них, и главный рабочий процесс будет ждать, пока не будет собрано достаточно градиентов, а затем усреднит их перед применением к переменным. Аккумулятор будет отбрасывать все устаревшие градиенты (подробнее об этом в операции аккумулятора). - 1
tokenочередь, в которой оптимизатор отправляет новое значение global_step после обновления всех переменных.
Создается следующая локальная переменная:
-
sync_rep_local_step, по одной на каждую реплику. Сравнивается со значением global_step в каждом аккумуляторе для проверки устарелости градиентов.
Оптимизатор добавляет узлы в граф для сбора градиентов и приостановки обучения до тех пор, пока переменные не будут обновлены. Для задачи сервера параметров:
- Для каждой переменной создается аккумулятор, и каждая реплика отправляет градиенты в аккумуляторы вместо непосредственного применения к переменным.
- Каждый аккумулятор усредняет, когда будет накоплено достаточно градиентов (replicas_to_aggregate).
- Применяются усредненные градиенты к переменным.
- Только после обновления всех переменных увеличивается глобальный шаг.
- Только после шага 4, отправляется
global_stepвtoken_queue, по одному для каждой рабочей реплики. Рабочие процессы могут теперь получить глобальный шаг, использовать его для обновления своей локальной переменной local_step и начать следующую партию. Обратите внимание, что некоторые рабочие процессы могут потреблять несколько мини-пакетов, а некоторые — даже не один. Это потому, что каждый рабочий процесс получает мини-пакеты до тех пор, пока существует токен. Если какой-то рабочий процесс застрял по какой-либо причине и не использует токен, другой рабочий процесс может его использовать.
Для реплик:
- Начало шага: получение переменных и вычисление градиентов.
- После вычисления градиентов отправляются в аккумуляторы градиентов. Каждый аккумулятор проверит устарелость и отбросит устаревшие.
- После отправки всех градиентов из очереди берётся обновлённое значение глобального шага и записывается в локальную переменную local_step. Это фактически барьер.
- Начало следующей партии.
Использование
# 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)
В программе обучения каждый рабочий процесс выполняет операцию обучения так, как если бы она не была синхронизирована.
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])
| Args | |
|---|---|
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() из реального оптимизатора.
| Args | |
|---|---|
grads_and_vars | Список пар (градиент, переменная), возвращаемых compute_gradients(). |
global_step | Необязательная переменная, которая увеличивается на единицу после обновления переменных. |
name | Необязательное имя возвращаемой операции. По умолчанию используется имя, переданное конструктору Optimizer. |
| Возвращает | |
|---|---|
train_op | Операция для извлечения токена, чтобы реплики могли выйти из этой партии и начать следующую. Выполняется каждой репликой. |
| Исключения | |
|---|---|
ValueError | Если grads_and_vars пусто. |
ValueError | Если global step не предоставлен, проверка устарелости невозможна. |
compute_gradients
compute_gradients(
*args, **kwargs
)
Вычислить градиенты "loss" для переменных в "var_list".
Просто оборачивает compute_gradients() из реального оптимизатора. Градиенты будут агрегироваться в apply_gradients(), поэтому пользователь может изменять градиенты, например, применять ограничение нормы по глобальному значению каждой реплики, если необходимо. Глобальная норма с агрегированными градиентами может быть некорректной, так как огромные градиенты одной реплики могут ухудшить градиенты других реплик.
| Args | |
|---|---|
*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.
| Args | |
|---|---|
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 | |
|---|---|
*args | Аргументы для get_slot(). |
**kwargs | Параметры для get_slot(). |
| Возвращает | |
|---|---|
Переменную для слота, если она была создана, 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/r2.4/api_docs/python/tf/compat/v1/train/SyncReplicasOptimizer