Помогают защитить Большой Барьерный Риф с TensorFlow на Kaggle Присоединяйтесь вызов

Оптимизация графа TensorFlow с помощью Grappler

Посмотреть на TensorFlow.org Запускаем в Google Colab Посмотреть исходный код на GitHub Скачать блокнот

Обзор

TensorFlow использует как графическое, так и активное выполнение для выполнения вычислений. tf.Graph содержит набор tf.Operation объектов (OPS) , которые представляют собой блоки вычисления и tf.Tensor объектов , которые представляют собой блоки данных , которые текут между ОПС.

Grappler - это система оптимизации графиков по умолчанию в среде выполнения TensorFlow. Grappler применяется оптимизации в графическом режиме ( в пределах tf.function ) , чтобы улучшить производительность вашего TensorFlow вычислений на основе графа упрощений и других оптимизации высокого уровня , такие как встраивание функций органов , с тем чтобы между процедурной оптимизацией. Оптимизация tf.Graph также уменьшает использование памяти пиковых устройств и повышает эффективность использования оборудования за счетом оптимизации отображения графа узлов вычислительных ресурсов.

Используйте tf.config.optimizer.set_experimental_options() для контроля над вашими тонкой tf.Graph оптимизаций.

Доступные оптимизаторы графиков

Grappler выполняет график оптимизации через драйвер верхнего уровня называется MetaOptimizer . В TensorFlow доступны следующие оптимизаторы графиков:

  • Постоянный складной оптимизатор - Статически выводит значение тензоров , когда это возможно путем складывания постоянных узлов в графе и материализирует результат , используя константы.
  • Арифметика оптимизатор - Упрощает арифметические операции за счетом устранения общего подвыражения и упрощения арифметических утверждений.
  • Макет Оптимизатор - Оптимизирует тензор макеты для выполнения формата данных зависимых операций , таких как сверток более эффективны.
  • Remapper оптимизатор - перераспределяет подграфы на более эффективные реализации путем замены обычно происходящие подграфов с оптимизированными слитыми монолитными ядрами.
  • Оптимизатор памяти - Анализирует график для того чтобы проверить использование пиковой памяти для каждой операции и вставок CPU-GPU операций копирования памяти замены памяти GPU для процессора , чтобы уменьшить использование памяти пики.
  • Зависимость от оптимизатора - Удаляют или перестраивается управление зависимостями , чтобы сократить критический путь для шага модели или позволяют другую оптимизацию. Также удаляет узлы, которые фактически не выполняются, такие как Identity.
  • Обрезка оптимизатора - чернослив узлов , которые не имеют никакого эффекта на выходе из графика. Обычно он запускается первым, чтобы уменьшить размер графика и ускорить обработку в других проходах Grappler.
  • Функция Оптимизатор - Оптимизирует функция библиотеки программы TensorFlow и встраивает тела функций для того, чтобы другие между процессуальными оптимизаций.
  • Форма Оптимизатор - Оптимизирует подграфы , которые работают по форме и формируют соответствующую информацию.
  • Autoparallel оптимизатор - Автоматически параллелизует графики расщеплением вдоль периодического измерения. По умолчанию этот оптимизатор выключен.
  • Цикл оптимизатор - оптимизирует поток управления графа с помощью подъемных петли-инвариантных подграфов из циклов и пути удаления избыточных операций стеки в циклах. Также оптимизирует циклы со статически известным счетчиком отключений и удаляет статически известные мертвые ветви в условных выражениях.
  • Scoped Распределителя оптимизатор - представляет область действия распределителей для уменьшения перемещения данных и консолидировать несколько операций.
  • Pin принимающего оптимизатора - свопы небольших операции на CPU. По умолчанию этот оптимизатор выключен.
  • Авто смешанной точность оптимизатор - типы данных преобразуют в float16 , где это применимо для повышения производительности. В настоящее время относится только к графическим процессорам.
  • Отладки стриппер - Полоски узлы , связанные с отладкой таких операций, как tf.debugging.Assert , tf.debugging.check_numerics и tf.print от графика. По умолчанию этот оптимизатор выключен.

Настраивать

import numpy as np
import timeit
import traceback
import contextlib


import tensorflow as tf

Создайте диспетчер контекста, чтобы легко переключать состояния оптимизатора.

