Hantera modellregister i Azure Machine Learning med MLflow

Azure Machine Learning stöder MLflow för modellhantering när det är anslutet till en arbetsyta. En sådan metod är ett bekvämt sätt att stödja hela modelllivscykeln för användare som är bekanta med MLFlow-klienten. I följande artikel beskrivs de olika funktionerna och hur de jämförs med andra alternativ.

Förutsättningar

  • Installera MLflow SDK-paketet mlflow och Azure Machine Learning-plugin-programmet för MLflow azureml-mlflow.

    pip install mlflow azureml-mlflow
    

    Dricks

    Du kan använda mlflow-skinny paketet, som är ett enkelt MLflow-paket utan SQL-lagring, server, användargränssnitt eller datavetenskapsberoenden. mlflow-skinny rekommenderas för användare som främst behöver MLflows spårnings- och loggningsfunktioner utan att importera hela sviten med funktioner, inklusive distributioner.

  • En Azure Machine Learning-arbetsyta. Du kan skapa en genom att följa självstudien Skapa maskininlärningsresurser.

  • Om du utför fjärrspårning (d.v.s. spårningsexperiment som körs utanför Azure Machine Learning) konfigurerar du MLflow så att det pekar på spårnings-URI:n för din Azure Machine Learning-arbetsyta. Mer information om hur du ansluter MLflow till din arbetsyta finns i Konfigurera MLflow för Azure Machine Learning.

  • Observera att organisationsregister inte stöds för modellhantering med MLflow.

  • Vissa åtgärder kan köras direkt med hjälp av MLflow fluent API (mlflow.<method>). Andra kan dock behöva skapa en MLflow-klient som gör det möjligt att kommunicera med Azure Machine Learning i MLflow-protokollet. Du kan skapa ett MlflowClient objekt på följande sätt. I den här självstudien används objektet client för att referera till en sådan MLflow-klient.

    import mlflow
    
    client = mlflow.tracking.MlflowClient()
    

Registrera nya modeller i registret

Modellregistret erbjuder ett bekvämt och centraliserat sätt att hantera modeller på en arbetsyta. Varje arbetsyta har ett eget oberoende modellregister. I följande avsnitt beskrivs flera sätt att registrera modeller i registret med MLflow SDK.

Skapa modeller från en befintlig körning

Om du har en MLflow-modell loggad inuti en körning och du vill registrera den i ett register använder du körnings-ID:t och sökvägen där modellen loggades. Se Hantera experiment och körningar med MLflow för att veta hur du frågar efter den här informationen om du inte har den.

mlflow.register_model(f"runs:/{run_id}/{artifact_path}", model_name)

Kommentar

Modeller kan bara registreras i registret på samma arbetsyta där körningen spårades. Åtgärder mellan arbetsytor stöds inte för tillfället i Azure Machine Learning.

Dricks

Vi rekommenderar att du registrerar modeller från körningar eller använder metoden mlflow.<flavor>.log_model inifrån körningen eftersom den behåller ursprunget från jobbet som genererade tillgången.

Skapa modeller från tillgångar

Om du har en mapp med en MLModel MLflow-modell kan du registrera den direkt. Det finns ingen anledning för modellen att alltid finnas i kontexten för en körning. För att göra det kan du använda URI-schemat file://path/to/model för att registrera MLflow-modeller som lagras i det lokala filsystemet. Nu ska vi skapa en enkel modell med Scikit-Learn och spara den i MLflow-format i den lokala lagringen:

from sklearn import linear_model

reg = linear_model.LinearRegression()
reg.fit([[0, 0], [1, 1], [2, 2]], [0, 1, 2])

mlflow.sklearn.save_model(reg, "./regressor")

Dricks

Metoden save_model() fungerar på samma sätt som log_model(). När log_model() modellen sparas inuti på en aktiv körning save_model() använder det lokala filsystemet för att spara modellen.

Nu kan du registrera modellen från den lokala sökvägen:

import os

model_local_path = os.path.abspath("./regressor")
mlflow.register_model(f"file://{model_local_path}", "local-model-test")

Köra frågor mot modellregister

Du kan använda MLflow SDK för att fråga efter och söka efter modeller som är registrerade i registret. I följande avsnitt beskrivs flera sätt att uppnå det.

Köra frågor mot alla modeller i registret

Du kan köra frågor mot alla registrerade modeller i registret med hjälp av MLflow-klienten. Följande exempel skriver ut alla modellens namn:

for model in client.search_registered_models():
    print(f"{model.name}")

Använd order_by för att beställa efter en specifik egenskap som name, version, creation_timestampoch last_updated_timestamp:

client.search_registered_models(order_by=["name ASC"])

Kommentar

MLflow 2.0-rådgivning: I äldre versioner av Mlflow (<2.0) använder du metoden MlflowClient.list_registered_models() i stället.

Hämta specifika versioner av modellen

Kommandot search_registered_models() hämtar modellobjektet, som innehåller alla modellversioner. Men om du vill hämta den senaste registrerade modellversionen av en viss modell kan du använda get_registered_model:

client.get_registered_model(model_name)

Om du behöver en specifik version av modellen kan du ange följande:

client.get_model_version(model_name, version=2)

Läsa in modeller från registret

