Каждый эксперимент священен.
Каждый эксперимент великолепен.
Если эксперимент потрачен впустую.
Бог приходит в ярость
~ Sacred

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

Но пока не бросайте камни, вы все это сделали. Я видел вас, когда пытался воспроизвести ваши эксперименты. Я видел это в ваших документах, в плане вашего эксперимента. Так что давайте притворимся, что этого никогда не было, и найдем решения.

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

Это сообщение в блоге предназначено для молодых и старших исследователей в области ML NLP Vision AI ... и т. Д., А также для практиков и любителей. У меня было несколько дискуссий с исследователями из нескольких других областей, чтобы сформировать нейтральную точку зрения, однако, возможно, она не свободна от предвзятости в отношении сообществ НЛП / DeepLearning, проводящих эмпирически мотивированные исследования.

Этот пост НЕ о менеджерах нагрузки, таких как Slurm, и НЕ о платформах для оптимизации гиперпараметров, таких как SIGOPT.

Управление развивающимися исследовательскими экспериментами

Не унывайте, с вами все в порядке. Этот метод должен был потерпеть неудачу.

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

Слепые смотрят
на миллион пар глаз,
пристально смотрят, но не понимают,
Они никогда не увидят
П.

~ Джордж Клинтон и 2pac Shakur
P → (возможные будущие модификации вашей экспериментальной установки)

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

Ручки и списки наблюдения

Я попытался абстрагировать входные и выходные данные каждого исследовательского эксперимента в ручки (то, что вы постоянно меняете или изменяете автоматически) и списки наблюдения (то, что вы наблюдаете, показываете другим, строите и визуализировать).

Ручки:

  • Код: архитектура модели, исправления ошибок, оценочный код, (Добавить / исправить) гиперпараметр.
  • Наборы данных: изменение наборов данных, предварительная обработка, ручное исправление некоторых примеров.
  • Отладка: те незначительные изменения, которые вы всегда вносите для отладки определенного поведения модели.
  • Обучение: настройка гиперпараметров вручную или автоматически с использованием систем гиперпараметров.
  • Мета: название эксперимента, тег, время, чем вы тогда занимались.

Списки наблюдения:

  • Показатели оценки: точность, ROC, BLEU, ROUGE и т. д., не только то, какой показатель вы используете, но и какая реализация этих показателей.
  • Отладка и промежуточные показатели: потери и точность обучения и разработки, градиент на слой за эпохи. Системная информация, такая как имя хоста,% памяти графического процессора,% занятости графического процессора

Идеальное решение

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

Таким образом:
1) Легко настроить и естественно: Никто не хочет менять способ проведения экспериментов. например упаковка моделей в контейнеры докеров может оттолкнуть некоторых людей от использования конкретного решения. Кроме того, установка серверов и решение проблем с прокси утомительны и отнимают много времени.
2 ) Минимальное обновление кода: Мне не нужно заполнять свой код лишними строками для чтения / записи / визуализация зарегистрированных показателей. Или структурируйте мой код совершенно по-другому.
3) Автоматически и легко придерживаться: Не требуется ручное ведение журнала или визуализация и, следовательно, не требуется самодисциплина, чтобы придерживаться определенного манифеста ведения журнала.
4) Надежный: подходит для беспорядочного и невежественного характера исследования, т.е. не ломается и по-прежнему обеспечивает сопоставимость между запусками, если добавлены новые метрики eval, гиперпарам, набор данных, архитектура.
5) Поддержка любой инфраструктуры: локальный компьютер, отдельный сервер, Slurm.
6) Бесплатно / для собственных нужд / с открытым исходным кодом

Существует ли это идеальное решение

Похоже, что эта проблема не нова в сообществе. Это были предыдущие п о с т на Reddit, и это было кратко упомянуто в Учебнике AllenNLP EMNLP2018.

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

Я изучил текущие решения и передовой опыт в сообществе и собрал эти 20 существующих решений, разделенных ниже на четыре типа:

SACRED - Studio - Datmo - Lore - FORGE - Sumatra - RandOpt - Pachyderm - feature Forge - ModelChimp - PolyAxon - Kubeflow »- Веса и отклонения - Оптуна - ML Flow - Комета ml - Валохай - Нептун - Заклинание

Витрина

Я покажу 3 примера, которые я выбрал из таблицы выше. Я не буду говорить о первых двух столбцах: «Путь пещерного человека» по очевидным причинам и «Все в облаке», поскольку они обязывают вас использовать их инфраструктуру, которая может не подходить для больших вычислений. Если вы не размещаете свою версию локально (например, для codalab), это тоже не лучшее решение.

1) Веса и отклонения

IMO, одно из лучших существующих решений, оно соответствует многим параметрам, обсуждавшимся ранее, предоставляя бесплатные неограниченные частные проекты (вы платите за совместные аккаунты) .
Вкратце расскажу о некоторых его особенностях:

