Поделиться через


Ведение журналов моделей MLflow

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

Предпосылки

  • Пакет пакета SDK MLflow mlflow (версия 2.16.x или более ранняя версия)
  • Плагин MLflow для машинного обучения Azure azureml-mlflow
  • Пакет xgboost (версия 2.1.1 или более ранняя версия)
  • Пакет scikit-learn

Это важно

Машинное обучение Azure совместимо с MLflow 2.16 и более ранними версиями. MLflow 2.17 и более поздние версии вводят изменения в артефактные репозитории и API LoggedModels, которые подключаемый модуль azureml-mlflow в данный момент не поддерживает. Зафиксируйте версии MLflow и XGBoost, чтобы избежать проблем с совместимостью.

pip install "mlflow<=2.16.2" azureml-mlflow "xgboost<=2.1.1" scikit-learn

Использование автоматического ведения журналирования моделей

Используйте функцию MLflow autolog для автоматического журнала моделей. При использовании автоматического ведения журнала MLflow записывает все соответствующие метрики, параметры, артефакты и модели в вашей платформе. Данные, регистрируемые в журнал, зависят от фреймворка. По умолчанию при включении автоматического ведения журнала большинство моделей регистрируются. В некоторых ситуациях некоторые версии не ведут журнал моделей. Например, вкус PySpark не регистрирует модели, превышающие определенный размер.

Используйте либо mlflow.autolog, либо mlflow.<flavor>.autolog для активации автоматического ведения журнала. Следующий код используется autolog для регистрации модели классификатора, обученной с помощью XGBoost:

import mlflow
from xgboost import XGBClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# Load sample data and split into train/test sets.
X, y = load_breast_cancer(return_X_y=True, as_frame=True)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

mlflow.autolog()

model = XGBClassifier(eval_metric="logloss")
model.fit(X_train, y_train, eval_set=[(X_test, y_test)], verbose=False)

y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)

Ссылки:mlflow.autolog | XGBClassifier | accuracy_score

Примечание.

Остальные примеры кода в этой статье повторно используют переменные X_train, X_test, y_train и y_test из предыдущей настройки данных.

Совет

Если вы используете конвейеры машинного обучения, например конвейеры scikit-learn, используйте функциональные возможности этого типа конвейера для записи моделей. Ведение журнала модели автоматически выполняется при вызове fit метода в объекте конвейера. Записная книжка, которая регистрирует модель, включает предварительную обработку и использует конвейеры, см. в статье "Обучение и отслеживание классификатора XGBoost с помощью MLflow".

Почему логарифмические модели вместо артефактов?

Модели журналирования, а не необработанные артефакты, обеспечивают структурированный контракт между создателями моделей и потребителями. Подробное сравнение см. в разделе "Артефакты и модели" в MLflow.

Ведение журнала моделей обеспечивает следующие преимущества:

  • Вы можете использовать mlflow.<flavor>.load_model для непосредственной загрузки моделей для вывода и использовать функцию predict .
  • Входные данные конвейера могут использовать модели напрямую.
  • Модели можно развертывать без указания скрипта оценки или среды.
  • Swagger автоматически включается в рабочих конечных точках. В результате вы можете использовать функцию тестирования в студии машинного обучения Azure для тестирования моделей.
  • Вы можете использовать панель мониторинга ответственного искусственного интеллекта. Дополнительные сведения см. в статье "Использование панели мониторинга ответственного искусственного интеллекта" в студии машинного обучения Azure.

Модели журналов, использующие настраиваемую подпись, среду или примеры

Используйте метод MLflow mlflow.<flavor>.log_model для ручного журнала моделей. Этот рабочий процесс позволяет контролировать различные аспекты ведения журнала моделей.

Используйте этот метод, когда:

  • Необходимо указать среду Conda или пакеты pip, которые отличаются от автоматически обнаруженных пакетов или среды.
  • Вы хотите включить входные примеры.
  • В пакет необходимо включить определенные артефакты.
  • Метод autolog не правильно выводит подпись. Эта проблема может возникать при работе с тензорными входными данными, которые требуют, чтобы подпись была определенной фигурой.
  • Метод autolog не соответствует всем вашим потребностям.

Следующий код регистрирует модель классификатора XGBoost:

import mlflow
from xgboost import XGBClassifier
from sklearn.metrics import accuracy_score
from mlflow.models import infer_signature

mlflow.autolog(log_models=False)

