# Интеграция MLflow

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

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

```python
# Для этого учебного пособия нам нужно установить 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

```

```python
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. Это включает в себя информацию, такую как параметры модели, метрики и выходные файлы.

```python
# Установите переменную 'local' на True, если вы хотите запустить этот ноутбук локально
local = False
```

```python
# Устанавливаем URI нашего сервера отслеживания для логирования, если переменная 'local' установлена в True
mlflow.set_tracking_uri(uri="http://127.0.0.1:8080") if local else None
```

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

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

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

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

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

```python
# Запускаем новый сеанс 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](http://localhost:8080/), мы можем просто перейти к этому URL в нашем браузере и наблюдать за нашими экспериментами. Если мы нажмем на соответствующие эксперименты, мы увидим список всех запусков, связанных с экспериментом. Нажав на запуск, мы перейдем на страницу запуска, где будут показаны детали того, что мы зарегистрировали.

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

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

```python
# Настройка 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)

```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://bemind.gitbook.io/neural/neuralprophet/rukovodstva-po-funkciyam/integraciya-mlflow.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
