Регистрация моделей 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
для вывода подписи. Наш целевой столбец имеет целевой класс, но наша модель теперь возвращает две вероятности для каждого класса.