Ефективний TensorFlow 2.0: найкращі практики та зміни

Опубліковано командою TensorFlow

В останній статті ми згадували, що TensorFlow 2.0 був перероблений з акцентом на продуктивність розробника, простоту та простоту використання.

Щоб детальніше ознайомитись із змінами та дізнатися про кращі практики, ознайомтеся з новим посібником Ефективний TensorFlow 2.0 (опублікованим на GitHub). У цій статті наведено короткий підсумок вмісту, який ви знайдете там. Якщо будь-яка з цих тем вас цікавить, зверніться до посібника, щоб дізнатися більше!

Короткий підсумок основних змін

У TensorFlow 2.0 є багато змін, щоб зробити користувачів більш продуктивними, включаючи видалення надлишкових API, що робить API більш послідовними (Уніфіковані RNN, Уніфіковані оптимізатори) та кращою інтеграцією з програмою Python під час виконання Eager.

Багато RFC (перегляньте їх, якщо ви новачок у них!) Пояснили зміни та роздуми, які перетворилися на створення TensorFlow 2.0. У цьому посібнику представлено бачення того, як має виглядати розвиток в TensorFlow 2.0. Передбачається, що ви знайомі з TensorFlow 1.x.

Очищення API

Багато API або перейшли або перемістилися в TF 2.0, а деякі були замінені на їх 2.0 еквіваленти - tf.summary, tf.keras.metrics і tf.keras.optimizers. Найпростіший спосіб автоматичного застосування цих перейменувань - це використання сценарію оновлення v2.

Швидке виконання

TensorFlow 1.X вимагає, щоб користувачі вручну зшивали абстрактне синтаксичне дерево (графік), роблячи tf. * API-дзвінки. Потім користувачі вимагають вручну скласти абстрактне дерево синтаксису, передавши набір вихідних тензорів та вхідних тенорів на виклик session.run (). Навпаки, TensorFlow 2.0 виконує старанно (як це робиться в Python), а в 2.0 графіки та сеанси повинні відчувати себе деталями щодо впровадження.

Більше глобалів більше немає

TensorFlow 1.X в значній мірі покладався на неявні глобальні простори імен. Коли ви зателефонували tf.Variable (), він буде розміщений у графіку за замовчуванням, і він залишиться там, навіть якщо ви втратили слід змінної Python, що вказує на нього. Потім ви могли відновити цю tf.Variable, але лише якщо ви знали ім'я, за допомогою якого було створено. Це було важко зробити, якщо ви не контролювали створення змінної. Як результат, всілякі механізми поширилися, щоб спробувати допомогти користувачам знову знайти свої змінні.

TensorFlow 2.0 виключає всі ці механізми (Змінні 2.0 RFC) на користь механізму за замовчуванням: Слідкуйте за своїми змінними! Якщо ви втратите сліди за tf.Variable, він збирає сміття. Детальнішу інформацію див. У посібнику.

Функції, а не сеанси

Виклик session.run () майже як виклик функції: Ви вказуєте входи та функцію, яку потрібно викликати, і отримуєте назад набір виходів. У TensorFlow 2.0 ви можете прикрасити функцію Python, використовуючи tf.function (), щоб позначити її для компіляції JIT, щоб TensorFlow запускав її як єдиний графік (Функції 2.0 RFC).

Цей механізм дозволяє TensorFlow 2.0 отримати всі переваги графічного режиму:

  • Продуктивність: функцію можна оптимізувати (обрізка вузлів, злиття ядра тощо)
  • Переносимість: функцію можна експортувати / реімпортувати (SavedModel 2.0 RFC), що дозволяє користувачам повторно використовувати та ділитися модульними функціями TensorFlow.

Маючи можливість вільно перемежовувати код Python та TensorFlow, ви можете повністю скористатися виразністю Python. Але портативний TensorFlow виконується в контекстах без інтерпретатора Python - мобільних, C ++ та JS. Щоб допомогти користувачам уникати перезапису коду при додаванні @ tf.function, AutoGraph перетворить підмножину конструкцій Python в їх еквіваленти TensorFlow.

Детальнішу інформацію див. У посібнику.

Рекомендації щодо ідіоматичного TensorFlow 2.0

Переконайте свій код на менші функції