Простая установка: WandB устанавливается как модуль Python.

Никаких радикальных изменений в вашем коде:
WandB предоставляет существующие оболочки для Pytorch, Tensorflow и Keras. Вызывая функцию «wandb.watch (модель)», wandb автоматически извлекает размеры всех слоев, градиенты, параметры модели и автоматически регистрирует их на своей онлайн-платформе.

import wandb
...
# training loop
wandb.log(log_dict)

if __name__ == '__main__':
....
wandb.watch(model)
wandb.config.update(args)

Автоматическое ведение журнала:
Параметры, которые вы автоматически входите в «wandb.log ()», будут автоматически красиво отображаться в виде графиков на веб-сайте wandb.

Кроме того, функция «wandb.watch ()» извлечет все особенности модели.

и красивое отображение гистограммы градиентов на слой для каждой эпохи (это очень удобно для отладки)

и системная информация

Недостатки «Проблемы, связанные с версией кода и данных»:

«WandB» автоматически создает новую ветку git с именем каждого эксперимента и восстанавливает код до состояния, в котором он находился при выполнении «run $ RUN_ID».

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

Во-вторых, WandB не указывает четкого способа управления версиями ваших наборов данных.

2) Comet.ml

Comet предлагает практически те же настройки и функции, что и WandB, с небольшими отличиями.

Улучшенный визуальный интерфейс с дополнительными функциями, такими как экспорт графиков в SVG и JPEG.

Улучшенное управление версиями кода и данных: для управления версиями кода Comet регистрирует хэш фиксации Git + файл Diff, содержащий отличия от текущего кода. Для управления версиями данных При желании вы можете использовать метод« эксперимент.log_dataset_hash () для вычисления хэша вашего набора данных, чтобы вы знали, если что-то изменится. Вычисление хеша выполняется локально, и мы храним хеш только на Comet ».

Недостатки:
В Comet отсутствуют некоторые функции
в отношении автоматического ведения журнала, например, у нее нет оболочек для моделей PyTorch и TensorFlow, которые автоматически регистрируют градиенты, размер слоя и архитектуру.

Уровень бесплатного пользования позволяет использовать только один частный проект и неограниченное количество общедоступных проектов. однако ученые имеют право на бесплатный доступ к платным уровням.

3) Священный + Омниборд

И WandB, и Comet выглядят аккуратно, однако можно увидеть много сценариев, где они не подходят. Например, когда вам нужно провести эксперименты в изолированных системах в Интернете или вы не хотите делиться особенностями кода / данных / сервера по соображениям безопасности.
Для этого Sacred и Omni-board могут быть хорошей альтернативой, которую вы можете установить и запустить локально. Sacred - это модуль Python, используемый для сохранения конфигураций для отдельных запусков в базе данных MongoDB. А Omni-board - это сервер NodeJS, который читает из БД и предоставляет визуализацию. Оба являются бесплатными решениями с открытым исходным кодом, однако их использование требует определенных затрат. Тем не менее, Sacred довольно хорошо известен в сообществе, и, расспрашивая окружающих, я обнаружил, что многие люди уже используют его.

Чуть более сложная настройка:
Хотя священный - это модуль Python, который можно легко установить. Omniboard - это сервер NodeJS, который необходимо установить, запустить и подключить к правильной базе данных Mongo. Это может потребовать некоторой работы с инфраструктурой, особенно если вы не работаете и не визуализируете одну и ту же машину.

Небольшое изменение в исполняемом коде:
Чтобы зарегистрировать аргументы, модель и списки наблюдения, вы должны изменить свой исполняемый файл, чтобы он содержал определенные методы, украшенные синтаксисом Python pie. Следующее:

Меньше функций ведения журнала, менее приятный пользовательский интерфейс и небольшая (или даже отсутствие) технической поддержки:
Это также ожидается, поскольку никому не платят полный рабочий день за поддержку священного или омниборда, есть еще много недостающих функций по сравнению с тем, что уже есть в WandB или Comit.
Кроме того, я считаю, что UX Omniboard немного сбивает с толку (хотя это может быть вопросом вкуса).
Наконец, техническая поддержка будет ограничена, это видно уже по количеству открытых вопросов по обоим проектам Sacred issues и Omniboard issues.

Эпилог:

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

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

Платформы наполовину онлайн / наполовину офлайн: такие как W&B и Comet.ml - это самый простой и самый быстрый способ начать работу, но при этом требуется Интернет и возникают проблемы с безопасностью / конфиденциальностью.

Все собственные решения, такие как «Sacred», являются лучшими автономными, бесплатными, но непростыми и лишенными некоторых функций.

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

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

Спасибо,

Вы нашли этот пост полезным, проверьте другой контент на моем веб-сайте: https://www.hadyelsahar.io/ или подключитесь в Twitter: @hadyelsahar

— -