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 бинарников на один прогон. Главный вывод: автоматизация экспериментов снижает усилия и ускоряет итерации, повышая шансы на успех.

Simpler Experimentation with Jupyter, Papermill, and MLflow

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

[ productivity python ] · 6 min read

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

P.S. Looking for the code? Available on github: papermill-mlflow

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

Your company (e.g., an e-commerce platform across several countries) is starting a new project on fraud detection. You begin by building a basic machine learning pipeline for a single country in a Jupyter notebook. The evaluation metrics for your basic, single-country pipeline looks good.

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

Next, you want to apply the same pipeline to the other countries—since the data format is identical—and run multiple experiments (e.g., feature selection, parameter tuning).

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

Ideally, each experiment’s output should be a self-contained Jupyter notebook for easy reference. You also want to store and access artifacts (e.g., visualizations, trained models) in a single location.

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

How should you do it?

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

The tedious, error-prone way

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

If you’re like me, you might duplicate that basic pipeline (basic.ipynb) and rename it (e.g., basic_sg.ipynb, basic_vn.ipynb, etc). One notebook per country.

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

However, as you experiment, you find some new features that improve results and want to replicate it across the countries. Thus, you copy-paste code across multiple notebooks. This violates the DRY principle and is pretty tedious.

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

To log the results in a single location, you output evaluation metrics for each experiment in a CSV. Visualizations (e.g, ROC curves, precision-recall curves) and trained model binaries are also stored in a single directory.

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

However, trying to match the visualizations (in the directory) to the experiment results (in the CSV) for reference is time-consuming. Ditto for the model binary.

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

Is there a simpler, more effortless way?

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

Streamlined, faster experiments

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

After some trial and error, I’ve settled on a workflow for simpler, faster experimentation. No more duplication of notebooks. All metrics, visualizations, and model binaries in a single UI.

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

