Интеграция MLflow

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

NeuralProphet совместим с MLflow, и мы можем отслеживать наши задачи на платформе MLflow.

# Для этого учебного пособия нам нужно установить MLflow.
# !pip install mlflow

# Запустите MLflow tracking-сервер на вашем локальном компьютере
# !mlflow server --host 127.0.0.1 --port 8080

if "google.colab" in str(get_ipython()):
    # Удаляем предустановленные пакеты из Colab, чтобы избежать конфликтов
    !pip uninstall -y torch notebook notebook_shim tensorflow tensorflow-datasets prophet torchaudio torchdata torchtext torchvision
    !pip install git+https://github.com/ourownstory/neural_prophet.git  # может занять некоторое время

# Намного быстрее с использованием следующего кода, но может не иметь последних обновлений/исправлений ошибок
# pip install neuralprophet
import pandas as pd
from neuralprophet import NeuralProphet, set_log_level, save
import mlflow
import time

set_log_level("ERROR")  # Устанавливаем уровень логирования на ERROR, чтобы уменьшить количество выводимой информации

data_location = "https://raw.githubusercontent.com/ourownstory/neuralprophet-data/main/datasets/"
df = pd.read_csv(data_location + "air_passengers.csv")  # Читаем данные из CSV файла в DataFrame

Настройка сервера отслеживания MLflow

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

# Установите переменную 'local' на True, если вы хотите запустить этот ноутбук локально
local = False
# Устанавливаем URI нашего сервера отслеживания для логирования, если переменная 'local' установлена в True
mlflow.set_tracking_uri(uri="http://127.0.0.1:8080") if local else None

Завершить предыдущий запуск

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

# Завершаем предыдущий запуск (если таковой был)
# mlflow.end_run()

Запуск эксперимента MLflow с NeuralProphet

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

# Запускаем новый сеанс MLflow
if local:
    with mlflow.start_run():

        # Создаем новый эксперимент MLflow
        mlflow.set_experiment("NP-MLflow Quickstart_v1")

        # Устанавливаем тег для эксперимента
        mlflow.set_tag("Description", "NeuralProphet MLflow Quickstart")

        # Определяем гиперпараметры NeuralProphet
        params = {
            "n_lags": 5,
            "n_forecasts": 3,
        }

        # Логируем гиперпараметры
        mlflow.log_params(params)

        # Инициализируем и обучаем модель NeuralProphet
        start = time.time()
        m = NeuralProphet(**params)
        metrics_train = m.fit(df=df, freq="MS")
        end = time.time()

        # Логируем длительность обучения
        mlflow.log_metric("duration", end - start)

        # Логируем метрики обучения
        mlflow.log_metric("MAE_train", value=list(metrics_train["MAE"])[-1])
        mlflow.log_metric("RMSE_train", value=list(metrics_train["RMSE"])[-1])
        mlflow.log_metric("Loss_train", value=list(metrics_train["Loss"])[-1])

        # Сохраняем модель
        model_path = "np-model.np"
        save(m, model_path)

        # Логируем модель в MLflow
        mlflow.log_artifact(model_path, "np-model")

Просмотрите запуск NeuralProphet в пользовательском интерфейсе MLflow.

Чтобы увидеть результаты нашего запуска, мы можем перейти в пользовательский интерфейс MLflow. Поскольку мы уже запустили сервер отслеживания по адресу http://localhost:8080, мы можем просто перейти к этому URL в нашем браузере и наблюдать за нашими экспериментами. Если мы нажмем на соответствующие эксперименты, мы увидим список всех запусков, связанных с экспериментом. Нажав на запуск, мы перейдем на страницу запуска, где будут показаны детали того, что мы зарегистрировали.

Расширенный пример

с: авторегистрацией MLflow, набором данных, требованиями и метаданными среды с выводом сигнатуры модели, еще одним экспериментом MLflow с NeuralProphet.

# Настройка MLflow
# Запустите эту команду с активированной средой: mlflow ui --port xxxx (например, 5000, 5001, 5002)
# Скопируйте и вставьте URL из командной строки в веб-браузер

import mlflow
import torchmetrics
from mlflow.data.pandas_dataset import PandasDataset

if local:
    mlflow.pytorch.autolog(
        log_every_n_epoch=1,
        log_every_n_step=None,
        log_models=True,
        log_datasets=True,
        disable=False,
        exclusive=False,
        disable_for_unsupported_versions=False,
        silent=False,
        registered_model_name=None,
        extra_tags=None,
    )

    import mlflow.pytorch
    from mlflow.client import MlflowClient

    model_name = "NeuralProphet"

    with mlflow.start_run() as run:

        dataset: PandasDataset = mlflow.data.from_pandas(df, source="AirPassengersDataset")

        # Логируем датасет в MLflow Run. Указываем контекст "training", чтобы указать, что
        # датасет используется для обучения модели
        mlflow.log_input(dataset, context="training")

        mlflow.log_param("model_type", "NeuralProphet")
        mlflow.log_param("n_lags", 8)
        mlflow.log_param("ar_layers", [8, 8, 8, 8])
        mlflow.log_param("accelerator", "gpu")

        # Для обучения
        # Импортируем класс NeuralProphet
        from neuralprophet import NeuralProphet, set_log_level

        # Отключаем вывод сообщений, если нет ошибок
        set_log_level("ERROR")

        # Создаем модель NeuralProphet с параметрами по умолчанию
        m = NeuralProphet(n_lags=8, ar_layers=[8, 8, 8, 8], trainer_config={"accelerator": "gpu"})

        # Используем статические графики plotly в блокнотах
        m.set_plotting_backend("plotly-resampler")

        # Обучаем модель на датасете
        metrics = m.fit(df)

        df_future = m.make_future_dataframe(df, n_historic_predictions=48, periods=12)

        # Предсказываем будущее
        forecast = m.predict(df_future)

    mlflow.metrics.mae()

    # Сохраняем conda-окружение, используемое для запуска модели
    mlflow.pytorch.get_default_conda_env()

    # Сохраняем требования pip
    mlflow.pytorch.get_default_pip_requirements()

    # Регистрируем модель
    model_uri = f"runs:/{run.info.run_id}/NeuralProphet_test"
    mlflow.register_model(model_uri=model_uri, name=model_name)

Last updated