Отладка TensorFlow

У Tenosrflow есть собственный отладчик под названием tfdbg TensorFlow Debugging, который позволяет вам наблюдать за внутренней работой и состоянием работающих графов. Их сложно отлаживать любыми другими общими отладчиками, такими как pdb в python.
В этом руководстве рассматривается интерфейс командной строки для отладки TensorFlow. Также пользователям доступен подключаемый модуль отладки Tensorflow.
В этом учебном пособии вы узнаете, как использовать интерфейс командной строки tfdbg для отладки внешнего видаnans и infs, которые являются наиболее распространенным типом ошибок, встречающихся в tensorflow. Ниже приведен пример низкоуровневого API:
python -m tensorflow.python.debug.examples.debug_mnist
Приведенный выше код будет обучать нейронную сеть MNIST цифра распознавание изображения, и точность немного увеличивается до насыщения после нескольких шагов.
Эта ошибка может быть связана с infs и nans, которые являются самые распространенные баги. Теперь давайте воспользуемся tfdbg, чтобы отладить проблему и узнать, где именно возникла проблема.

Обертывание сеансов TensorFlow с помощью tfdbg

Добавьте следующие строки кода для использования tfdbg, а затем добавьте объект Session с помощью оболочки отладчика.
from tensorflow.python import debug as tf_debug

sess = tf_debug.LocalCLIDebugWrapperSession(sess)

Эта оболочка предлагает некоторые дополнительные функции, в том числе:
CLI следует вызывать до и после Session.run(), если вы хотите контролировать выполнение и знать внутреннее состояние графа.
Фильтры могут быть добавлен для помощи в диагностике, и в приведенном примере уже есть фильтр с именем tfdbg.has_inf_or_nan, который определяет наличие nan или inf в любых промежуточных тензорах, которые не являются входными данными. ни выходные данные.
Вы всегда можете написать свой собственный код для настраиваемых фильтров, которые соответствуют вашим потребностям, и вы можете просмотреть документацию API для получения дополнительной информации.

Отладка обучения модели TensorFlow с помощью tfdbg

Теперь пришло время обучить модель, включив флаг –debug:
python -m tensorflow.python.debug.examples.debug_mnist –debug
Полученные данные будут отображаться на экране и будет выглядеть примерно так, как показано ниже:

На приведенном выше рисунке показан интерфейс run-start.
После этого введите run или r в командной строке:
tfdbg› run

Обучайтесь широкому и глубокому обучению с помощью TensorFlow

Это заставит отладчик Tensorflow работать до следующего вызова сеанса, вычисляя точность для тестового набора данных. Отладчик отобразит исключенные тензоры в интерфейсе выполнения. Например:

Вы можете перечислить тензоры с помощью команды lt после выполнения run.

Часто используемые команды отладки TensorFlow

Попробуйте выполнить следующие команды в приглашении tfdbg› (ссылаясь на код в tensorflow/python/debug/examples/debug_mnist.Py):
Обратите внимание, что всякий раз, когда вы вводите команду, появляется совершенно новый вывод на дисплей. Это невероятно похоже на интернет-страницы в браузере. Вы можете перемещаться между этими экранами, нажимая текстовые стрелки ‹– и –› рядом с левым верхним углом интерфейса командной строки.

Возможности интерфейса командной строки tfdbg

Подобно командам отладки TensorFlow, указанным выше, интерфейс командной строки tfdbg предоставляет следующие дополнительные возможности:
Для навигации по предыдущим инструкциям tfdbg введите несколько символов, сопровождаемых клавишами со стрелками вверх или вниз. Tfdbg покажет вам историю инструкций, которые начинаются с этих символов.
Чтобы перемещаться по записям выводов на экран, выполните оба следующих действия:
Используйте команды prev и next.

Прочитайте безопасность TensorFlow — 5 основных лазеек в TensorFlow

