Эта статья была первоначально написана 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 заключается в том, что вы можете сравнивать текущие эксперименты с вашими предыдущими.
Это позволяет легко решить, демонстрирует ли обучаемая модель перспективу улучшения. Если это не так, вы даже можете прервать эксперимент из пользовательского интерфейса.
Для этого:
- перейти в панель эксперимента
- выберите несколько экспериментов
- нажмите «Сравнить» с наложенными кривыми обучения и покажите различия в параметрах и показателях.
- нажимайте аборт на запущенных, если больше не видите смысла в тренировках
Делитесь запущенными экспериментами с другими по ссылке
Вы можете поделиться своими запущенными экспериментами, скопировав ссылку на эксперимент и отправив ее кому-нибудь.
Так же, как я делюсь с вами этим экспериментом здесь:
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 интеграций с фреймворками (и их число продолжает расти), поэтому проверьте их и посмотрите, доступны ли ваши фреймворки, или напишите нам комментарий, и мы можем просто создать его для вас!
Последние мысли
Со всей этой информацией вы сможете отслеживать каждую часть эксперимента по машинному обучению, которая вас интересует.
Для получения дополнительной информации вы можете:
- Посмотрите, как работает мониторинг, в этой записной книжке Google Colab, которая поставляется с фрагментами для регистрации всевозможных вещей в Neptune.
- Посмотрите этот пример запуска эксперимента по мониторингу, чтобы увидеть, как это может выглядеть.
- Читайте обновленный список вещей, которые вы можете регистрировать
- Ознакомьтесь с полным списком наших интеграций с ML-фреймворками
- Поговорите с нами по Интеркому (та синяя штука в углу) или на нашем Дискуссионном форуме.
Удачного наблюдения за экспериментом!
Дальнейшее чтение:
- Как контролировать машинное обучение и эксперименты по глубокому обучению
- Как настроить непрерывную интеграцию для машинного обучения с Github Actions и Neptune: пошаговое руководство
Эта статья изначально была написана Jakub Czakon и размещена в блоге Neptune. Там вы можете найти более подробные статьи для специалистов по машинному обучению.