Převod vlastních modelů ML na modely ve formátu MLflow

V tomto článku se dozvíte, jak převést vlastní model ML do formátu MLflow. MLflow je opensourcová knihovna pro správu životního cyklu experimentů strojového učení. V některých případech můžete použít architekturu strojového učení bez integrované podpory modelu MLflow. Vzhledem k nedostatku předdefinovaných příchutí modelu MLflow nejde model protokolovat ani registrovat v rozhraních API fluent modelu MLflow. Pokud chcete tento problém vyřešit, můžete model převést na formát MLflow, kde můžete využít následující výhody modelů Azure Machine Learning a MLflow.

S Využitím služby Azure Machine Learning získají modely MLflow další výhody:

  • Žádné nasazení kódu
  • Přenositelnost jako standardní formát open source
  • Možnost nasazení místně i v cloudu

MLflow poskytuje podporu pro různé architektury strojového učení (scikit-learn, Keras, Pytorch a další); nemusí však zahrnovat všechny případy použití. Můžete například chtít vytvořit model MLflow s architekturou, kterou MLflow nativně nepodporuje, nebo můžete chtít změnit způsob, jakým váš model při spouštění úloh předpracovává nebo po zpracování. Další informace o modelech MLflow najdete v tématu Od artefaktů k modelům v MLflow.

Pokud jste model nevytrénovali pomocí MLFlow a chcete použít nabídku nasazení MLflow bez kódu ve službě Azure Machine Learning, musíte vlastní model převést na MLFLow. Přečtěte si další informace o vlastních modelech Pythonu a MLflow.

Požadavky

K převodu vlastních modelů do formátu MLflow je potřeba pouze nainstalovaný balíček mlflow.

Vytvoření obálky Pythonu pro model

Než budete moct převést model na formát podporovaný MLflow, musíte pro svůj model nejprve vytvořit obálku Pythonu. Následující kód ukazuje, jak vytvořit obálku Pythonu sklearn pro model.


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

Vytvoření prostředí Conda

Dále musíte vytvořit prostředí Conda pro nový model MLflow, které obsahuje všechny potřebné závislosti. Pokud není uvedeno, prostředí se odvodí z aktuální instalace. Pokud ne, je možné ji zadat.


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

Načtení modelu ve formátu MLFlow a testování predikcí

Jakmile je prostředí připravené, můžete do metody mlflow.pyfunc.save_model() předat SKlearnWrapper, prostředí Conda a nově vytvořený slovník artefaktů. Tím se model uloží na disk.

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)

Pokud chcete zajistit, aby se nově uložený formátovaný model MLflow během ukládání nezměnil, můžete model načíst a vytisknout testovací předpověď pro porovnání původního modelu.

Následující kód vytiskne předpověď testu z modelu ve formátu mlflow a předpověď testu z modelu sklearn, která se uloží na váš disk pro porovnání.

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)

Registrace modelu ve formátu MLflow

Jakmile ověříte, že se váš model správně uložil, můžete vytvořit testovací spuštění, abyste mohli zaregistrovat a uložit model formátovaný MLflow do registru modelu.


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

Důležité

V některých případech můžete použít architekturu strojového učení bez integrované podpory modelu MLflow. Knihovna je například vaderSentiment standardní knihovna pro zpracování přirozeného jazyka (NLP), která se používá k analýze mínění. Vzhledem k tomu, že chybí předdefinovaný příchuť modelu MLflow, nemůžete model protokolovat ani registrovat s rozhraními API fluent modelu MLflow. Podívejte se na příklad uložení, protokolování a registrace modelu, který nemá podporovanou integrovanou příchuť modelu MLflow.

Další kroky