Щелкните подчеркнутые гиперссылки ‹– и –› рядом с верхним левым углом экрана дисплея.
Вкладка последнего штриха команд и некоторых аргументов команды.
Чтобы перенаправить вывод экрана дисплея на запись, а не на экран, закройте команду с перенаправлением в стиле bash. Например, следующая команда перенаправляет вывод команды pt в

/tmp/xent_value_slices.txtfile: tfdbg> pt cross_entropy/Log:0[:, 0:10] > /tmp/xent_value_slices.txt

Поиск нансов и инфс

В этом первом консультационном вызове Run() отсутствуют сложные числовые значения. Вы можете перейти к следующему запуску, используя команду run или ее сокращение r.
СОВЕТ: если вы будете вводить run или r несколько раз, вы сможете проходить через Консультация.Run() вызывается последовательно.
Вы можете дополнительно использовать флаг -t для переноса предшествующих и некоторых вызовов session.Run() одновременно, например:

tfdbg> run -t 10

Вместо повторного ввода run и ручного поиска nans и infs внутри пользовательского интерфейса run-quit после каждого имени session.Run() (например, с помощью команды pt, проверенной в приведенной выше таблице), вы можете использовать следующее чтобы разрешить отладчику снова и снова выполнять вызовы consult.Run(), не останавливаясь при активации запуска-запуска или запуска-остановки, пока на графике не появится первичное значение nan или inf. Это аналогично условным точкам останова в некоторых отладчиках на процедурном языке:

Давайте обсудим TensorFlow Mobile | TensorFlow Lite: обучающее решение

tfdbg> run -f has_inf_or_nan

Обратите внимание:предыдущая команда работает хорошо, потому что тензор очищает, известный как has_inf_or_nan, который был зарегистрирован для вас, когда создается обернутая консультация. Эта очистка обнаруживает nans и infs (как определено ранее). Если вы зарегистрировали некоторые другие фильтры, вы можете использовать «run -f», чтобы tfdbg работал до тех пор, пока какой-либо тензор не сработает с этим фильтром (чтобы фильтр вернулся к истине).

def my_filter_callable(datum, tensor): return len(tensor.shape) == 0 and tensor == 0.0 sess.add_tensor_filter('my_filter', my_filter_callable) Then at the tfdbg run-start prompt run until your filter is precipitated: tfdbg> run -f my_filter

См. этот документ API для получения дополнительной статистики по ожидаемой подписи и вернитесь к значению предиката Callable, используемого с add_tensor_filter().

Поскольку дисплей показывает предложения в первой строке, фильтр has_inf_or_nan сначала вызывается во время четвертого вызова консультации. Выполнить(): оптимизатор Адама вперед-назад пропускает обучение на графике. В этом прогоне 36 (из полных девяноста пяти) промежуточных тензоров включают значения nan или inf. Эти тензоры проиндексированы в хронологическом порядке, а их временные метки отображаются слева. В верхней части листинга вы можете увидеть первый тензор, в котором впервые появились ужасающие числовые значения: cross_entropy/Log:zero.
Чтобы просмотреть цену тензора, щелкните подчеркнутое имя тензора cross_entropy/Log:0. или введите эквивалентную команду:

Давайте пересмотрим Distributed TensorFlow | Кластеризация TensorFlow

tfdbg> pt cross_entropy/Log:0

Прокрутите немного вниз, и вы назовете несколько разрозненных значений inf. Если экземпляры inf и nan трудно определить на глаз, вы можете использовать следующую команду, чтобы выполнить поиск по регулярному выражению и выделить вывод:

tfdbg> /inf

Или, как замену:

tfdbg> /(inf|nan)

Вы можете дополнительно использовать команду -s или –numeric_summary, чтобы получить краткую сводку о типах числовых значений в тензоре:

tfdbg> pt -s cross_entropy/Log:0

