Эта статья была первоначально написана Jakub Czakon и размещена в блоге Neptune.

Обучение моделей машинного обучения или глубокого обучения может занять очень много времени.

Если вы похожи на меня, вам нравится знать, что происходит в это время:

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

Neptune позволяет вам делать все это, и в этом посте я покажу вам, как это сделать. Шаг за шагом.

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

Примечание:

Если вы хотите попробовать мониторинг Neptune без регистрации, просто перейдите в раздел Initialize Neptune и начните оттуда как анонимный пользователь.

Настройте свою учетную запись Neptune

Настроить проект и подключить свои скрипты к Neptune очень просто, но вам все равно нужно это сделать :)

Давайте позаботимся об этом быстро.

Создать проект

Сначала создадим проект.

Для этого:

  • зайдите в приложение Нептун,
  • нажмите кнопку New project слева
  • дай ему имя
  • решите, хотите ли вы, чтобы это было общедоступным или частным
  • Выполнено

Получите ваш токен API

Вам понадобится токен Neptune API (ваш личный ключ) для подключения сценариев, которые вы запускаете с помощью Neptune.

Для этого:

  • нажмите на свой логотип пользователя справа
  • нажмите на Get Your API token
  • скопируйте свой токен API
  • вставьте его в переменную окружения (предпочтительно ~/.bashrc или системный эквивалент), файл конфигурации или прямо в свой скрипт, если вы чувствуете себя действительно предприимчивым :)

Токен подобен паролю, поэтому я стараюсь держать его в безопасности.

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

При этом всякий раз, когда я запускаю свои тренировочные сценарии, Neptune будет знать, кто я, и соответствующим образом регистрировать события.

Установить клиентскую библиотеку

Для работы с Neptune вам нужна клиентская библиотека, которая занимается логированием всего, что вам нужно.

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

Вы можете установить его с помощью pip:

pip install neptune-client

Многие помощники мониторинга доступны в библиотеке расширений, поэтому я предлагаю вам установить и ее.

pip install neptune-contrib

Инициализировать Нептун

Теперь, когда у вас все настроено, вы можете начать следить за вещами!

Во-первых, подключите свой скрипт к Neptune, добавив следующее в начало вашего скрипта:

import neptune
neptune.init(project_qualified_name="You/Your-Project")

Примечание:

Если вы хотите попробовать Neptune без регистрации, вы можете просто использовать этот открытый проект и анонимного пользователя neptuner с паролем АНОНИМНЫЙ:

import neptune
neptune.init(api_token='ANONYMOUS',
             project_qualified_name="shared/step-by-step-monitoring-experiments-live")

Создать эксперимент

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

Чтобы начать эксперимент, просто запустите:

neptune.create_experiment('step-by-step-guide')

После запуска появится ссылка на эксперимент. Вы можете щелкнуть по нему и перейти к пользовательскому интерфейсу Neptune или просто найти свой эксперимент непосредственно в приложении Neptune.

Конечно, там пока не так много, потому что мы ничего не записывали.

Давайте изменим это!

Примечание:

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

Основы мониторинга

В двух словах, войти в Neptune так же просто, как:

neptune.log_TYPE('LOG_NAME', THING_I_WANT_TO_LOG)

Это могут быть:

  • Метрики и потери -› neptune.log_metric
  • Изображения и схемы -› neptune.log_image
  • Артефакты, такие как файлы модели -› neptune.log_artifact
  • И другие.

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

Регистрация одиночных значений и регистрация циклов

Иногда вы можете просто захотеть записать что-то один раз до или после завершения обучения.

В этом случае вы просто запускаете

...
neptune.log_metric('test_auc', 0.93)
neptune.log_artifact('my_model.pkl')

В других сценариях есть обучающий цикл, внутри которого вы хотите что-то регистрировать.

Как в PyTorch:

for inputs, labels in trainloader:
     optimizer.zero_grad()
     outputs = net(inputs)
     loss = criterion(outputs, labels)
     loss.backward()
     optimizer.step()
     neptune.log_metric('loss', loss)

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

