Logga MLflow-modeller

Den här artikeln beskriver hur du loggar dina tränade modeller (eller artefakter) som MLflow-modeller. Den utforskar de olika sätten att anpassa hur MLflow paketera dina modeller och hur de kör dessa modeller.

Varför logga modeller i stället för artefakter?

Från artefakter till modeller i MLflow beskriver skillnaden mellan loggningsartefakter eller filer, jämfört med loggning av MLflow-modeller.

En MLflow-modell är också en artefakt. Den modellen har dock en specifik struktur som fungerar som ett kontrakt mellan den person som skapade modellen och den person som avser att använda den. Det här kontraktet hjälper dig att skapa en brygga mellan själva artefakterna och deras betydelser.

Modellloggning har följande fördelar:

  • Du kan läsa in modeller direkt för slutsatsdragning med mlflow.<flavor>.load_model, och du kan använda predict funktionen
  • Pipelineindata kan använda modeller direkt
  • Du kan distribuera modeller utan att ange ett bedömningsskript eller en miljö
  • Swagger aktiveras automatiskt i distribuerade slutpunkter och Azure Machine Learning-studio kan använda testfunktionen
  • Du kan använda instrumentpanelen ansvarsfull AI

I det här avsnittet beskrivs hur du använder modellens koncept i Azure Machine Learning med MLflow:

Loggningsmodeller med automatisk loggning

Du kan använda funktionen för automatisk MLflow-loggning. Med automatisk loggning kan MLflow instruera ramverket som används att logga alla mått, parametrar, artefakter och modeller som ramverket anser vara relevanta. Om automatisk loggning är aktiverat loggas de flesta modeller som standard. I vissa situationer kanske vissa smaker inte loggar en modell. PySpark-smaken loggar till exempel inte modeller som överskrider en viss storlek.

Använd antingen mlflow.autolog() eller mlflow.<flavor>.autolog() för att aktivera automatisk loggning. Det här exemplet används autolog() för att logga en klassificerarmodell som tränats med XGBoost:

import mlflow
from xgboost import XGBClassifier
from sklearn.metrics import accuracy_score

mlflow.autolog()

model = XGBClassifier(use_label_encoder=False, eval_metric="logloss")
model.fit(X_train, y_train, eval_set=[(X_test, y_test)], verbose=False)

y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)

Dricks

Om du använder Machine Learning-pipelines, till exempel Scikit-Learn-pipelines, använder du funktionerna i pipelinesmaken autolog för att logga modeller. Modellloggning sker automatiskt när fit() metoden anropas för pipelineobjektet. Utbildnings - och spårningsklassificeraren XGBoost med MLflow Notebook visar hur du loggar en modell med förbearbetning med hjälp av pipelines.

Loggningsmodeller med en anpassad signatur, miljö eller exempel

MLflow-metoden mlflow.<flavor>.log_model kan manuellt logga modeller. Det här arbetsflödet kan styra olika aspekter av modellloggningen.

Använd den här metoden när:

  • Du vill ange pip-paket eller en conda-miljö som skiljer sig från dem som identifieras automatiskt
  • Du vill ta med indataexempel
  • Du vill inkludera specifika artefakter i det nödvändiga paketet
  • autolog inte korrekt härleder din signatur. Detta är viktigt när du hanterar tensor-indata, där signaturen behöver specifika former
  • Autolog-beteendet täcker inte ditt syfte av någon anledning

Det här kodexemplet loggar en modell för en XGBoost-klassificerare:

import mlflow
from xgboost import XGBClassifier
from sklearn.metrics import accuracy_score
from mlflow.models import infer_signature
from mlflow.utils.environment import _mlflow_conda_env

mlflow.autolog(log_models=False)

model = XGBClassifier(use_label_encoder=False, eval_metric="logloss")
model.fit(X_train, y_train, eval_set=[(X_test, y_test)], verbose=False)
y_pred = model.predict(X_test)

accuracy = accuracy_score(y_test, y_pred)

# Signature
signature = infer_signature(X_test, y_test)

# Conda environment
custom_env =_mlflow_conda_env(
    additional_conda_deps=None,
    additional_pip_deps=["xgboost==1.5.2"],
    additional_conda_channels=None,
)

# Sample
input_example = X_train.sample(n=1)

# Log the model manually
mlflow.xgboost.log_model(model, 
                         artifact_path="classifier", 
                         conda_env=custom_env,
                         signature=signature,
                         input_example=input_example)

