Ефективен TensorFlow 2.0: най-добри практики и какво се промени

Публикувано от екипа на TensorFlow

В неотдавнашна статия споменахме, че TensorFlow 2.0 е преработен с акцент върху производителността, простотата и лекотата на използване на разработчиците.

За да разгледате по-отблизо какво се е променило и да научите за най-добрите практики, вижте новото ръководство за ефективен TensorFlow 2.0 (публикувано на GitHub). Тази статия предоставя кратко обобщение на съдържанието, което ще намерите там. Ако някоя от тези теми ви интересува, насочете се към ръководството, за да научите повече!

Кратко резюме на основните промени

Има много промени в TensorFlow 2.0, за да направят потребителите по-продуктивни, включително премахване на излишни API, прави API по-последователни (Unified RNN, Unified Optimizers) и по-добра интеграция с 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
def влак (модел, набор от данни, оптимизатор):
 за x, y в набор от данни:
  с tf.GradientTape () като лента:
   прогноза = модел (x)
   загуба = загуба_фн (прогноза, у)
  градиенти = tape.gradients (загуба, модел.trainable_variables)
  optimizer.apply_gradients (градиенти, model.trainable_variables)

Ако използвате API на Keras .fit (), няма да се налага да се притеснявате за итерация на набор от данни.

model.compile (optimizer = оптимизатор, загуба = загуба_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 call (самостоятелно, input_data):
 # [партида, време, функции] -> [време, партида, функции]
 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], състояние)
  outputs = outputs.write (i, изход)
 върнете tf.transpose (outputs.stack (), [1, 0, 2]), състояние

Вижте ръководството за повече подробности.

Използвайте tf.metrics за обобщаване на данни и tf.summary, за да го регистрирате

И накрая, скоро идва пълен набор от символи за обобщение на tf.summary. Можете да получите достъп до 2.0 версията на tf.summary с:

от tensorflow.python.ops import import_ops_v2

Вижте ръководството за повече подробности.

Следващи стъпки

Тази статия предостави кратко резюме на Ръководството за ефективен TF 2.0 (ако се интересувате от тези теми, насочете се там, за да научите повече!) За да научите повече за TensorFlow 2.0, препоръчваме и тези скорошни статии:

  • Принос към TensorFlow: SIG, RFC, тестване и документи.
  • Какво представляват символните и императивните API в TensorFlow 2.0?
  • Стандартизация на Keras: Ръководство за API на високо ниво в TensorFlow 2.0

И моля, настройте се за срещата на върха на разработчиците на TensorFlow на 6 и 7 март. Както винаги, всички разговори ще бъдат качени в YouTube за хора, които не могат да го направят лично.