There are three main components:

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

  • jupyter: Quick, iterative development and visualization of code and output
  • papermill: Running one notebook with different parameters; output into separate notebooks
  • mlflow: Logging of metrics and artifacts within a single UI
  • jupyter: быстрая итеративная разработка и визуализация кода и вывода papermill: запуск одного ноутбука с разными параметрами; вывод в отдельные ноутбуки mlflow: логирование метрик и артефактов в едином UI

    To demonstrate this, we’ll do the following:

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

  • Build a demo ML pipeline to predict if the S&P 500 will be up (or down) the next day (performance is secondary in this post)
  • Scale this pipeline to experiments on other indices (e.g., Gold, Nikkei, etc.)
  • Automagically log all metrics and artifacts in a single location
  • Построим демонстрационный ML-пайплайн, чтобы предсказывать, вырастет ли S&P 500 (или упадёт) на следующий день (производительность в этой статье вторична) Масштабируем этот пайплайн на эксперименты с другими индексами (например, золото, Nikkei и т. д.) Автоматически залогируем все метрики и артефакты в одном месте

    Let’s get started.

    Приступим.

    Step 1: Zero to One (experiment)

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

    In this notebook we have a basic pipeline doing some analysis, visualizations, feature engineering, and machine learning. At a high level, it:

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

  • Loads S&P 500 data (downloaded from Yahoo finance)
  • Creates basic features (e.g., simple and exponential moving average)
  • Plots visualizations (e.g., trends, AUC curves, precision-recall curves)
  • Runs statistical analyses (note: features are highly correlated and this is not entirely correct)
  • Trains and evaluates models (e.g., logistic regression, decision trees, etc.)
  • Загружает данные S&P 500 (скачанные с Yahoo Finance) Создаёт базовые признаки (например, простое и экспоненциальное скользящее среднее) Строит визуализации (например, тренды, AUC-кривые, кривые точность-полнота) Запускает статистический анализ (примечание: признаки сильно коррелированы, и это не вполне корректно) Обучает и оценивает модели (например, логистическую регрессию, деревья решений и т. д.)

    The pipeline is simple—running it end-to-end takes 3.5 seconds. This allows for rapid, iterative experimentations.

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

    More experiments = more learning = high probability of success.

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

    Here’s how the notebook looks like: base.ipynb

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

    Screenshot from the base notebook

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

    Step 2: One (notebook) to 100 (experiments)

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

    To scale our single notebook (running the S&P 500 pipeline) to multiple other stock indices, we enlist the help of papermill.

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

    Papermill allows you to parametrise and execute Jupyter notebooks. In this demo, we’ll set different parameters (e.g., INDEX = GOLD, INDEX = NIKKEI) for the same basic.ipynb notebook to experiment our pipeline on different stock indices. Each experiment is also saved to its own notebook (e.g., basic_SNP.ipynb, basic_GOLD.ipynb).

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

    Using papermill to do this is easy—just two simple steps.

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

    First, add a parameters tag to the cell in your notebook:

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

  • Menu bar -> View -> Cell toolbar -> Tags
  • Enter parameters in the textbook on the top right of the cell
  • Click Add tag
  • Строка меню -> View -> Cell toolbar -> Tags Введите parameters в поле в правом верхнем углу ячейки Нажмите Add tag

    Here, we’ve parameterized the third cell so we can set INDEX externally via papermill.

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

    How to parameterize a cell

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

    Next, we create a notebook (runner.ipynb) to run basic.ipynb with different parameters. Here’s a code snippet on how to do this, where we:

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

  • Iterate through the various indices
  • Execute basic.ipynb with different indices (via the parameter argument)
  • Save each notebook individually (e.g., basic_SNP.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))

    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))

    Running all the notebooks with Papermill

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

    Now, wasn’t that simple?

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

    With this approach, we minimize code duplication. Also, each experiment’s code, visualizations, and evaluation metrics are logged in a notebook, allowing easy reference and replication.

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

    Nonetheless, how can we get an overall view of experiment results, without going through each notebook? Is there a way to group and store each experiments’ evaluation metrics, visualizations, and trained models? Can this then be consolidated and accessed from a single location?

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

    Step 3: 100 (metrics) in one (dashboard)

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

    Each notebook trains five ML models and evaluates them on four metrics. For each model, we produce two graphs (i.e., ROC curve, precision-recall curve) and a model binary.

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

    That’s 20 metrics, 10 graphs, and 5 model binaries per experiment run—this can quickly get out of hand.

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

    To get this under control, we can use mlflow.

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

    MLflow is a framework that helps with tracking experiments and ensuring reproducible workflows for deployment. It has three components (tracking, projects, models). This walkthrough will focus on the first which has an API and UI for logging parameters, metrics, artifacts, etc.

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

    Automatically logging each experiment is easy with this snippet of code:

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

    In the above, with every ML model trained, we log parameters (e.g., stock index, model name, secret sauce), metrics (e.g., AUC, precision), and artefacts (e.g., visualisations, model binaries). This is pretty basic and you can do it yourself with a bit of python code.

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

    Where mlflow shines is its server and UI. Starting up the server (mlflow server) and navigating to the dashboard (127.0.0.1:5000) is easy. (The server can also be hosted centrally and users can push their metrics and artifacts to it.)

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

    The MLflow UI consolidates all your parameters and metrics on a single homepage for easy viewing.

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

    All your experiment metrics at your fingertips

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

    You can sort experiments by metrics or parameters. Here, we sort it by AUC descending.

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

    Looks like simple (logistic regression) is best

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

    It also allows customer filters via parameters and metrics. Here’s we filter for Logistic Regression.

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

    It's easy to filter your experiments based on parameters and/or metrics

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

    But where are the artifacts from each experiment? Click on the experiment and you’ll be brought to the experiment page where you can view all your artifacts and download them.

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

    Everything (metrics, artefacts) about an experiment in one location

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

    How to get started

    Как начать

    In the walkthrough above, we saw how we could run multiple experiments from a single notebook (with papermill), and log the results and artifacts in a single UI (with mlflow).

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

    Here’s the git repo to the notebooks used in the walkthrough. Clone it and try it. Give it a star if you found it useful. Actively try to integrate papermill and mlflow into your work.

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

    Automate your experimentation workflow to minimize effort and iterate faster, increasing your chances of success.

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

    Thanks to Gabriel Chuan and Michael Ng for reading drafts of this.

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

    If you found this useful, please cite this write-up as:

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

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

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

    or

    или

    @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/} }

    @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/} }



    Join 11,800+ readers getting updates on machine learning, RecSys, LLMs, and engineering.

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