with mlflow.start_run():
    model = XGBClassifier(eval_metric="logloss")
    model.fit(X_train, y_train, eval_set=[(X_test, y_test)], verbose=False)
    y_pred = model.predict(X_test)

    accuracy = accuracy_score(y_test, y_pred)

    # Infer the signature.
    signature = infer_signature(X_test, y_test)

    # Sample the data.
    input_example = X_train.sample(n=1)

    # Log the model manually.
    mlflow.xgboost.log_model(model, 
                             artifact_path="classifier", 
                             pip_requirements=["xgboost>=2.0"],
                             signature=signature,
                             input_example=input_example)

Ссылки:mlflow.xgboost.log_model | infer_signature

Примечание.

  • Вызов autolog использует конфигурацию log_models=False. Этот параметр отключает автоматическое ведение журнала моделей MLflow. Метод log_model используется позже для ручной регистрации модели.
  • Метод infer_signature пытается определить подпись непосредственно из входных и выходных данных.
  • Параметр pip_requirements задает пакеты, необходимые для модели. В качестве альтернативы можно использовать conda_env параметр с словарем или файлом YAML.

Модели журналов, использующие измененное поведение прогнозирования

При использовании mlflow.autolog или mlflow.<flavor>.log_model для регистрации модели, тип модели определяет, как выполняется вывод. Вкус также определяет, что возвращает модель. MLflow не предписывает определенное поведение относительно генерации predict результатов. В некоторых сценариях может потребоваться предварительно обработать данные или подвергнуть их последующей обработке.

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

Журнал пользовательских моделей

MLflow поддерживает множество платформ машинного обучения, включая CatBoost, Keras, LightGBM, ONNX, PyTorch, scikit-learn, Spark MLlib, TensorFlow, XGBoost и другие. Полный список см. в разделе Built-In "Варианты модели".

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

Чтобы решить проблему, MLflow предлагает версию PyFunc, стандартный интерфейс для моделей Python. Этот вариант может регистрировать любой объект как модель, если этот объект удовлетворяет двум условиям:

  • Вы реализуете как минимум метод predict.
  • Объект Python наследует от mlflow.pyfunc.PythonModel класса.

Совет

Сериализуемые модели, реализующие API scikit-learn, могут использовать модуль scikit-learn для записи модели, независимо от того, была ли модель построена с использованием scikit-learn. Если вы можете сохранить свою модель в формате Pickle, и объект имеет как минимум методы predict и predict_proba, используйте mlflow.sklearn.log_model для фиксации модели в процессе запуска MLflow.

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

Используйте этот метод, когда:

  • Вы можете сериализовать вашу модель в формате «Pickle».
  • Вы хотите сохранить состояние модели сразу после обучения.
  • Вы хотите настроить способ predict работы функции.

Следующий код оборачивает модель, созданную с помощью XGBoost, так что она ведет себя иначе, чем стандартная реализация XGBoost. Он возвращает вероятности вместо классов.

from mlflow.pyfunc import PythonModel, PythonModelContext

class ModelWrapper(PythonModel):
    def __init__(self, model):
        self._model = model

    def predict(self, context: PythonModelContext, data, params=None):
        # The next line uses a prediction function. However, you could also use model.recommend(), model.forecast(), or a similar function instead.
        return self._model.predict_proba(data)

    # You can add extra functions if you need to. Because the model is serialized,
    # all of them are available when you load your model.
    def predict_batch(self, data):
        pass

Используйте следующий код для регистрации пользовательской модели во время выполнения:

import mlflow
from xgboost import XGBClassifier
from sklearn.metrics import accuracy_score
from mlflow.models import infer_signature

mlflow.xgboost.autolog(log_models=False)

with mlflow.start_run():
    model = XGBClassifier(eval_metric="logloss")
    model.fit(X_train, y_train, eval_set=[(X_test, y_test)], verbose=False)
    y_probs = model.predict_proba(X_test)

    accuracy = accuracy_score(y_test, y_probs.argmax(axis=1))
    mlflow.log_metric("accuracy", accuracy)

    signature = infer_signature(X_test, y_probs)
    mlflow.pyfunc.log_model(artifact_path="classifier", 
                            python_model=ModelWrapper(model),
                            signature=signature)

Ссылки:mlflow.pyfunc.log_model | PythonModel

Совет

В приведенном выше коде метод infer_signature использует y_probs для вывода сигнатуры. Целевой столбец содержит целевой класс, но модель возвращает две вероятности для каждого класса.

Следующий шаг