Усовершенствуйте свой рабочий процесс машинного обучения: как использовать MLflow для отслеживания экспериментов и управления моделями

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

Введение — млфлоу

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

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

В этом блоге мы рассмотрим, как использовать MLflow для отслеживания экспериментов и управления моделями на примере прогнозирования диабета. Но перед этим давайте рассмотрим некоторые важные концепции mlflow.

Компоненты млфлота

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

Отслеживание MLflow. Этот компонент позволяет специалистам по данным выполнять track , compare experiments, store artifacts и results, и visualize metrics в пользовательском веб-интерфейсе. Благодаря отслеживанию MLflow пользователи могут воспроизводить результаты и делиться ими со своей командой, что помогает оптимизировать совместную работу и принимать решения на основе данных.

Модели MLflow: Компонент Модели MLflow предоставляет стандартизированный способ упаковки моделей машинного обучения в нескольких форматах, включая функции Python, образы Docker и многое другое. Это позволяет специалистам по данным легко развертывать модели в различных средах и делиться ими с другими. С помощью моделей MLflow пользователи также могут отслеживать родословную модели, которая показывает полную историю разработки модели, что упрощает воспроизведение и проверку результатов.

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

Проекты MLflow.Компонент Проекты MLflow предоставляет простой способ упаковки кода, данных и зависимостей в повторно используемый и воспроизводимый формат. С MLflow Projects пользователи могут легко делиться своим кодом и воспроизводить результаты даже на разных машинах и в разных средах. Этот компонент особенно полезен для управления крупномасштабными проектами и совместными исследованиями.

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

Установка млфлов

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

$ python3 -m venv venv

Активируйте виртуальную среду, используя:

$ . venv/bin/activate

После активации виртуальной среды вы можете установить MLflow с помощью следующей команды:

$ pip install mlflow

После установки вы можете убедиться, что она прошла успешно, проверив версию MLflow с помощью команды

$ mlflow --version
// output:
// mlflow, version 2.2.2

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

Отслеживание экспериментов

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

Вот несколько примеров того, как отслеживание экспериментов можно использовать с MLflow:

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

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

Запись артефактов. Специалисты по данным могут использовать Artifact API в MLflow для записи и хранения артефактов, таких как обученные модели, входные и выходные данные. Это помогает отслеживать данные, используемые во время экспериментов, и обеспечивает воспроизводимость результатов.

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

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

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

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

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

Импорт всех необходимых библиотек

Во-первых, нам нужно импортировать необходимые библиотеки

import pandas as pd
import numpy as np

Импорт данных

Затем мы можем загрузить наш набор данных, используя функцию read_csv панд. Мы загрузим файл 'diabetes.csv' в кадр данных pandas с именем df. Мы можем загрузить данные, используя следующий код:

df = pd.read_csv("diabetes.csv")

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

df.info()
#output
"""
 #   Column                    Non-Null Count  Dtype  
---  ------                    --------------  -----  
 0   Pregnancies               768 non-null    int64  
 1   Glucose                   768 non-null    int64  
 2   BloodPressure             768 non-null    int64  
 3   SkinThickness             768 non-null    int64  
 4   Insulin                   768 non-null    int64  
 5   BMI                       768 non-null    float64
 6   DiabetesPedigreeFunction  768 non-null    float64
 7   Age                       768 non-null    int64  
 8   Outcome                   768 non-null    int64  
dtypes: float64(2), int64(7)
memory usage: 54.1 KB
"""

Подготовка данных для обучения и тестирования

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

X = df.drop(columns=["Outcome"]).values
y = df["Outcome"].values

Далее мы разделим наши данные на наборы данных для обучения и тестирования, используя функцию train_test_split из библиотеки sklearn. Мы будем использовать 70% данных для обучения и 30% для тестирования, а для воспроизводимости зададим случайное состояние. Мы можем разделить наши данные, используя следующий код:

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=0.3, random_state=10)
print("X train shape: {} and y train shape: {}".format(X_train.shape, y_train.shape))
print("X test shape: {} and y test shape: {}".format(X_test.shape, y_test.shape))

# output
"""
X train shape: (537, 8) and y train shape: (537,)
X test shape: (231, 8) and y test shape: (231,)
"""

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

