Spec-Zone.ru › TensorFlow 2.4

tf.train.experimental.enable_mixed_precision_graph_rewrite

Просмотреть исходный код на GitHub

Включить смешанную точность с помощью переписывания графа. (устаревший)

tf.train.experimental.enable_mixed_precision_graph_rewrite(
    opt, loss_scale='dynamic'
)
Предупреждение: ЭТА ФУНКЦИЯ УСТАРЕЛА. Она будет удалена после 30 ноября 2020 года. Инструкции по обновлению: используйте tf.keras.mixed_precision. Есть руководство на https://www.tensorflow.org/guide/mixed_precision. В качестве альтернативы, tf.compat.v1.mixed_precision.enable_mixed_precision_graph_rewrite может быть использован, но это не рекомендуется для кода TF2.

Смешанная точность — это использование типов данных float32 и float16 при обучении модели для повышения производительности. Это достигается с помощью операции переписывания графа и оптимизатора с масштабированием потерь.

Выполнение арифметических операций в формате float16 использует специализированные процессорные блоки, такие как NVIDIA Tensor Cores, для значительно большей пропускной способности арифметических операций. Однако из-за меньшего диапазона представимых значений выполнение всего обучения с использованием float16 может привести к затуханию градиента, то есть к тому, что малые значения градиента становятся нулями. Вместо этого выполнение только некоторых арифметических операций в формате float16 приводит к большей пропускной способности и уменьшению времени обучения при использовании совместимых аппаратных ускорителей, а также к уменьшению использования памяти, как правило, без потери точности модели.

Примечание: Хотя переписывание смешанной точности изменяет тип данных различных слоёв модели, ожидается, что будет достигнута та же точность, что и в float32. Если происходит NaN градиент с динамическим масштабированием потерь, обновление модели для данной группы отбрасывается. В этом случае счётчик глобальных шагов не увеличивается, и LossScaleOptimizer пытается уменьшить значение масштабирования потерь, чтобы избежать NaN значений в последующих итерациях. Этот подход показал, что он достигает той же точности, что и float32, и, в большинстве случаев, лучшей пропускной способности обучения.

Пример:

model = tf.keras.models.Sequential([
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dense(64, activation='softmax'),
])

opt = tf.keras.optimizers.SGD()
opt = tf.train.experimental.enable_mixed_precision_graph_rewrite(opt)
model.compile(loss="mse", optimizer=opt)

x_train = np.random.random((1024, 64))
y_train = np.random.random((1024, 64))
model.fit(x_train, y_train)

Вызов enable_mixed_precision_graph_rewrite(opt) включает операцию переписывания графа перед вычислением градиентов. Функция дополнительно возвращает Optimizer (opt) завернутую в LossScaleOptimizer. Это предотвращает затухание в тензорах float16 во время обратного прохода.

Оптимизатор типа tf.keras.optimizers.Optimizer или tf.compat.v1.train.Optimizer должен быть передан в эту функцию, который затем будет обернут для использования масштабирования потерь.

Операция переписывания графа изменяет тип данных некоторых операций в графе с float32 на float16. Существуют несколько категорий операций, которые либо включаются, либо исключаются с помощью этой операции переписывания. Следующие категории операций определены внутри соответствующих функций в классе AutoMixedPrecisionLists в auto_mixed_precision_lists.h:

  • ClearList: Операции, которые не имеют численно значимого неблагоприятного воздействия. Например, ArgMax и Floor.
  • AllowList: Операции, которые считаются численно безопасными для выполнения в float16 и поэтому всегда преобразуются. Например, Conv2D.
  • DenyList: Операции, которые численно небезопасны для выполнения в float16 и могут отрицательно повлиять на последующие узлы. Например, Softmax.
  • GrayList: Операции, которые считаются численно безопасными для выполнения в float16, если они не являются последующими за операцией из DenyList. Например, Add и AvgPool.

