Sdílet prostřednictvím


Převod vlastních modelů ML na formátované modely MLflow

V tomto článku se dozvíte, jak převést vlastní model ML na formát 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 příchutě modelu MLflow. Vzhledem k tomu, že chybí integrovaná příchuť modelu MLflow, nemůžete model protokolovat ani zaregistrovat pomocí rozhraní API pro fluentní rozhraní MLflow modelu. Pokud chcete tento problém vyřešit, můžete model převést do formátu MLflow, kde můžete použít následující výhody modelů Azure Machine Learning a MLflow.

Díky Azure Machine Learning získají modely MLflow další výhody:

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

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

Pokud jste model nenatrénovali pomocí MLFlow a chcete použít nabídku nasazení bez kódu MLflow služby Azure Machine Learning, musíte vlastní model převést na MLFLow. Další informace najdete v tématu Vlastní modely Pythonu.

Požadavky

  • Nainstalujte balíček mlflow.

Vytvoření obálky Pythonu pro váš model

Než budete moct model převést na podporovaný formát MLflow, musíte pro svůj model 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 vytvořte prostředí Conda pro nový model MLflow, který obsahuje všechny nezbytné 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 předpovědí testů

Jakmile bude vaše prostředí připravené, předejte SKlearnWrapperprostředí Conda a nově vytvořený slovník artefaktů do mlflow.pyfunc.save_model() metody. 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, načtěte model a vytiskněte si predikci testu, abyste mohli porovnat původní model.

Následující kód vytiskne predikci testu z modelu formátovaného mlflow a předpověď testu z modelu sklearn. Uloží předpovědi testů na 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 formátovaného MLflow

Po potvrzení správného uložení modelu můžete vytvořit testovací běh. Zaregistrujte a uložte model formátovaný MLflow do registru modelů.


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 příchutě 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 nemá integrovanou příchuť modelu MLflow, nemůžete model protokolovat ani zaregistrovat pomocí rozhraní API fluentu modelu MLflow. Příklad uložení, protokolování a registrace modelu, který nemá podporovanou integrovanou příchuť modelu MLflow, najdete v tématu Registrace nepodporovaného modelu strojového učení.