Отладка 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 г.