Из подробностей видно, что несколько из тысячи элементов тензора cross_entropy/Log:zero являются -infs (отрицательными бесконечностями).
Почему появились эти бесконечности? Для дальнейшей отладки покажите больше информации об узле cross_entropy/Log, щелкнув подчеркнутый пункт меню node_info на вершине или выполнив эквивалентную команду node_info (ni):

tfdbg> ni cross_entropy/Log

Вы можете видеть, что этот узел имеет журнал типа операции и что его входом является узел Softmax. Запустите следующую команду, чтобы более подробно изучить входной тензор:

tfdbg> pt Softmax:0

Посмотрите на значения в тензоре ввода, ищите нули:

tfdbg> /0\.000

Действительно, есть нули. Теперь понятно, что в основе страшных числовых значений лежит узел cross_entropy/Log, говорящий логами нулей. Чтобы узнать строку правонарушителя в исходном коде Python, используйте флаг -t команды ni, чтобы отобразить обратную трассировку производства узла:

tfdbg> ni -t cross_entropy/Log

Если вы нажмете «node_info» в верхней части экрана, tfdbg автоматически предложит трассировку создания узла.

Посмотрите на установку — TensorFlow PDE (уравнение частичной дифференциации)

Из трассировки видно, что операция построена в следующей строке: debug_mnist.Py:

diff = y_ * tf.log(y)

Tfdbg имеет функцию, которая упрощает отслеживание тензоров и операций до строк в документах поставки Python. Он может аннотировать строки записи Python с помощью операций или тензоров, созданных с их помощью. Чтобы использовать этот выбор, обязательно щелкните подчеркнутые номера строк в выводе трассировки стека инструкций ni -t ‹op_name› или используйте команду PlayStation (или print_source) вместе с: ps /course/to/source.Py. Например, на следующем снимке экрана показан вывод команды ps.

Устранение проблемы в отладке TensorFlow

Чтобы восстановить проблему, отредактируйте debug_mnist.Py, изменив уникальную строку:

diff = -(y_ * tf.log(y))

К встроенной численно стабильной реализации softmax move-entropy:

diff = tf.losses.sparse_softmax_cross_entropy(labels=y_, logits=logits)

Повторите запуск с флагом –debug следующим образом:

python -m tensorflow.python.debug.examples.debug_mnist --debug

В командной строке tfdbg› введите следующую команду:

run -f has_inf_or_nan

Подтвердите, что никакие тензоры не помечены как содержащие значения nan или inf, и точность теперь продолжает расти, а не зависать. Успех!

Отладка оценок и экспериментов tf-learn

На этом этапе объясняется способ отладки пакетов TensorFlow, использующих Estimator и тестовые API. Часть удобства, обеспечиваемая этими API, заключается в том, что они управляют классами внутри. Это делает LocalCLIDebugWrapperSession, определенный в предыдущих разделах, неприменимым. К счастью, вы все равно можете отлаживать их с помощью уникальных хуков, предоставляемых через tfdbg.

Быстрое чтение вычислений множества Мандельброта с помощью TensorFlow

Отладка оценщиков tf.contrib.learn

В настоящее время tfdbg может отлаживать методы fit() Assessment() оценщиков tf-examine. Для отладки Estimator.Suit() создайте LocalCLIDebugHook и укажите его в аргументе единиц отображения видео. Например:
из tensorflow.python импортировать отладку как tf_debug

hooks = [tf_debug.LocalCLIDebugHook()] classifier.fit(x=training_set.data, y=training_set.target, steps=1000, monitors=hooks)

Для отладки Estimator.Examine() назначьте ловушки параметру hooks, как в следующем экземпляре:

accuracy_score = classifier.evaluate(x=test_set.data, y=test_set.target, hooks=hooks)["accuracy"]

Debug_tflearn_iris.Py, основанный на руководстве по iris от tf-research, содержит полный пример использования tfdbg с оценщиками. Чтобы запустить это дело, выполните:

Проверьте, сколько вы уже узнали о TensorFlow

