Как правильно настроить оптимизатор в Keras с помощью colocate_gradients_with_ops = True? - PullRequest
0 голосов
/ 21 сентября 2018

Моя рабочая нагрузка разделена на два графических процессора (иначе, разделение по моделям).По умолчанию TF / Keras распределяет все градиенты на GPU0, но я хочу использовать colocate_gradients_with_ops, чтобы распределить распределение по двум GPU.

Я ищу простой способ сделать это в Керасе.Мой способ состоял в том, чтобы создать новый оптимизатор с подклассами tf.train.AdamOptimizer, чтобы перевернуть значение по умолчанию colocate_gradients_with_ops (от False до True).Также я должен перевернуть это двумя способами!

Я ищу более короткий, более прямой путь, чем тот, что ниже в Керасе.

class MyAdamOptimizer(tf.train.AdamOptimizer):
    def compute_gradients(self,
                          loss,
                          var_list=None,
                          gate_gradients=tf.train.Optimizer.GATE_OP,
                          aggregation_method=None,
                          colocate_gradients_with_ops=True,
                          grad_loss=None):
        return super(MyAdamOptimizer, self).compute_gradients(
            loss,
            var_list=None,
            gate_gradients=tf.train.Optimizer.GATE_OP,
            aggregation_method=None,
            colocate_gradients_with_ops=True,
            grad_loss=None)

    def minimize(
            loss,
            global_step=None,
            var_list=None,
            gate_gradients=tf.train.Optimizer.GATE_OP,
            aggregation_method=None,
            colocate_gradients_with_ops=True,
            name=None,
            grad_loss=None):
        return super(MyAdamOptimizer, self).minimize(
            loss,
            global_step=None,
            var_list=None,
            gate_gradients=tf.train.Optimizer.GATE_OP,
            aggregation_method=None,
            colocate_gradients_with_ops=True,
            name=None,
            grad_loss=None)

Тогда я звоню

model.compile(optimizer=MyAdamOptimizer(learning_rate=0.001),
              loss='categorical_crossentropy',
              metrics=['accuracy'])

1 Ответ

0 голосов
/ 25 октября 2018

Нет более простого пути.Keras AdamOptimizer использует собственную реализацию из базовых операторов.Вы должны использовать собственный оптимизатор для colocate_gradients_with_ops.Если целью является улучшение производительности нескольких графических процессоров, вы можете попробовать Keras-MXNet AdamOptimizer, мы перегружены классом Keras Optimizer и обладаем большей эффективностью на нескольких графических процессорах.Вам не нужно менять свой тренировочный код.

...