Spec-Zone.ru › TensorFlow 2.4

tf.compat.v1.mixed_precision.enable_mixed_precision_graph_rewrite

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

Просмотр псевдонимов

Псевдонимы совместимости для миграции

См. Руководство по миграции для получения более подробной информации.

tf.compat.v1.train.experimental.enable_mixed_precision_graph_rewrite

tf.compat.v1.mixed_precision.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.
  • AllowList: Операции, которые считаются вычислительно безопасными при выполнении в float16, и поэтому всегда преобразуются. Например, Conv2D.
  • DenyList: Операции, которые не являются безопасными для вычислений в float16 и могут отрицательно влиять на последующие узлы. Например, Softmax.
  • GrayList: Операции, которые считаются вычислительно безопасными при выполнении в float16, если они не расположены вниз по потоку от операции DenyList. Например, 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.functions, так как за пределами tf.functions нет графа.

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

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

Возможные исключения
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.4/api_docs/python/tf/compat/v1/mixed_precision/enable_mixed_precision_graph_rewrite

Spec-Zone.ru

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