Предварительная обработка, построение графиков, обучение и отладка

Примечание редактора: это руководство изначально было опубликовано на Deep Learning Weekly.

TensorFlow был новичком, когда он был представлен в 2015 году, и с тех пор стал одним из наиболее часто используемых фреймворков глубокого обучения. Я прыгнул в поезд через несколько месяцев после первого выпуска и начал свой путь к глубокому обучению еще во время работы над магистерской диссертацией. Потребовалось время, чтобы привыкнуть к графу вычислений и модели сеанса, но с тех пор я уже не обращал внимания на большинство причуд и поворотов.

Эта короткая статья не является введением в TensorFlow, но вместо этого предлагает несколько быстрых советов, в основном ориентированных на производительность, которые раскрывают распространенные ошибки и могут поднять вашу модель и производительность обучения на новый уровень. Мы начнем с предварительной обработки и вашего входного конвейера, посетим построение графа, а затем перейдем к отладке и оптимизации производительности.

Предварительная обработка и входные конвейеры

Сохраняйте предварительную обработку чистой и компактной

Вы озадачены, сколько времени нужно на обучение вашей относительно простой модели? Проверьте вашу предварительную обработку! Если вы выполняете тяжелую предварительную обработку, такую ​​как преобразование данных во входные данные нейронной сети, это может значительно замедлить скорость вывода.

В моем случае я создавал так называемые «карты расстояний» - изображения в градациях серого, которые использовались в «Deep Interactive Object Selection» в качестве дополнительных входных данных, используя пользовательскую функцию Python. Моя скорость тренировки превысила 2,4 изображения в секунду, даже после того, как я переключился на гораздо более мощный GTX 1080. Затем я заметил узкое место и, применив свое исправление, смог тренироваться со скоростью около 50 изображений в секунду.

Если вы заметили такое узкое место, обычно первым делом стоит оптимизировать код. Но гораздо более эффективный способ убрать время вычислений из вашего обучающего конвейера - это перевести предварительную обработку в одноразовую операцию, которая генерирует файлы TFRecord.

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

Следи за своими очередями

Способ заметить дорогие конвейеры предварительной обработки - это графы очередей в TensorBoard. Они генерируются автоматически, если вы используете фреймворки QueueRunners и сохраняете сводки в файле. Графики показывают, смогла ли ваша машина поддерживать очереди заполненными. Если вы замечаете отрицательные всплески на графиках, это означает, что ваша система не может генерировать новые данные за то время, когда ваша машина хочет обработать одну партию.

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

Другими причинами могут быть проблемы с оборудованием, например, слишком медленные диски или слишком большой объем данных для вашей системы. Как бы то ни было, его исправление ускорит ваш тренировочный процесс.

Построение графов и обучение

Завершите свой график

Раздельное построение графиков и модель вычисления графиков в TensorFlow довольно редки в повседневном программировании и могут вызвать некоторую путаницу у новичков. Это относится к ошибкам и сообщениям об ошибках, которые могут возникать в коде впервые при построении графика, а затем снова при его фактическом вычислении, что противоречит здравому смыслу, если вы привыкли к тому, что код оценивается только один раз.

Еще одна проблема - построение графа в сочетании с циклами обучения. Эти циклы обычно являются «стандартными» циклами Python и поэтому могут изменять граф и добавлять к нему новые операции. Изменение графика во время его непрерывной оценки приведет к серьезной потере производительности, но поначалу это довольно сложно заметить.

К счастью, есть простое решение. Просто завершите график, прежде чем начинать цикл обучения, вызвав tf.getDefaultGraph().finalize(). Это заблокирует график, и любые попытки добавить новую операцию вызовут ошибку. Именно то, что мы хотим.

Профилируйте свой график

Менее широко рекламируемая функция TensorFlow - это профилирование. Существует механизм для записи времени выполнения и потребления памяти операциями вашего графика. Это может пригодиться, если вы ищете узкие места или хотите узнать, можно ли обучить модель на вашей машине без переключения на жесткий диск.

Чтобы сгенерировать данные профилирования, вам нужно выполнить один проход по вашему графику с включенной трассировкой:

# Collect tracing information during the fifth step.
if global_step == 5:
# Create an object to hold the tracing data
run_metadata = tf.RunMetadata()
# Run one step and collect the tracing data
_, loss = sess.run([train_op, loss_op], options=tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE),
run_metadata=run_metadata)
# Add summary to the summary writer
summary_writer.add_run_metadata(run_metadata, 'step%d', global_step)

После этого файл timeline.json сохраняется в текущей папке, и данные трассировки становятся доступными в TensorBoard. Теперь вы можете легко увидеть, сколько времени занимает операция для вычисления и сколько памяти она потребляет. Просто откройте графическое представление в TensorBoard, выберите свой последний запуск слева, и вы должны увидеть подробности о производительности справа.

С одной стороны, это позволяет вам скорректировать вашу модель, чтобы максимально использовать вашу машину. С другой стороны, это позволяет вам находить узкие места в вашем учебном процессе. Если вы предпочитаете просмотр временной шкалы, вы можете загрузить файл timeline.json в Инструмент отслеживания событий Google Chrome.

Еще один приятный инструмент - tfprof, который использует те же функции для профилирования памяти и времени выполнения, но предлагает более удобные функции. Дополнительная статистика требует изменения кода.

Следи за своей памятью

Профилирование, как объяснялось в предыдущем разделе, позволяет вам следить за использованием памяти конкретными операциями, но наблюдение за потреблением памяти всей вашей моделью еще более важно. Всегда следите за тем, чтобы память вашего компьютера не превышала объем памяти, так как свопинг наверняка замедлит ваш конвейер ввода, и ваш графический процессор начнет ждать новых данных.

Простого top или, как объяснялось в одном из предыдущих разделов, графов очередей в TensorBoard должно быть достаточно для обнаружения такого поведения. Затем можно провести подробное расследование, используя вышеупомянутую трассировку.

Отладка

Печать - твой друг

Мой основной инструмент для отладки таких проблем, как застойные потери или странные выходные данные - tf.Print. Из-за природы нейронных сетей рассмотрение необработанных значений тензоров внутри вашей модели обычно не имеет особого смысла. Никто не может интерпретировать миллионы чисел с плавающей запятой и увидеть, что не так.

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

TensorFlow также включает в себя некоторые инструменты для помощи в отладке: Отладчик TensorFlow, представленный в TF 1.0, и активное выполнение в 2.0. У меня еще не было возможности использовать ни один из этих инструментов, но приятно знать, что команда TensorFlow работает над решениями для отладки модели.

Установить тайм-аут выполнения операции

Итак, вы реализовали свою модель, запустили сеанс, и ничего не происходит. Обычно это вызвано пустыми очередями, но если вы понятия не имеете, определить, какая очередь может быть причиной сбоя, относительно просто: просто включите тайм-аут выполнения операции при создании сеанса, и ваш скрипт выйдет из строя, когда операция превысит ваш лимит. :

config = tf.ConfigProto()
config.operation_timeout_in_ms=5000
sess = tf.Session(config=config)

Затем с помощью трассировки стека вы можете определить, какая операционная система вызывает проблему, исправить ошибку и продолжить обучение.

Заключение

Конечно, это всего лишь набор советов, приемов и инструментов, имеющихся в вашем распоряжении при работе с TensorFlow. А команда TensorFlow продолжает добавлять функциональность, которая упрощает создание, обучение и развертывание моделей машинного обучения.

Обсудите этот пост в Hacker News.

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

Независимая редакция, Heartbeat спонсируется и публикуется Comet, платформой MLOps, которая позволяет специалистам по обработке данных и группам машинного обучения отслеживать, сравнивать, объяснять и оптимизировать свои эксперименты. Мы платим участникам и не продаем рекламу.

Если вы хотите внести свой вклад, отправляйтесь на наш призыв к участникам. Вы также можете подписаться на наши еженедельные информационные бюллетени (Deep Learning Weekly и Comet Newsletter), присоединиться к нам в » «Slack и подписаться на Comet в Twitter и LinkedIn для получения ресурсов, событий и гораздо больше, что поможет вам быстрее и лучше строить модели машинного обучения.