Реализация смешанной точности обучения в TF-Slim - PullRequest
0 голосов
/ 03 ноября 2018

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

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

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

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

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

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

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

1 Ответ

0 голосов
/ 08 ноября 2018

Документация NVIDIA по обучению смешанной точности дает наглядный пример того, как это сделать с tenorflow.

В 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)
...