newsmode
search
Меню
arrow_back Назад

Simpler Experimentation with Jupyter, Papermill, and MLflow

auto_awesomeКраткое саммари

Юджин Янь описывает рабочий процесс для более простых и быстрых ML-экспериментов на основе трёх инструментов: Jupyter, Papermill и MLflow. Проблема, которую он решает: когда нужно прогнать один и тот же пайплайн на разных данных (например, обнаружение мошенничества по странам или предсказание движения биржевых индексов), копирование и переименование ноутбуков нарушает принцип DRY и приводит к ошибкам. Papermill позволяет параметризовать и выполнять один ноутбук (basic.ipynb) с разными параметрами (например, INDEX = GOLD, INDEX = NIKKEI), сохраняя результат каждого эксперимента в отдельный ноутбук без дублирования кода. MLflow собирает все метрики, визуализации и бинарники моделей в едином UI с сервером на 127.0.0.1:5000, где эксперименты можно сортировать и фильтровать по параметрам и метрикам. В демо каждый ноутбук обучает пять моделей и оценивает их по четырём метрикам, что даёт 20 метрик, 10 графиков и 5 бинарников на один прогон. Главный вывод: автоматизация экспериментов снижает усилия и ускоряет итерации, повышая шансы на успех.

Более простое экспериментирование с Jupyter, Papermill и MLflow

[ productivity python ] · чтение на 6 мин

P.S. Ищете код? Доступен на github: papermill-mlflow

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

Дальше вы хотите применить тот же пайплайн к другим странам — поскольку формат данных одинаковый — и провести множество экспериментов (например, отбор признаков, подбор параметров).

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

Как это сделать?

Утомительный и ошибкоопасный способ

Если вы похожи на меня, то, возможно, продублируете этот базовый пайплайн (basic.ipynb) и переименуете его (например, basic_sg.ipynb, basic_vn.ipynb и т. д.). По одному ноутбуку на страну.

Однако в ходе экспериментов вы находите новые признаки, которые улучшают результаты, и хотите воспроизвести их во всех странах. Поэтому вы копируете и вставляете код в несколько ноутбуков. Это нарушает принцип DRY и довольно утомительно.

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

Однако сопоставлять визуализации (в директории) с результатами экспериментов (в CSV) для справки — занятие трудоёмкое. То же касается и бинарника модели.

Есть ли более простой и менее трудозатратный способ?

Оптимизированные, более быстрые эксперименты

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

Есть три основных компонента:

jupyter: быстрая итеративная разработка и визуализация кода и вывода papermill: запуск одного ноутбука с разными параметрами; вывод в отдельные ноутбуки mlflow: логирование метрик и артефактов в едином UI

Чтобы это продемонстрировать, мы сделаем следующее:

Построим демонстрационный ML-пайплайн, чтобы предсказывать, вырастет ли S&P 500 (или упадёт) на следующий день (производительность в этой статье вторична) Масштабируем этот пайплайн на эксперименты с другими индексами (например, золото, Nikkei и т. д.) Автоматически залогируем все метрики и артефакты в одном месте

Приступим.

Шаг 1: От нуля к единице (эксперимент)

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

Загружает данные S&P 500 (скачанные с Yahoo Finance) Создаёт базовые признаки (например, простое и экспоненциальное скользящее среднее) Строит визуализации (например, тренды, AUC-кривые, кривые точность-полнота) Запускает статистический анализ (примечание: признаки сильно коррелированы, и это не вполне корректно) Обучает и оценивает модели (например, логистическую регрессию, деревья решений и т. д.)

Пайплайн прост — сквозной прогон занимает 3,5 секунды. Это позволяет проводить быстрые итеративные эксперименты.

Больше экспериментов = больше знаний = высокая вероятность успеха.

Вот как выглядит ноутбук: base.ipynb

Скриншот из базового ноутбука

Шаг 2: От одного (ноутбука) к 100 (экспериментам)

Чтобы масштабировать наш единственный ноутбук (запускающий пайплайн для S&P 500) на множество других биржевых индексов, мы привлекаем на помощь papermill.

Papermill позволяет параметризовать и выполнять ноутбуки Jupyter. В этом демо мы зададим разные параметры (например, INDEX = GOLD, INDEX = NIKKEI) для одного и того же ноутбука basic.ipynb, чтобы проэкспериментировать с нашим пайплайном на разных биржевых индексах. Каждый эксперимент также сохраняется в собственный ноутбук (например, basic_SNP.ipynb, basic_GOLD.ipynb).

Использовать papermill для этого легко — всего два простых шага.

Сначала добавьте тег parameters к ячейке в вашем ноутбуке:

Строка меню -> View -> Cell toolbar -> Tags Введите parameters в поле в правом верхнем углу ячейки Нажмите Add tag

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

Как параметризовать ячейку

Далее мы создаём ноутбук (runner.ipynb), чтобы запускать basic.ipynb с разными параметрами. Вот фрагмент кода, как это сделать, где мы:

Итерируемся по различным индексам Выполняем basic.ipynb с разными индексами (через аргумент parameter) Сохраняем каждый ноутбук по отдельности (например, basic_SNP.ipynb, ')

for index in ['SNP', 'GOLD', 'SSE', 'HANGSENG', 'NIKKEI']: logger.info('Running notebook for: {}'.format(index)) pm.execute_notebook(input_path='basic.ipynb', parameters={'INDEX': index} output_path='../artifact_dir/notebooks/basic_{}.ipynb'.format(index))

Запуск всех ноутбуков с помощью Papermill

Ну разве это не просто?

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

Тем не менее, как получить общую картину результатов экспериментов, не просматривая каждый ноутбук? Есть ли способ сгруппировать и сохранить метрики оценки, визуализации и обученные модели каждого эксперимента? Можно ли затем консолидировать всё это и обращаться из одного места?

Шаг 3: 100 (метрик) в одном (дашборде)

Каждый ноутбук обучает пять ML-моделей и оценивает их по четырём метрикам. Для каждой модели мы строим два графика (т. е. ROC-кривую и кривую точность-полнота) и бинарник модели.

Это 20 метрик, 10 графиков и 5 бинарников моделей на один прогон эксперимента — всё это может быстро выйти из-под контроля.

Чтобы взять это под контроль, мы можем использовать mlflow.

MLflow — это фреймворк, который помогает отслеживать эксперименты и обеспечивать воспроизводимые рабочие процессы для развёртывания. У него три компонента (tracking, projects, models). Этот разбор сосредоточится на первом, у которого есть API и UI для логирования параметров, метрик, артефактов и т. д.

Автоматически логировать каждый эксперимент легко с помощью этого фрагмента кода:

В приведённом выше коде с каждой обученной ML-моделью мы логируем параметры (например, биржевой индекс, имя модели, секретный соус), метрики (например, AUC, точность) и артефакты (например, визуализации, бинарники моделей). Это довольно базово, и вы можете сделать это сами с помощью небольшого кода на python.

Где mlflow по-настоящему блистает — это его сервер и UI. Запустить сервер (mlflow server) и перейти на дашборд (127.0.0.1:5000) легко. (Сервер также можно разместить централизованно, и пользователи смогут отправлять на него свои метрики и артефакты.)

UI MLflow собирает все ваши параметры и метрики на одной главной странице для удобного просмотра.

Все метрики ваших экспериментов под рукой

Вы можете сортировать эксперименты по метрикам или параметрам. Здесь мы отсортировали их по AUC по убыванию.

Похоже, что простое (логистическая регрессия) — лучшее

Также есть пользовательские фильтры по параметрам и метрикам. Здесь мы фильтруем по Logistic Regression.

Легко фильтровать эксперименты на основе параметров и/или метрик

Но где артефакты каждого эксперимента? Кликните по эксперименту, и вы попадёте на страницу эксперимента, где сможете просмотреть все артефакты и скачать их.

Всё (метрики, артефакты) об эксперименте в одном месте

Как начать

В приведённом выше разборе мы увидели, как можно запускать множество экспериментов из одного ноутбука (с помощью papermill) и логировать результаты и артефакты в едином UI (с помощью mlflow).

Вот git-репозиторий с ноутбуками, использованными в разборе. Склонируйте его и попробуйте. Поставьте звезду, если он оказался полезным. Активно пробуйте интегрировать papermill и mlflow в свою работу.

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

Спасибо Gabriel Chuan и Michael Ng за чтение черновиков.

Если вы нашли это полезным, пожалуйста, цитируйте эту заметку так:

Yan, Ziyou. (Mar 2020). Simpler Experimentation with Jupyter, Papermill, and MLflow. eugeneyan.com. https://eugeneyan.com/writing/experimentation-workflow-with-jupyter-papermill-mlflow/.

или

@article{yan2020automate, title = {Simpler Experimentation with Jupyter, Papermill, and MLflow}, author = {Yan, Ziyou}, journal = {eugeneyan.com}, year = {2020}, month = {Mar}, url = {https://eugeneyan.com/writing/experimentation-workflow-with-jupyter-papermill-mlflow/} }



Присоединяйтесь к 11 800+ читателям, получающим обновления о машинном обучении, RecSys, LLM и инженерии.