from sklearn.impute import SimpleImputer
values_fill = SimpleImputer(missing_values=0, strategy="mean")
X_train = values_fill.fit_transform(X_train)
X_test = values_fill.fit_transform(X_test)

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

Обучение модели — используйте mlflow для отслеживания экспериментов

Во-первых, мы начнем с настройки внутреннего сервера mlflow с использованием базы данных SQLite для отслеживания всех изменений, внесенных в ходе наших экспериментов. Мы также установим название эксперимента «diabetes-prediction-exp-1», используя mlflow.

mlflow ui --backend-store-uri sqlite:///mlflow.db

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

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

import mlflow
mlflow.set_tracking_uri("sqlite:///mlflow.db")
mlflow.set_experiment("diabetes-prediction-exp-1")


from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, mean_squared_error, confusion_matrix

Мы также сохраним обученную модель, используя pickle, и зарегистрируем ее как артефакт в mlflow.

import pickle

with mlflow.start_run(run_name="diabetes-1.1"):
    random_state = 8
    mlflow.set_tag("developer", "dev-name")
    mlflow.log_param("random_state", random_state) # hyperparameters of models or other parameters that changes during experimentation


    rfm = RandomForestClassifier(random_state=random_state)
    rfm.fit(X_train, y_train)
    y_pred = rfm.predict(X_test)

    rmse = mean_squared_error(y_test, y_pred, squared=False)
    accuracy = accuracy_score(y_test, y_pred)

    mlflow.log_param("rmse", rmse)
    mlflow.log_param("accuracy score", accuracy)


    print("RandomForest accuracy: {}".format(accuracy_score(y_test, y_pred)))

    # save model
    pickle.dump(rfm, open('models/model.pkl', 'wb'))

    mlflow.log_artifact(local_path="/models", artifact_path="models_pickle")

Будет создан цикл, который можно просмотреть на localhost:5000, на вкладке diabetes-prediction-exp-1.

Если мы нажмем на самый последний запуск, то есть на первый, мы увидим журналы как параметры, метрики, артефакты и т. д.

В поисках лучшей модели

После обучения нашей исходной модели мы будем использовать hyperopt для поиска лучших параметров для обучения нашей модели.

from hyperopt import fmin, tpe, hp, STATUS_OK, Trials
from hyperopt.pyll import scope

Мы определим целевую функцию, которая принимает проверяемые параметры и регистрирует RMSE и показатель точности в mlflow.

def objective(params):
    with mlflow.start_run():
        mlflow.set_tag("model", "randomforest")
        mlflow.log_params(params)
        rfm = RandomForestClassifier(random_state=random_state)
        rfm.fit(X_train, y_train)
        y_pred = rfm.predict(X_test)

        rmse = mean_squared_error(y_test, y_pred, squared=False)
        accuracy = accuracy_score(y_test, y_pred)

        mlflow.log_param("rmse", rmse)
        mlflow.log_param("accuracy score", accuracy)

        y_pred = rfm.predict(X_test)
        rmse = mean_squared_error(y_test, y_pred, squared=False)
        mlflow.log_metric("rmse", rmse)

    return {'loss': rmse, 'status': STATUS_OK}

Затем мы будем использовать hyperopt для поиска лучших параметров, указав пространство поиска, алгоритм и максимальное количество оценок. На выходе будут лучшие параметры, найденные hyperopt.

search_space = {
    "n_estimators": hp.choice("n_estimators", [100, 200, 300, 400,500,600]),
    "max_depth": hp.quniform("max_depth", 1, 15,1),
    "criterion": hp.choice("criterion", ["gini", "entropy"]),
}

best_result = fmin(
    fn=objective,
    space=search_space,
    algo=tpe.suggest,
    max_evals=50,
    trials=Trials()
)

print(f"Best: {best_result}")

# output
# Best: {'criterion': 0, 'max_depth': 1.0, 'n_estimators': 5}

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

best_params = {
    'criterion': 0, 
    'max_depth': 1.0, 
    'n_estimators': 5
    }

mlflow.sklearn.autolog()
best = fmin(
    fn=objective,
    space=best_params,
    algo=tpe.suggest,
    max_evals=1,
    trials=Trials()
)

Пример панели

Несколько примеров скриншотов панели управления mlflow.

Заключение

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

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