@contextlib.contextmanager
def options(options):
  old_opts = tf.config.optimizer.get_experimental_options()
  tf.config.optimizer.set_experimental_options(options)
  try:
    yield
  finally:
    tf.config.optimizer.set_experimental_options(old_opts)

Сравните эффективность исполнения с Grappler и без него

TensorFlow 2 и дальше выполняет жадность по умолчанию. Используйте tf.function для переключения исполнения по умолчанию в режиме Graph. Grappler запускается автоматически в фоновом режиме, чтобы применить приведенную выше оптимизацию графиков и повысить производительность выполнения.

Оптимизатор постоянного сворачивания

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

def test_function_1():
  @tf.function
  def simple_function(input_arg):
    print('Tracing!')
    a = tf.constant(np.random.randn(2000,2000), dtype = tf.float32)
    c = a
    for n in range(50):
      c = c@a
    return tf.reduce_mean(c+input_arg)

  return simple_function

Отключите оптимизатор сворачивания констант и выполните функцию:

with options({'constant_folding': False}):
  print(tf.config.optimizer.get_experimental_options())
  simple_function = test_function_1()
  # Trace once
  x = tf.constant(2.2)
  simple_function(x)
  print("Vanilla execution:", timeit.timeit(lambda: simple_function(x), number = 1), "s")
{'constant_folding': False, 'disable_model_pruning': False, 'disable_meta_optimizer': False}
Tracing!
Vanilla execution: 0.0018392090000816097 s

Включите оптимизатор сворачивания констант и снова выполните функцию, чтобы увидеть ускорение выполнения функции.

with options({'constant_folding': True}):
  print(tf.config.optimizer.get_experimental_options())
  simple_function = test_function_1()
  # Trace once
  x = tf.constant(2.2)
  simple_function(x)
  print("Constant folded execution:", timeit.timeit(lambda: simple_function(x), number = 1), "s")
{'constant_folding': True, 'disable_model_pruning': False, 'disable_meta_optimizer': False}
Tracing!
Constant folded execution: 0.0006749789999958011 s

Оптимизатор удаления отладки

Рассмотрим простую функцию, которая проверяет числовое значение своего входного аргумента и возвращает его.

def test_function_2():
  @tf.function
  def simple_func(input_arg):
    output = input_arg
    tf.debugging.check_numerics(output, "Bad!")
    return output
  return simple_func

Сначала выполните функцию с выключенным оптимизатором удаления отладки.

test_func = test_function_2()
p1 = tf.constant(float('inf'))
try:
  test_func(p1)
except tf.errors.InvalidArgumentError as e:
  traceback.print_exc(limit=2)
2021-09-22 20:34:55.871238: E tensorflow/core/kernels/check_numerics_op.cc:292] abnormal_detected_host @0x7f4878e00100 = {0, 1} Bad!
Traceback (most recent call last):
  File "/tmp/ipykernel_22954/3616845043.py", line 4, in <module>
    test_func(p1)
  File "/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/eager/def_function.py", line 885, in __call__
    result = self._call(*args, **kwds)
tensorflow.python.framework.errors_impl.InvalidArgumentError:  Bad! : Tensor had Inf values
     [[node CheckNumerics (defined at tmp/ipykernel_22954/2241890286.py:5) ]] [Op:__inference_simple_func_131]

Errors may have originated from an input operation.
Input Source operations connected to node CheckNumerics:
 input_arg (defined at tmp/ipykernel_22954/3616845043.py:4)

Function call stack:
simple_func

tf.debugging.check_numerics вызывает недопустимый аргумент ошибки из-за Inf аргумента test_func .

Включите оптимизатор удаления отладки и снова выполните функцию.

with options({'debug_stripper': True}):
  test_func2 = test_function_2()
  p1 = tf.constant(float('inf'))
  try:
    test_func2(p1)
  except tf.errors.InvalidArgumentError as e:
    traceback.print_exc(limit=2)

Отладки стриппер оптимизатор отгоняет tf.debug.check_numerics узел из графа и выполняет функцию без повышения каких - либо ошибок.

Резюме

Среда выполнения TensorFlow использует Grappler для автоматической оптимизации графиков перед выполнением. Используйте tf.config.optimizer.set_experimental_options для включения или отключения различных графов оптимизаторов.

Для получения дополнительной информации о Grappler см TensorFlow График Оптимизации .