python -m tensorflow.python.debug.examples.debug_tflearn_iris --debug

Отладка экспериментов tf.contrib.learn

Эксперимент — это сборка в tf.Contrib.Examine на уровне лучше, чем Estimator. Это дает единый интерфейс для обучения и сравнения моделей. Для отладки вызовов Teach() и Evaluate() тестового объекта можно использовать аргументы ключевого слова train_monitors и eval_hooks соответственно при вызове его конструктора. Например:
из tensorflow.python импортировать отладку как tf_debug

hooks = [tf_debug.LocalCLIDebugHook()] ex = experiment.Experiment(classifier, train_input_fn=iris_input_fn, eval_input_fn=iris_input_fn, train_steps=FLAGS.train_steps, eval_delay_secs=0, eval_steps=1, train_monitors=hooks, eval_hooks=hooks) ex.train() accuracy_score = ex.evaluate()["accuracy"]

Чтобы собрать и запустить пример debug_tflearn_iris в экспериментальном режиме, выполните следующие действия:

python -m tensorflow.python.debug.examples.debug_tflearn_iris \ --use_experiment --debug

LocalCLIDebugHook также позволяет вам настроить watch_fn, который можно использовать для гибкого указания того, какие тензоры следует отслеживать в одном из вызовов session.Run(), как характеристику fetch и feed_dict и различных состояний. Дополнительную информацию см. в этом документе API.

Отладка моделей Keras с помощью TFDBG

Чтобы использовать TFDBG с Keras, разрешите серверной части Keras использовать элемент консультации, заключенный в TFDBG. Например, чтобы использовать оболочку CLI:

import tensorflow as tf from keras import backend as keras_backend from tensorflow.python import debug as tf_debug keras_backend.set_session(tf_debug.LocalCLIDebugWrapperSession(tf.Session())) # Define your keras model, called "model". model.fit(...) # This will break into the TFDBG CLI.

Отладка tf-slim с помощью TFDBG

TFDBG поддерживает отладку обучения и оценки с помощью tf-slim. Как подробно описано ниже, для обучения и оценки требуются немного разные рабочие процессы отладки.

Изучите рекуррентную нейронную сеть TensorFlow | Нейронная сеть LSTM

Обучение отладке в tf-slim

TFDBG поддерживает отладку обучения и оценки TensorFlow с помощью tf-slender. Как показано ниже, для обучения и оценки требуются немного специальные рабочие процессы отладки TensorFlow.

import tensorflow as tf from tensorflow.python import debug as tf_debug # ... Code that creates the graph and the train_op ... tf.contrib.slim.learning.train( train_op, logdir, number_of_steps=10, session_wrapper=tf_debug.LocalCLIDebugWrapperSession)

Отладочная оценка в tf-slim

Чтобы отладить систему обучения, предложите LocalCLIDebugWrapperSession аргументу session_wrapper функции slender.Mastering.Educate(). Как пример:

import tensorflow as tf from tensorflow.python import debug as tf_debug # ... Code that creates the graph and the eval and final ops ... tf.contrib.slim.evaluation.evaluate_once( '', checkpoint_path, logdir, eval_op=my_eval_op, final_op=my_value_op, hooks=[tf_debug.LocalCLIDebugHook()])

Автономная отладка удаленно запущенных сеансов

Часто ваша версия гуляет на дальней машине или методе, к которому у вас нет терминального доступа. Чтобы выполнить отладку версии TensorFlow в таких случаях, вы можете использовать двоичный файл offline_analyzer для tfdbg (описан ниже). Он работает с каталогами сброшенных фактов. Это можно сделать как с API-интерфейсом сеанса более низкого уровня, так и с оценщиком более высокого уровня и тестовыми API.

Отладка удаленного tf.Sessions

