Избегайте промежуточного переполнения при вычислении нормы с fp16 в tenorflow-gpu - PullRequest
0 голосов
/ 12 октября 2018

Как избежать fp16 промежуточного переполнения в tf.linalg.norm, пока конечный результат не переполняется?

Я пытаюсь визуализировать поверхность оптимизации нейронной сети.Для этого я оцениваю потери тысяч настроек параметров по отношению к одинаковым x и y.Я использую fp16 (то есть половину точности) для большего размера партии.Проблема в том, что последний шаг, вычисляющий потери (т.е. tf.linalg.norm), будет (почти всегда) переполняться и возвращать inf:

>>> tf.linalg.norm(myArray, axes=(1,2))
[inf, inf, inf, ..., inf]

Одним из решений будет cast всего массива до fp32 (то есть с одинарной точностью) до вычисления:

>>> tf.linalg.norm(tf.cast(myArray, tf.float32), axes=(1,2))
[~10k, ~10k, ~10k, ..., ~10k]

, но я считаю, что этот процесс пытается выделить массив памяти в два раза больше (и сохранить старый массив до тех пор, пока не будет cast ing).Если память GPU недостаточно велика, процесс завершится ошибкой.Я думал, что должно быть больше эффективных для памяти (и более быстрых) способов, но я не уверен, как.

...