Внедрение смешанного прецизионного обучения в tf-slim

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

Пример того, что такое обучение смешанной точности и как оно работает, можно найти по адресу https://devblogs.nvidia.com/mixed-precision-resnet-50-tensor-cores/

Основная идея состоит в том, чтобы 1. Привести входные данные и к fp16 для прямого и обратного прохода 2. Вернуть значения обратно к fp32 при настройке потерь и весов 3. При использовании потерь для обратного прохода умножьте их на шкалу потерь 4 . При обновлении веса разделите его на ту же шкалу убытков.

Это снижает пропускную способность памяти и использует тензорные ядра на графических процессорах Volta и Turing за счет использования fp16.

Моя проблема в том, что я не могу понять, куда поставить приведение к fp16 и fp32 с tf-slim.

Для начала обучения я использую скрипт train_image_classifier.py из models.research.slim

Нужно ли мне выполнять приведение в файлах определений для сетевых архитектур? Или мне нужно применить изменения в файлах tf.contrib.slim?


person AnLu    schedule 03.11.2018    source источник


Ответы (1)


В документации по обучению со смешанной точностью содержится наглядный пример того, как это сделать с помощью tensorflow.

Tensorflow реализовал масштабирование потерь в tf.contrib.mixed_precision.LossScaleOptimizer а>. Насколько я понял, он использует ту же стратегию, которая описана в документации NVIDIA по обучению со смешанной точностью.

loss = loss_fn()
opt = tf.AdamOptimizer(learning_rate=...)

# Choose a loss scale manager which decides how to pick the right loss scale 
# throughout the training process.
# Use fixed loss scaling factor
loss_scale_manager = tf.contrib.mixed_precision.FixedLossScaleManager(loss_scale)
# Use dynamic loss scaling factor
loss_scale_manager = tf.contrib.mixed_precision.ExponentialUpdateLossScaleManager(init_loss_scale, 
                                                                                  incr_every_n_steps)

# Wrap the original optimizer in a LossScaleOptimizer.
loss_scale_optimizer = tf.contrib.mixed_precision.LossScaleOptimizer(opt, loss_scale_manager)

# Call minimize() on the loss scale optimizer.
train_op = loss_scale_optimizer.minimize(loss)
person Astrid    schedule 08.11.2018
comment
Во-первых, мой вопрос мог быть слишком широким. Я попробую еще раз на примере со страницы NVIDIA SDK. Спасибо за внимание к LossScaleOptimizer! Это определенно поможет - person AnLu; 09.11.2018