Преобразование пользовательских моделей ML в модели формата MLflow
Из этой статьи вы узнаете, как преобразовать пользовательскую модель Машинного обучения в формат MLflow. MLflow — это библиотека с открытым кодом для управления жизненным циклом экспериментов машинного обучения. В некоторых случаях платформа машинного обучения используется без поддержки встроенного типа моделей MLflow. Из-за этого отсутствия встроенной версии модели MLflow нельзя регистрировать или регистрировать модель с помощью API-интерфейсов модели MLflow. Чтобы устранить эту проблему, можно преобразовать модель в формат MLflow, где можно применить следующие преимущества Машинное обучение Azure и моделей MLflow.
С помощью Машинное обучение Azure модели MLflow получают дополнительные преимущества:
- Развертывание без кода
- Переносимость благодаря открытому формату
- Возможность развертывания локально и в облаке
MLflow обеспечивает поддержку различных платформ машинного обучения, таких как scikit-learn, Keras и Pytorch. MLflow может не охватывать каждый вариант использования. Например, может потребоваться создать модель MLflow с платформой, которая MLflow не поддерживается в собственном коде. При выполнении заданий может потребоваться изменить способ предварительной обработки или последующей обработки модели. Дополнительные сведения о моделях MLflow см. в разделе "Из артефактов" в модели MLflow.
Если вы не использовали MLFlow для обучения модели, но хотите использовать предложение Машинного обучения Azure для развертывания MLflow без кода, вам придется преобразовать пользовательскую модель в формат MLFLow. Дополнительные сведения см. в разделе "Пользовательские модели Python".
Необходимые компоненты
- Установите пакет
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 и тестовый прогноз из модели slearn. Он сохраняет тестовые прогнозы на диске для сравнения.
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, см. в разделе "Регистрация неподдерживаемой модели Машинное обучение".