Если у вас есть взаимодействие с tf.Session API в python, вы можете настроить прототип RunOptions, с которым вы вызываете метод session.Run(), с помощью подхода tfdbg.Watch_graph. Кроме того, это приведет к тому, что промежуточные тензоры и графики времени выполнения будут сбрасываться в общее хранилище по вашему выбору, пока встречается имя session.Run() (за счет более низкой общей производительности). Например:
из tensorflow.python импортировать отладку как tf_debug

# ... Code where your session and graph are set up... run_options = tf.RunOptions() tf_debug.watch_graph( run_options, session.graph, debug_urls=["file:///shared/storage/location/tfdbg_dumps_1"]) # Be sure to specify different directories for different run() calls. session.run(fetches, feed_dict=feeds, options=run_options)

Позже, в окружении, к которому у вас есть терминальный доступ (например, ближайший ноутбук, который может получить доступ к общему гаражу точно в коде выше), вы можете загрузить и просмотреть записи в каталоге продажи на общем хранилище с помощью бинарного файла offline_analyzer tfdbg. Например:

Давайте изучим архитектуру Tensorflow, важные термины и функции

python -m tensorflow.python.debug.cli.offline_analyzer \ --dump_dir=/shared/storage/location/tfdbg_dumps_1

Оболочка сеанса DumpingDebugWrapperSession обеспечивает более простой и гибкий способ создания дампов системы документов, которые можно анализировать в автономном режиме. Чтобы применить его, оберните свою консультацию в tf_debug.DumpingDebugWrapperSession. Например:

from tensorflow.python import debug as tf_debug sess = tf_debug.DumpingDebugWrapperSession( sess, "/shared/storage/location/tfdbg_dumps_1/", watch_fn=my_watch_fn)

Аргумент watch_fn принимает Callable, который позволяет вам настроить, какие тензоры наблюдать за отдельными вызовами консультация.Run(), в зависимости от fetches и feed_dict для имени run() и различных состояний.

С++ и другие языки

Если код вашей версии написан на C++ или других языках, вы можете дополнительно изменить тему debug_options параметра RunOptions для создания дампов отладки, которые можно просматривать в автономном режиме. См. определение прототипа для получения дополнительной информации.

Лучшая подготовка к собеседованию в TensorFlow

Отладка удаленно работающих оценщиков и экспериментов tf-learn

Если на вашем удаленном сервере TensorFlow работают оценщики, вы можете использовать неинтерактивный DumpingDebugHook. Например:
из tensorflow.python импортировать отладку как tf_debug

hooks = [tf_debug.DumpingDebugHook("/shared/storage/location/tfdbg_dumps_1")]

Затем этот хук можно использовать таким же образом, как и примеры LocalCLIDebugHook, описанные ранее в этом файле. По мере обучения и/или оценки Estimator или эксперимента tfdbg создает каталоги со следующим образцом вызова: /shared/garage/place/tfdbg_dumps_1/run_‹epoch_timestamp_microsec›_‹uuid›. Каждый листинг соответствует имени session.Run(), лежащему в основе вызова suit() или compare(). Вы можете загрузить эти каталоги и проверить их в интерфейсе командной строки в автономном режиме, используя offline_analyzer, предоставленный tfdbg. Как пример:

python -m tensorflow.python.debug.cli.offline_analyzer \ --dump_dir="/shared/storage/location/tfdbg_dumps_1/run_<epoch_timestamp_microsec>_<uuid>"

Итак, это было все об отладке TensorFlow. Надеюсь, вам понравилось наше объяснение.

Вывод

Следовательно, в этом руководстве по отладке TensorFlow мы увидели, как отлаживать ваш код, используя различные методы, классы и API, а также значения этих представлений. Кроме того, мы обсуждали разные команды в разделе Отладка TensorFlow. Далее следует руководство по визуализации графиков в tensorflow, также известном как tensorboard. Тем не менее, если есть сомнения, не стесняйтесь спрашивать во вкладке комментариев.

Первоначально опубликовано на сайте data-flair.training 8 июня 2018 г.