Увидеть это в Нептуне

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

О них мы поговорим далее.

Логирование с обратными вызовами

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

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

for epoch in epochs:
    callback.on_epoch_start()
    for batch in dataloader:
        callback.on_batch_start()
        do_stuff(batch)
        callback.on_batch_end()
    callback.on_epoch_end()

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

class MonitoringCallback(Callback):
    def on_epoch_end(self, logs={}):
        for metric_name, metric_value in logs.items():
            neptune.log_metric(metric_name, metric_value)

И передайте этот обратный вызов методу подгонки.

...
model.fit(..., callbacks=[MonitoringCallback()])

Ваши тренировочные показатели будут автоматически зарегистрированы в Neptune:

Увидеть это в Нептуне

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

Хорошо, теперь, когда вы знаете, как вы можете отслеживать, но более интересный вопрос заключается в том, что вы можете отслеживать на Нептуне?

Что вы можете контролировать в Нептуне?

Есть масса разных вещей, которые вы можете регистрировать в Neptune и отслеживать в реальном времени.

Метрики и кривые обучения, потребление оборудования, прогнозы моделей, кривые ROC, журналы консоли и многое другое можно регистрировать для каждого эксперимента и изучать в реальном времени.

Давайте рассмотрим их один за другим.

Мониторинг метрик и потерь ML

Метрики оценки журнала или потери в разделе журнала с помощью метода neptune.log_metric:

neptune.log_metric('test_accuracy', 0.76)
neptune.log_metric('test_f1_score', 0.62)

Если вы хотите регистрировать эти метрики после каждой итерации обучения, просто вызовите neptune.log_metric много раз для одного и того же имени метрики:

for epoch in range(epoch_nr):
    # training logic
    f1_score = model.score(valid_data)
    neptune.log_metric('train_f1_score', f1_score)

Диаграмма с кривой обучения будет создана автоматически.

Увидеть это в Нептуне

Мониторинг аппаратных ресурсов

Они регистрируются автоматически, если у вас установлено psutil.

Чтобы установить его, просто запустите:

pip install psutil

и контролируйте свое оборудование для каждого эксперимента.

Просто перейдите в раздел Monitoring, чтобы увидеть это:

Увидеть это в Нептуне

Мониторинг журналов консоли

Они регистрируются автоматически, если у вас установлено psutil.

Вы можете увидеть как stderr, так и stdout в разделе Monitoring:

Увидеть это в Нептуне

Мониторинг предсказаний изображения

Записывать изображения в раздел журнала с помощью метода neptune.log_image. Их можно сгруппировать в именованные разделы журнала, например best_image_predictions или validation_predictions:

neptune.log_image(‘best_image_predictions’, image)
neptune.log_image(‘worst_image_predictions’, image)

Если вы хотите регистрировать прогнозы изображений после каждой эпохи, вы можете регистрировать несколько изображений с одним и тем же именем журнала:

for epoch in range(epoch_nr):
     # logic for plotting validation predictions on images
     neptune.log_image(‘validation_predictions_epoch’, image)

Ваши диаграммы будут доступны для просмотра на вкладке validation_predictions раздела logs пользовательского интерфейса.

Увидеть это в Нептуне

Отслеживание графиков производительности

Регистрируйте и отслеживайте диаграммы, такие как матрица путаницы, кривая ROC, кривая Precision Recall или что-либо еще, что вы хотите. Есть два варианта сделать это.

Вы можете зарегистрировать их как изображения с neptune.log_image, и они будут представлены в разделе logs пользовательского интерфейса под выбранным вами именем:

for epoch in range(epochs):
	# chart plotting logic
	neptune.log_image('ROC curves epoch', fig)

Увидеть это в Нептуне

Вы также можете регистрировать и обновлять интерактивные html-диаграммы из боке, сюжета или альтаира с помощью функции log_chart. Если вы регистрируете графики matplotlib, они будут автоматически преобразованы в график.

