Регистрация моделей MLflow

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

Почему нужно регистрировать модели, а не артефакты?

От артефактов до моделей в MLflow описывается разница между артефактами ведения журнала или файлами по сравнению с моделями MLflow.

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

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

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

В этом разделе описывается, как использовать концепцию модели в Машинное обучение Azure с MLflow:

Регистрация моделей с помощью автоматической регистрации

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

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

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

mlflow.autolog()

model = XGBClassifier(use_label_encoder=False, 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)

Совет

Если использовать конвейеры Машинное обучение, например конвейеры Scikit-Learn, используйте autolog функциональные возможности этого вкуса конвейера для моделей журналов. Ведение журнала модели автоматически происходит при fit() вызове метода в объекте конвейера. Учебный и отслеживающий классификатор XGBoost с записной книжкой MLflow демонстрирует, как регистрировать модель с предварительной обработкой с помощью конвейеров.

Регистрирование моделей с помощью пользовательской сигнатуры, среды или примеров

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

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

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

В этом примере кода регистрируется модель для классификатора XGBoost:

import mlflow
from xgboost import XGBClassifier
from sklearn.metrics import accuracy_score
from mlflow.models import infer_signature
from mlflow.utils.environment import _mlflow_conda_env

mlflow.autolog(log_models=False)

model = XGBClassifier(use_label_encoder=False, 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)

# Signature
signature = infer_signature(X_test, y_test)

# Conda environment
custom_env =_mlflow_conda_env(
    additional_conda_deps=None,
    additional_pip_deps=["xgboost==1.5.2"],
    additional_conda_channels=None,
)

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

# Log the model manually
mlflow.xgboost.log_model(model, 
                         artifact_path="classifier", 
                         conda_env=custom_env,
                         signature=signature,
                         input_example=input_example)

Примечание.

  • autolog имеет конфигурацию log_models=False . Это предотвращает автоматическое ведение журнала моделей MLflow. Автоматическое ведение журнала моделей MLflow происходит позже, как ручной процесс
  • infer_signature Используйте метод, чтобы попытаться определить подпись непосредственно из входных и выходных данных
  • Этот mlflow.utils.environment._mlflow_conda_env метод является частным методом в пакете SDK MLflow. В этом примере код упрощается, но используйте его с осторожностью. Это может измениться в будущем. В качестве альтернативы можно создать определение YAML вручную в виде словаря Python.

Регистрация моделей с другим поведением в методе прогнозирования

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

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

Регистрация пользовательских моделей

MLflow поддерживает множество платформ машинного обучения, включая

  • CatBoost
  • FastAI
  • h2o
  • Keras
  • LightGBM
  • MLeap
  • MXNet Gluon
  • ONNX
  • Prophet
  • PyTorch
  • Scikit-Learn
  • Ошалевшие
  • Spark MLLib
  • statsmodels
  • TensorFlow
  • XGBoost

Однако может потребоваться изменить способ работы вкуса, записать модель, не поддерживаемую 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):
        # You don't have to keep the semantic meaning of `predict`. You can use here model.recommend(), model.forecast(), etc
        return self._model.predict_proba(data)

    # You can even add extra functions if you need to. Since the model is serialized,
    # all of them will be available when you load your model back.
    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)

model = XGBClassifier(use_label_encoder=False, 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("classifier", 
                        python_model=ModelWrapper(model),
                        signature=signature)

Совет

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

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