Kommentar

  • autolog har konfigurationen log_models=False . Detta förhindrar automatisk MLflow-modellloggning. Automatisk MLflow-modellloggning sker senare, som en manuell process
  • infer_signature Använd metoden för att försöka härleda signaturen direkt från indata och utdata
  • Metoden mlflow.utils.environment._mlflow_conda_env är en privat metod i MLflow SDK. I det här exemplet gör det koden enklare, men använd den med försiktighet. Det kan ändras i framtiden. Alternativt kan du generera YAML-definitionen manuellt som en Python-ordlista.

Loggningsmodeller med ett annat beteende i förutsägelsemetoden

När du loggar en modell med antingen mlflow.autolog eller mlflow.<flavor>.log_modelavgör modellsmaken hur slutsatsdragningen ska köras och vad modellen returnerar. MLflow tillämpar inte något specifikt beteende om genereringen av predict resultat. I vissa scenarier kanske du vill utföra viss förbearbetning eller efterbearbetning före och efter att din modell har körts.

I den här situationen implementerar du maskininlärningspipelines som direkt flyttas från indata till utdata. Även om den här implementeringen är möjlig och ibland uppmuntras att förbättra prestandan kan det bli svårt att uppnå. I dessa fall kan det hjälpa dig att anpassa hur din modell hanterar slutsatsdragning enligt beskrivningen i nästa avsnitt.

Logga anpassade modeller

MLflow stöder många maskininlärningsramverk, inklusive

  • CatBoost
  • FastAI
  • H2o
  • Keras
  • LightGBM
  • MLeap
  • MXNet Gluon
  • ONNX
  • Profeten
  • PyTorch
  • Scikit-Learn
  • spaCy
  • Spark MLLib
  • statsmodels
  • TensorFlow
  • XGBoost

Du kan dock behöva ändra hur en smak fungerar, logga en modell som inte stöds internt av MLflow eller till och med logga en modell som använder flera element från olika ramverk. I dessa fall kan du behöva skapa en anpassad modellsmak.

För att lösa problemet introducerar pyfunc MLflow smaken (från och med en Python-funktion). Den här smaken kan logga valfritt objekt som en modell, så länge objektet uppfyller två villkor:

  • Du implementerar metodmetoden predict , åtminstone
  • Python-objektet ärver från mlflow.pyfunc.PythonModel

Dricks

Serialiserbara modeller som implementerar Scikit-learn-API:et kan använda Scikit-learn-smaken för att logga modellen, oavsett om modellen har skapats med Scikit-learn. Om du kan bevara din modell i Pickle-format och objektet har predict() metoderna och predict_proba() (åtminstone) kan du använda mlflow.sklearn.log_model() för att logga modellen i en MLflow-körning.

Om du skapar en omslutning runt ditt befintliga modellobjekt blir det enklast att skapa en smak för din anpassade modell. MLflow serialiserar och paketerar det åt dig. Python-objekt kan serialiseras när objektet kan lagras i filsystemet som en fil, vanligtvis i Pickle-format. Vid körning kan objektet materialiseras från filen. Detta återställer alla värden, egenskaper och metoder som är tillgängliga när det sparades.

Använd den här metoden när:

  • Du kan serialisera din modell i Pickle-format
  • Du vill behålla modellens tillstånd, som det var strax efter träningen
  • Du vill anpassa hur predict funktionen fungerar.

Det här kodexemplet omsluter en modell som skapats med XGBoost så att den fungerar på ett annat sätt än standardimplementeringen för XGBoost-smaken. I stället returneras sannolikheterna i stället för klasserna:

from mlflow.pyfunc import PythonModel, PythonModelContext

class ModelWrapper(PythonModel):
    def __init__(self, model):
        self._model = model

    def predict(self, context: PythonModelContext, data):
        # You don't have to keep the semantic meaning of `predict`. You can use here model.recommend(), model.forecast(), etc
        return self._model.predict_proba(data)

    # You can even add extra functions if you need to. Since the model is serialized,
    # all of them will be available when you load your model back.
    def predict_batch(self, data):
        pass

Logga en anpassad modell på körningen:

import mlflow
from xgboost import XGBClassifier
from sklearn.metrics import accuracy_score
from mlflow.models import infer_signature

mlflow.xgboost.autolog(log_models=False)

model = XGBClassifier(use_label_encoder=False, eval_metric="logloss")
model.fit(X_train, y_train, eval_set=[(X_test, y_test)], verbose=False)
y_probs = model.predict_proba(X_test)

accuracy = accuracy_score(y_test, y_probs.argmax(axis=1))
mlflow.log_metric("accuracy", accuracy)

signature = infer_signature(X_test, y_probs)
mlflow.pyfunc.log_model("classifier", 
                        python_model=ModelWrapper(model),
                        signature=signature)

Dricks

infer_signature Här använder y_probs metoden för att härleda signaturen. Vår målkolumn har målklassen, men vår modell returnerar nu de två sannolikheterna för varje klass.

Nästa steg