При использовании этой функции градиенты должны вычисляться и применяться с возвращённым оптимизатором, либо вызывая opt.minimize() или opt.compute_gradients() с последующим вызовом opt.apply_gradients(). Если градиенты вычисляются с помощью tf.gradients или tf.GradientTape, масштабирование потерь не будет применено, что, скорее всего, приведёт к тому, что ваша модель не сойдётся из-за проблем с затуханием float16. Для применения масштабирования потерь с tf.gradients или tf.GradientTape, используйте LossScaleOptimizer.get_scaled_loss и LossScaleOptimizer.get_unscaled_gradients. См. keras.mixed_precision.experimental.LossScaleOptimizer для получения подробностей.

Когда включено выполнение eager, переписывание графа смешанной точности включается только внутри tf.functionов, так как за пределами tf.functionов графа нет.

Для NVIDIA GPU с Tensor cores, как общее руководство по производительности, размеры (такие как размер пакета, размер входных данных, размер выходных данных и количество каналов) должны быть степенями двойки, если меньше 256, или кратны 8, если больше 256. Дополнительную информацию можно найти в Руководстве NVIDIA по производительности глубокого обучения.

В настоящее время смешанная точность включена только на NVIDIA Tensor Core GPU с вычислительной способностью 7.0 и выше (архитектуры Volta, Turing или новее). Части графа на процессорах и TPU не затрагиваются операцией переписывания.

Сравнение с API смешанной точности Keras

Обе функции, эта функция и API смешанной точности Keras, позволяют использовать смешанную точность в модели. Поэтому можно использовать только один из двух API. Мы рекомендуем использовать API смешанной точности Keras, так как он более настраиваемый и поддерживает Eager execution. Однако он поддерживает только модели, использующие слои Keras, в то время как переписывание графа работает в любой модели, использующей tf.functionы.

Основное различие между двумя API заключается в том, что эта функция — это переписывание графа, поэтому она изменяет граф для использования смешанной точности под капотом. Вы по-прежнему создаёте свой граф в формате float32, и переписывание графа изменит определённые операции на float16. API смешанной точности Keras напрямую создаёт модель Keras, используя смесь float16 и float32.

Одно из основных преимуществ API Keras заключается в том, что он поддерживает смешанную точность с Eager execution, то есть смешанную точность вне tf.functionов. Переписывание графа будет влиять только на операции внутри tf.functionов, что затрудняет отладку, если возникнут проблемы со смешанной точностью. API Keras также более настраиваемый, так как вы можете переопределить любой слой для выполнения в формате float32, передав dtype="float32" конструктору слоя. Кроме того, вы можете запросить тип данных тензоров в модели, проверив tensor.dtype. При переписывании графа все тензоры кажутся float32, так как тип данных изменяется только под капотом.

Основное преимущество переписывания графа (эта функция) заключается в том, что она работает даже если вы не используете слои Keras или любую другую часть Keras. API смешанной точности Keras требует моделей, которые используют слои Keras, так как он вставляет преобразования только внутри слоёв и моделей Keras. Ещё одно преимущество заключается в том, что переписывание графа никогда не приводит к TypeError, в отличие от API Keras, который может создать TypeError, если вы выполняете определённые операции за пределами Keras. Например, следующее приведёт к TypeError, если включен API смешанной точности Keras, так как будет добавлено float16 и float32 тензор: tf.keras.layers.Dense(2)(x) + tf.keras.layers.Dense(2, dtype="float32")(x)

Возможные исключения
ValueError, если API tf.keras.mixed_precision также используется, вызывая tf.keras.mixed_precision.experimental.set_policy. Может быть использован только один API смешанной точности.
Аргументы
opt Экземпляр tf.keras.optimizers.Optimizer.
loss_scale Целое/вещественное число, строка "dynamic", или экземпляр tf.mixed_precision.experimental.LossScale. Масштаб потерь для использования. Рекомендуется сохранить значение по умолчанию "dynamic", которое будет автоматически изменять масштабирование для предотвращения Inf или NaN значений.
Возвращаемое значение
Версия opt, которая будет использовать масштабирование потерь для предотвращения затухания.

© 2020 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 3.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r2.4/api_docs/python/tf/train/experimental/enable_mixed_precision_graph_rewrite

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API