Share via


Converter modelos de ML personalizados em modelos formatados do MLflow

Neste artigo, saiba como converter o seu modelo de ML personalizado em formato MLflow. O MLflow é uma biblioteca open source para gerir o ciclo de vida das experimentações de machine learning. Em alguns casos, pode utilizar uma arquitetura de machine learning sem o respetivo suporte de sabor de modelo de MLflow incorporado. Devido a esta falta de sabor de modelo de MLflow incorporado, não pode registar ou registar o modelo com APIs fluentes do modelo de MLflow. Para resolver este problema, pode converter o modelo num formato MLflow, onde pode tirar partido dos seguintes benefícios dos modelos do Azure Machine Learning e do MLflow.

Com o Azure Machine Learning, os modelos do MLflow obtêm as vantagens adicionais de,

  • Nenhuma implementação de código
  • Portabilidade como formato padrão open source
  • Capacidade de implementar localmente e na cloud

O MLflow fornece suporte para uma variedade de arquiteturas de machine learning (scikit-learn, Keras, Pytorch e muito mais); no entanto, pode não abranger todos os casos de utilização. Por exemplo, poderá querer criar um modelo de MLflow com uma arquitetura que o MLflow não suporta nativamente ou poderá querer alterar a forma como o modelo faz o pré-processamento ou pós-processamento ao executar tarefas. Para saber mais sobre os modelos do MLflow, leia De artefactos a modelos no MLflow.

Se não tiver preparado o modelo com o MLFlow e quiser utilizar a oferta de implementação sem código do MLflow do Azure Machine Learning, terá de converter o modelo personalizado em MLFLow. Saiba mais sobre os modelos Python personalizados e o MLflow.

Pré-requisitos

Só é necessário o pacote de mlflow instalado para converter os seus modelos personalizados num formato MLflow.

Criar um wrapper python para o modelo

Antes de poder converter o modelo num formato suportado pelo MLflow, primeiro tem de criar um wrapper Python para o seu modelo. O código seguinte demonstra como criar um wrapper Python para um sklearn modelo.


# 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)

Criar um ambiente conda

Em seguida, tem de criar o ambiente conda para o novo Modelo de MLflow que contém todas as dependências necessárias. Se não for indicado, o ambiente é inferido a partir da instalação atual. Caso contrário, pode ser especificado.


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'
}

Carregar o modelo formatado do MLFlow e as predições de teste

Assim que o seu ambiente estiver pronto, pode transmitir o SKlearnWrapper, o ambiente Conda e o dicionário de artefactos recém-criado para o método mlflow.pyfunc.save_model(). Ao fazê-lo, guarda o modelo no disco.

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)

Para garantir que o modelo formatado do MLflow recentemente guardado não foi alterado durante a gravação, pode carregar o modelo e imprimir uma predição de teste para comparar o modelo original.

O código seguinte imprime uma predição de teste do modelo formatado do mlflow e uma predição de teste do modelo sklearn que é guardado no disco para comparação.

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)

Registar o modelo formatado do MLflow

Depois de confirmar que o modelo foi guardado corretamente, pode criar uma execução de teste, para que possa registar e guardar o modelo formatado do MLflow no registo de modelos.


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()

Importante

Em alguns casos, pode utilizar uma arquitetura de machine learning sem o respetivo suporte de sabor de modelo de MLflow incorporado. Por exemplo, a vaderSentiment biblioteca é uma biblioteca padrão de processamento de linguagem natural (NLP) utilizada para análise de sentimentos. Uma vez que não tem um sabor de modelo de MLflow incorporado, não pode registar ou registar o modelo com APIs fluentes do modelo de MLflow. Veja um exemplo sobre como guardar, registar e registar um modelo que não tenha um sabor de modelo de MLflow incorporado suportado.

Passos seguintes