Du kan läsa in modeller direkt från registret för att återställa de modellobjekt som loggades. Använd funktionerna mlflow.<flavor>.load_model() eller mlflow.pyfunc.load_model() ange URI:n för den modell som du vill läsa in med hjälp av följande syntax:

  • models:/<model-name>/latest, för att läsa in den senaste versionen av modellen.
  • models:/<model-name>/<version-number>, för att läsa in en specifik version av modellen.
  • models:/<model-name>/<stage-name>, för att läsa in en specifik version i en viss fas för en modell. Visa modellfaser för mer information.

Dricks

Om du vill veta mer om skillnaden mellan mlflow.<flavor>.load_model() och mlflow.pyfunc.load_model()kan du visa arbetsflöden för inläsning av MLflow-modeller.

Modellsteg

MLflow stöder modellens faser för att hantera modellens livscykel. Modellens version kan övergå från en fas till en annan. Faser tilldelas till en modells version (i stället för modeller) vilket innebär att en viss modell kan ha flera versioner i olika faser.

Viktigt!

Faser kan bara nås med MLflow SDK. De visas inte i Azure ML Studio-portalen och kan inte hämtas med varken Azure ML SDK, Azure ML CLI eller Azure ML REST API. Att skapa distribution från en viss modells fas stöds inte för tillfället.

Köra frågor mot modellfaser

Du kan använda MLflow-klienten för att kontrollera alla möjliga steg som en modell kan vara:

client.get_model_version_stages(model_name, version="latest")

Du kan se vilken modellversion som finns på varje fas genom att hämta modellen från registret. I följande exempel hämtas modellens version för närvarande i fasen Staging.

client.get_latest_versions(model_name, stages=["Staging"])

Kommentar

Flera versioner kan vara i samma fas samtidigt i Mlflow, men den här metoden returnerar den senaste versionen (större version) bland dem alla.

Varning

Scennamn är skiftlägeskänsliga.

Övergångsmodeller

Övergången av en modells version till en viss fas kan göras med hjälp av MLflow-klienten.

client.transition_model_version_stage(model_name, version=3, stage="Staging")

Om det fanns en befintlig modellversion i just den fasen finns den som standard kvar där. Därför ersätts den inte eftersom flera modellversioner kan vara i samma fas samtidigt. Du kan också ange archive_existing_versions=True att MLflow ska flytta den befintliga modellens version till fasen Archived.

client.transition_model_version_stage(
    model_name, version=3, stage="Staging", archive_existing_versions=True
)

Läsa in modeller från faser

ou kan läsa in en modell i en viss fas direkt från Python med hjälp av load_model funktionen och följande URI-format. Observera att för att den här metoden ska lyckas måste du ha alla bibliotek och beroenden redan installerade i den miljö som du arbetar på.

model = mlflow.pyfunc.load_model(f"models:/{model_name}/Staging")

Redigera och ta bort modeller

Redigering av registrerade modeller stöds i både Mlflow och Azure ML. Det finns dock vissa skillnader som är viktiga att märka:

Varning

Det går inte att byta namn på modeller i Azure Machine Learning eftersom modellobjekt är oföränderliga.

Redigera modeller

Du kan redigera modellens beskrivning och taggar från en modell med hjälp av Mlflow:

client.update_model_version(model_name, version=1, description="My classifier description")

Om du vill redigera taggar måste du använda metoden set_model_version_tag och remove_model_version_tag:

client.set_model_version_tag(model_name, version="1", key="type", value="classification")

Tar bort en tagg:

client.delete_model_version_tag(model_name, version="1", key="type")

Ta bort en modells version

Du kan ta bort valfri modellversion i registret med hjälp av MLflow-klienten, vilket visas i följande exempel:

client.delete_model_version(model_name, version="2")

Kommentar

Azure Machine Learning stöder inte borttagning av hela modellcontainern. För att uppnå samma sak måste du ta bort alla modellversioner från en viss modell.

Stödmatris för att hantera modeller med MLflow

MLflow-klienten exponerar flera metoder för att hämta och hantera modeller. Följande tabell visar vilka av dessa metoder som för närvarande stöds i MLflow när de är anslutna till Azure ML. Den jämför den också med andra modellers hanteringsfunktioner i Azure ML.

Funktion MLflow Azure ML med MLflow Azure ML CLIv2 Azure ML Studio
Registrera modeller i MLflow-format
Registrera modeller som inte är i MLflow-format
Registrera modeller från körningar utdata/artefakter 1 2
Registrera modeller från körningar av utdata/artefakter på en annan spårningsserver/arbetsyta 5 5
Sök/lista registrerade modeller
Hämtar information om den registrerade modellens versioner
Redigera beskrivningen av den registrerade modellens versioner
Redigera taggar för den registrerade modellens versioner
Byta namn på registrerade modeller 3 3 3
Ta bort en registrerad modell (container) 3 3 3
Ta bort en registrerad modells version
Hantera MLflow-modellsteg
Sök efter registrerade modeller efter namn 4
Sök efter registrerade modeller med hjälp av strängparatörer LIKE och ILIKE 4
Sök efter registrerade modeller efter tagg 4
Stöd för organisationsregister

Kommentar

  • 1 Använd URI:er med formatet runs:/<ruin-id>/<path>.
  • 2 Använd URI:er med formatet azureml://jobs/<job-id>/outputs/artifacts/<path>.
  • 3 Registrerade modeller är oföränderliga objekt i Azure ML.
  • 4 Använd sökrutan i Azure ML Studio. Partiell matchning stöds.
  • 5 Använd register för att flytta modeller över olika arbetsytor samtidigt som ursprunget bevaras.

Nästa steg