Spec-Zone.ru › TensorFlow 2.3

tf.compat.v1.train.experimental.enable_mixed_precision_graph_rewrite

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

tf.compat.v1.train.experimental.enable_mixed_precision_graph_rewrite(
    opt, loss_scale='dynamic'
)

Смешанная точность — это использование типов данных 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.train.Optimizer или tf.keras.optimizers.Optimizer должен быть передан в эту функцию, которая затем будет обернута для использования масштабирования потерь.

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

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

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

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

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

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

Исключения
ValueError, если API tf.keras.mixed_precision также используется путём вызова tf.keras.mixed_precision.experimental.set_policy. Может использоваться только один API смешанной точности.
Аргументы
opt Экземпляр tf.keras.optimizers.Optimizer или tf.train.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.3/api_docs/python/tf/compat/v1/train/experimental/enable_mixed_precision_graph_rewrite

Spec-Zone.ru

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