Загальною схемою використання в TensorFlow 1.X була стратегія «кухонної раковини», де попередньо було викладено об'єднання всіх можливих обчислень, а потім вибрані тензори оцінювались через session.run (). У TensorFlow 2.0 користувачі повинні переробляти код на більш дрібні функції, які викликаються за потребою. Взагалі, не потрібно прикрашати кожну з цих менших функцій tf.function; використовуйте tf.function лише для прикраси обчислень на високому рівні - наприклад, один крок тренувань або перехід вперед вашої моделі.

Використовуйте шари і моделі Keras для управління змінними

Моделі та шари Keras пропонують зручні змінні та властивості trainable_variables, які рекурсивно збирають усі залежні змінні. Це дозволяє легко керувати змінними локально до місця їх використання.

Шари / моделі Кераса успадковуються від tf.train.Checkpointable і інтегруються з функцією @ tf.function, що дозволяє безпосередньо перевіряти точку або експортувати SavedModels з об’єктів Keras. Вам не обов’язково використовувати API Keras'ss.fit (), щоб скористатися цими інтеграціями.

Детальнішу інформацію див. У посібнику.

Поєднайте tf.data.Datasets та @ tf.function

Під час ітерації даних про тренування, що вписуються в пам'ять, сміливо використовуйте регулярну ітерацію Python. В іншому випадку tf.data.Dataset - найкращий спосіб передавати навчальні дані з диска. Набори даних є ітерабелями (а не ітераторами) і працюють так само, як інші ітерабелі Python в режимі Eager. Ви можете повною мірою використовувати функції попереднього завантаження / потокового передавання асинхронних наборів даних, загорнувши свій код у tf.function (), який замінює ітерацію Python на еквівалентні операції з графіком за допомогою AutoGraph.

@ tf.function
визначити поїзд (модель, набір даних, оптимізатор):
 для x, y у наборі даних:
  з tf.GradientTape () як стрічка:
   прогнозування = модель (x)
   loss = loss_fn (прогноз, у)
  градієнти = tape.gradients (втрата, модель.trainable_variables)
  optimizer.apply_gradients (градієнти, модель.trainable_variables)

Якщо ви використовуєте API Keras .fit (), вам не доведеться турбуватися про ітерацію набору даних.

model.compile (optimizer = оптимізатор, loss = loss_fn)
model.fit (набір даних)

Скористайтеся перевагою AutoGraph з потоком управління Python

AutoGraph забезпечує спосіб перетворення потоку управління, що залежить від даних, в еквіваленти графічного режиму, такі як tf.cond і tf.time_loop.

Одне загальне місце, де з’являється залежний від даних потік управління, - це послідовні моделі. tf.keras.layers.RNN обертає комірку RNN, що дозволяє або статично, або динамічно розгортати повторення. Для демонстрації ви можете повторно реалізувати динамічний розкручування таким чином:

клас DynamicRNN (tf.keras.Model):
def __init __ (самостійна, rnn_cell):
 супер (DynamicRNN, самоврядування) .__ init __ (самостійна)
 self.cell = rnn_cell
виклик def (самостійно, вхідні дані):
 # [партія, час, функції] -> [час, партія, функції]
 input_data = tf.transpose (input_data, [1, 0, 2])
 виводи = tf.TensorArray (tf.float32, input_data.shape [0])
 state = self.cell.zero_state (input_data.shape [1], dtype = tf.float32)
 для i в tf.range (input_data.shape [0]):
  вихід, стан = self.cell (input_data [i], state)
  outputs = outputs.write (i, вихід)
 повернути tf.transpose (outputs.stack (), [1, 0, 2]), стан

Детальнішу інформацію див. У посібнику.

Використовуйте tf.metrics для агрегування даних та tf.summary, щоб записати їх

Нарешті, незабаром буде поставлений повний набір символів tf.summary. Ви можете отримати доступ до версії 2.0 tf.summary за допомогою:

з tensorflow.python.ops імпорт резюме_ops_v2

Детальнішу інформацію див. У посібнику.

Наступні кроки

У цій статті подано короткий підсумок Ефективного посібника з TF 2.0 (якщо вас цікавлять ці теми, вирушайте туди, щоб дізнатися більше!) Щоб дізнатися більше про TensorFlow 2.0, ми також рекомендуємо ці останні статті:

  • Сприяння TensorFlow: SIG, RFC, тестування та документи.
  • Що таке символічні та імперативні API в TensorFlow 2.0?
  • Стандартизація на Keras: Посібник щодо API високого рівня в TensorFlow 2.0

І будь ласка, налаштуйтеся на саміт розробників TensorFlow 6 та 7 березня. Як завжди, усі розмови будуть завантажені на YouTube для людей, які не можуть зробити це особисто.