From Medium, Алекс Вилчко, Дэн Молдован, Вольф Добсон, редакционный отдел Heart of the Machine.
Недавно Google выпустила новый инструмент TensorFlow «AutoGraph», который может преобразовывать функцию print() и другой код Python в чистый код вычислительного графа TensorFlow. Этот инструмент значительно повышает производительность TensorFlow при вызове простых операторов Python, и разработчики могут легко добиться более высокой производительности модели в TensorFlow.
адрес проекта:GitHub.com/tensorflow/…
Вообще говоря, при написании кода TensorFlow нам нужно построить вычислительный граф всего алгоритма, либо спланировать вычислительный процесс всех потоков данных, а затем закинуть данные и быстро выполнить весь или частичный вычислительный граф. Конечно, из-за текущей популярности динамических вычислительных графов, таких как PyTorch и Keras, TensorFlow также выпустил Eager Execution, который может помочь пользователям автоматически строить вычислительные графы. Тем не менее, общий TensorFlow по-прежнему часто использует статический граф вычислений, потому что его логика построения и развертывания очень выгодны.
Однако начинающим разработчикам сложно разобраться в статических графах расчета, поэтому у разработчиков легко вызвать недоумение. Особенно в некоторых сценариях, связанных с более сложными моделями, такими как использование операторов Python, таких как if и while, или использование print() и прием структурированного ввода и т. д., они могут привести к тому, что мы запутаемся в вычислительных графах.
Так зачем же TensorFlow нужно использовать вычислительные графы? Вычислительные графы допускают различные оптимизации, такие как удаление общих подвыражений и слияние ядра. Кроме того, графы вычислений упрощают конфигурацию среды для распределенного обучения и развертывания, поэтому их можно рассматривать как независимую от платформы форму расчета модели. Эта функция чрезвычайно важна для распределенного обучения на нескольких GPU или TPU, и, конечно же, очень важно развертывание моделей на мобильных устройствах и в IoT на основе TensorFlow Lite.
Вот очень простой пример в действии:
def huber_loss(a):
if tf.abs(a) <= delta:
loss = a * a / 2
else:
loss = delta * (tf.abs(a) - delta / 2)
return loss
С Eager Execution он просто «работает правильно», но такие операции могут быть медленными, потому что интерпретатор Python, как известно, медленно реализуется и требует больше вычислений, что может упустить многие возможности для оптимизации программы.
Чтобы подготовить граф к выполнению, вам нужно переписать код, используя такие операторы, как tf.cond() , но это утомительно и сложно реализовать. AutoGraph автоматизирует это преобразование, упрощая программирование Eager и повышая производительность выполнения вычислительного графа.
В этом примере мы можем использовать autograph.convert() для разметки нашей функции, и AutoGraph автоматически сгенерирует код, пригодный для использования на графике.
Используя AutoGraph, благодаря декоратору, следующий код:
@autograph.convert()
def huber_loss(a):
if tf.abs(a) <= delta:
loss = a * a / 2
else:
loss = delta * (tf.abs(a) - delta / 2)
return loss
При выполнении он становится следующим кодом:
def tf__huber_loss(a):
with tf.name_scope('huber_loss'):
def if_true():
with tf.name_scope('if_true'):
loss = a * a / 2
return loss,
def if_false():
with tf.name_scope('if_false'):
loss = delta * (tf.abs(a) - delta / 2)
return loss,
loss = ag__.utils.run_cond(tf.less_equal(tf.abs(a), delta), if_true,
if_false)
return loss
Затем вы можете вызвать свой код, как в обычной операции TensorFlow:
with tf.Graph().as_default():
x_tensor = tf.constant(9.0)
# The converted function works like a regular op: tensors in, tensors out.
huber_loss_tensor = huber_loss(x_tensor)
with tf.Session() as sess:
print('TensorFlow result: %2.2f\n' % sess.run(huber_loss_tensor))
Как видите, AutoGraph объединяет исполнение Eager и Graph. AutoGraph берет код Python в стиле Eager, который затем преобразуется в код, генерирующий графики.
AutoGraph — это не просто набор полезных макросов, он также может использовать преобразование исходного кода для переопределения любой части языка Python, включая поток управления, применение и назначение функций, создание стандартного кода и рефакторинг идиоматического Python, чтобы сделать процесс преобразования в простой график.
С любым компилятором возникают проблемы с удобочитаемостью сообщений об ошибках; для этой цели AutoGraph может создавать сообщения об ошибках и складывать несколько трассировок, которые выявляют источник ошибки в исходном исходном коде, а не просто показывают ссылки на сгенерированный код.
работающий пример
Итак, что AutoGraph может сделать для нас? Ниже приведены некоторые примеры кодов, которые можно преобразовать непосредственно в код графа без какой-либо перезаписи. Если вы действительно хотите выполнять эти операции, у Google есть блокнот, доступный в этом GitHub Colab.
Гитхаб:GitHub.com/tensorflow/…
Совместная работа:столбец AB.research.Google.com/GitHub/tens…
Ниже мы используем петли и ветви для проверки «гипотезы Колаза». Обратите внимание, что для разнообразия мы будем использовать не декоратор, а функцию AutoGraph .to_graph() для преобразования его в график.
def collatz(a):
counter = 0
while a != 1:
if a % 2 == 0:
a = a // 2
else:
a = 3 * a + 1
counter = counter + 1
return counter
graph_mode_collatz = autograph.to_graph(collatz)
# The code is human-readable, too
print(autograph.to_code(collatz))
collatz_tensor = graph_mode_collatz(tf.constant(n))
AutoGraph может поддерживать произвольный вложенный поток управления, например:
def f(n):
if n >= 0:
while n < 5:
n += 1
print(n)
return n
AutoGraph позволяет добавлять элементы в массив в цикле. Чтобы заставить его работать, мы используем некоторые помощники AutoGraph, set_element_type и стек.
def f(n):
z = []
# We ask you to tell us the element dtype of the list
autograph.set_element_type(z, tf.int32)
for i in range(n):
z.append(i)
# when you're done with the list, stack it
# (this is just like np.stack)
return autograph.stack(z)
Мы также поддерживаем break, continue и даже такие операторы, как print и assert. Когда преобразование завершено, утверждение Python этого фрагмента использует соответствующий tf.Assert для преобразования его в граф вычислений TensorFlow.
def f(x):
assert x != 0, 'Do not pass zero!'
return x * x
Возможность легко добавлять циклы, управление потоком и т. д. на график означает, что обучающие циклы можно легко перенести на график. Пример можно найти в этой записной книжке Colab, в которой используется цикл обучения RNN и выполняется с помощью одного вызова sess.run(). Это полезно, когда вам нужно передать полный цикл обучения на ускоритель, лучше, чем управлять процессом обучения через контроллер ЦП.
AutoGraph открывает новые идеи для построения и обучения моделей. Google постарается добавить в AutoGraph дополнительные функции в будущем, основываясь на предложениях сообщества разработчиков. Пожалуйста, предлагайте свои предложения!
Предложения:GitHub.com/tensorflow/…
Сравнение производительности графа с нетерпеливым исполнением
Eager Execution работает достаточно хорошо, но графики быстрее. Хотя тесты более сложные (в зависимости от конфигурации приложения и оборудования), в некоторых простых примерах мы можем увидеть огромное ускорение при преобразовании из кода Eager в код AutoGraph с использованием большого количества операторов if и while.
В конечном счете, AutoGraph позволяет использовать динамические и управляемые потоком экстремальные модели на оборудовании-ускорителе, таком как графические процессоры и облачные TPU, что очень полезно для обучения больших моделей на больших объемах данных.
AutoGraph и Eager Execution
Несмотря на использование Eager Execution, вы также можете выполнить часть кода согласно вычислительному графу через tf.contrib.eager.defun. Но это требует, чтобы вы вычисляли графоподобные операции TensorFlow, используя tf.cond() . В будущем AutoGraph будет легко интегрироваться с defun, что позволит вам писать код графа на простом Python. Когда это станет реальностью, путем выборочного преобразования нетерпеливого кода в сегментацию графа, вы можете рассчитывать на использование AutoGraph для ускорения горячих точек.
в заключении
AutoGraph позволяет легко создавать интуитивно понятные сложные модели, которые легко запускаются в графах TensorFlow. Это экспериментальный инструмент, который в настоящее время работает в contrib, но мы планируем добавить его в основной модуль TensorFlow в ближайшее время.
Оригинальная ссылка:medium.com/tensorflow/…