Накапливать градиенты с распределенной стратегией в Tensorflow 2

#python #tensorflow #tensorflow2.0 #multi-gpu

#python #tensorflow #tensorflow2.0 #мульти-графический процессор

Вопрос:

Я реализовал распределенную стратегию для обучения моей модели на нескольких графических процессорах.

 strategy = tf.distribute.MirroredStrategy(devices=devices[:FLAGS.n_gpus])
strategy.run(fn=self.train_step, args=(model, data))
 

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

Теперь мой вопрос: возможно ли это вообще при использовании зеркальной стратегии? Я знаю, что потери и градиенты в любом случае объединяются по репликам, так есть ли способ суммировать их по репликам И, например, цикл, выполняемый по пакетам? Я попробовал простую вещь и вернул вычисленные градиенты для каждой реплики, чтобы добавлять и применять их за пределами strategy.run() подобного:

 for b in batches:
    per_replica_gradients = strategy.run(fn=self.train_step, args=(model, data))
    total_gradient  = per_replica_gradients
optimizer.apply_gradients(zip(total_gradient, model.trainable_variables)
 

но Tensorflow говорит мне, что это невозможно, и градиенты должны применяться внутри strategy.run() . Это также имеет смысл для меня, но мне интересно, есть ли возможность накапливать градиенты И использовать зеркальную стратегию?

Ответ №1:

Вы могли бы использовать tf.distribute.ReplicaContext.all_reduce : Это отличается от Strategy.reduce того, что оно предназначено для контекста реплики и не копирует результаты на хост-устройство. all_reduce обычно следует использовать для сокращений внутри шага обучения, таких как градиенты.

Более подробную информацию можно найти в документе здесь.

Комментарии:

1. вау, спасибо, я попробую это