for epoch in range(epochs):
    # chart plotting logic
    log_chart(‘ROC curve’, fig)

Увидеть это в Нептуне

Примечание.

Если вы хотите создать новую интерактивную диаграмму после каждой эпохи, вам нужно дать им разные имена:

for epoch in range(epochs):
    # chart plotting logic
    log_chart('ROC curve epoch:{}'format(epoch), fig)

Мониторинг текстовых прогнозов

Запишите текст в раздел журнала с помощью метода neptune.log_text. Может быть много именованных подразделов текстового журнала, если вы хотите:

neptune.log_text('preds_head', str(text_predictions.head()))
neptune.log_text('preds_tail', str(text_predictions.tail()))

Как и прежде, вы можете регистрировать данные после каждой тренировочной эпохи или партии, если хотите. Просто позвоните neptune.log_text несколько раз:

for iteration in range(iter_nr):
     # logic for getting parameters tried during this run
     neptune.log_image('run parameters', param_dictionary)

Ваши графики будут доступны для просмотра на вкладке «validation_predictions» в разделе «журналы» пользовательского интерфейса.

Увидеть это в Нептуне

Мониторинг обновлений файлов

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

for epoch in epochs:
    # create predictions.csv
    neptune.log_artifact('predictions.csv')
    neptune.log_artifact('model_checkpoint.pkl')

Увидеть это в Нептуне

Сравните текущие эксперименты с предыдущими

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

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

Для этого:

  • перейти в панель эксперимента
  • выберите несколько экспериментов
  • нажмите «Сравнить» с наложенными кривыми обучения и покажите различия в параметрах и показателях.
  • нажимайте аборт на запущенных, если больше не видите смысла в тренировках

See it в Нептуне

Делитесь запущенными экспериментами с другими по ссылке

Вы можете поделиться своими запущенными экспериментами, скопировав ссылку на эксперимент и отправив ее кому-нибудь.

Так же, как я делюсь с вами этим экспериментом здесь:

https://ui.neptune.ai/o/shared/org/step-by-step-monitoring-experiments-live/e/STEP-22

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

Увидеть это в Нептуне

Используйте интеграции для мониторинга обучения в ваших фреймворках

Neptune поставляется с множеством интеграций с фреймворком, чтобы сделать мониторинг еще проще.

Позвольте мне показать вам, как это обычно работает, на двух примерах: Keras и Optuna.

Мониторинг моделей глубокого обучения: Keras

Вместо создания обратного вызова мониторинга в Keras вы можете использовать доступный в neptune-contrib.

Просто импортируйте его и передайте в файл model.fit. Не забудьте сначала создать эксперимент.

import neptune
from neptunecontrib.monitoring.keras import NeptuneMonitor
neptune.init()
neptune.create_experiment('my-keras-experiment')
#
# your logic
#
model.fit(x_train,
          y_train,
          epochs=42,
          callbacks=[NeptuneMonitor()])

Мониторинг оптимизации гиперпараметров: Optuna

Фреймворк настройки параметров Optuna также имеет систему обратного вызова, которую вы можете хорошо подключить к Neptune. »Все результаты регистрируются и обновляются после каждой итерации поиска параметров.

import neptune
from neptunecontrib.monitoring.optuna import NeptuneCallback
neptune.init()
neptune.create_experiment('my-optuna-experiment')
#
# your logic
#
study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=100, 
               callbacks=[NeptuneCallback(log_charts=True])

Примечание:

Neptune имеет более 20 интеграций с фреймворками (и их число продолжает расти), поэтому проверьте их и посмотрите, доступны ли ваши фреймворки, или напишите нам комментарий, и мы можем просто создать его для вас!

Последние мысли

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

Для получения дополнительной информации вы можете:

Удачного наблюдения за экспериментом!

Дальнейшее чтение:

Эта статья изначально была написана Jakub Czakon и размещена в блоге Neptune. Там вы можете найти более подробные статьи для специалистов по машинному обучению.