Преобразование пользовательских моделей ML в модели формата MLflow

Из этой статьи вы узнаете, как преобразовать пользовательскую модель Машинного обучения в формат MLflow. MLflow — это библиотека с открытым кодом для управления жизненным циклом экспериментов машинного обучения. В некоторых случаях платформа машинного обучения используется без поддержки встроенного типа моделей MLflow. Отсутствие встроенной модели MLflow не позволит зарегистрировать модель с помощью текучих API-интерфейсов модели MLflow. Чтобы устранить эту проблему, можно преобразовать модель в формат MLflow, что позволит использовать описанные ниже преимущества моделей Машинного обучения Azure и MLflow.

В службе "Машинное обучение Azure" модели MLflow получают дополнительные преимущества.

  • Развертывание без кода
  • Переносимость благодаря открытому формату
  • Возможность развертывания локально и в облаке

MLflow обеспечивает поддержку разных платформ машинного обучения (scikit-learn, Keras, Pytorch и так далее), но может быть не лучшим вариантом для некоторых вариантов использования. Например, вы попробуете применить модель MLflow на платформе, для которой MLflow не имеет встроенной поддержки, или захотите изменить предварительную или пост-обработку в модели при выполнении заданий. Дополнительные сведения о моделях MLflow см. в статье От артефактов к моделям в MLflow.

Если вы не использовали MLFlow для обучения модели, но хотите использовать предложение Машинного обучения Azure для развертывания MLflow без кода, вам придется преобразовать пользовательскую модель в формат MLFLow. Дополнительные сведения о пользовательских моделях Python и MLflow.

Предварительные требования

Для преобразования пользовательских моделей в формат MLflow требуется только установленный пакет mlflow.

Создание оболочки Python для модели

Перед преобразованием модели в формат, поддерживаемый MLflow, необходимо сначала создать для нее оболочку Python. Следующий код демонстрирует, как создать оболочку Python для модели sklearn.


# Load training and test datasets
from sys import version_info
import sklearn
import mlflow.pyfunc


PYTHON_VERSION = "{major}.{minor}.{micro}".format(major=version_info.major,
                                                  minor=version_info.minor,
                                                  micro=version_info.micro)

# Train and save an SKLearn model
sklearn_model_path = "model.pkl"

artifacts = {
    "sklearn_model": sklearn_model_path
}

# create wrapper
class SKLearnWrapper(mlflow.pyfunc.PythonModel):

    def load_context(self, context):
        import pickle
        self.sklearn_model = pickle.load(open(context.artifacts["sklearn_model"], 'rb'))
    
    def predict(self, model, data):
        return self.sklearn_model.predict(data)

Создание окружения Conda

После этого вам нужно создать среду Conda для новой модели MLflow, которая содержит все необходимые зависимости. Если среда не указана, она выводится из параметров текущей установки. Также ее можно указать напрямую.


import cloudpickle
conda_env = {
    'channels': ['defaults'],
    'dependencies': [
      'python={}'.format(PYTHON_VERSION),
      'pip',
      {
        'pip': [
          'mlflow',
          'scikit-learn=={}'.format(sklearn.__version__),
          'cloudpickle=={}'.format(cloudpickle.__version__),
        ],
      },
    ],
    'name': 'sklearn_env'
}

Загрузка моделей в формате MLFlow и тестирование прогнозов

Когда среда будет готова, вы сможете передать SKlearnWrapper, среду Conda и созданный словарь артефактов в метод mlflow.pyfunc.save_model(). Эта операция сохраняет модель на диск.

mlflow_pyfunc_model_path = "sklearn_mlflow_pyfunc_custom"
mlflow.pyfunc.save_model(path=mlflow_pyfunc_model_path, python_model=SKLearnWrapper(), conda_env=conda_env, artifacts=artifacts)

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

Следующий код выводит тестовый прогноз из модели в формате mlflow и аналогичный тестовый прогноз из модели sklearn, сохраненной на диске, для их сравнения.

loaded_model = mlflow.pyfunc.load_model(mlflow_pyfunc_model_path)

input_data = "<insert test data>"
# Evaluate the model
import pandas as pd
test_predictions = loaded_model.predict(input_data)
print(test_predictions)

# load the model from disk
import pickle
loaded_model = pickle.load(open(sklearn_model_path, 'rb'))
result = loaded_model.predict(input_data)
print(result)

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

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


mlflow.start_run()

mlflow.pyfunc.log_model(artifact_path=mlflow_pyfunc_model_path, 
                        loader_module=None, 
                        data_path=None, 
                        code_path=None,
                        python_model=SKLearnWrapper(),
                        registered_model_name="Custom_mlflow_model", 
                        conda_env=conda_env,
                        artifacts=artifacts)
mlflow.end_run()

Важно!

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

Дальнейшие действия