Fråga och jämför experiment och körningar med MLflow

Experiment och jobb (eller körningar) i Azure Machine Learning kan efterfrågas med MLflow. Du behöver inte installera någon specifik SDK för att hantera vad som händer i ett träningsjobb, vilket skapar en smidigare övergång mellan lokala körningar och molnet genom att ta bort molnspecifika beroenden. I den här artikeln får du lära dig hur du frågar efter och jämför experiment och körs på din arbetsyta med hjälp av Azure Machine Learning och MLflow SDK i Python.

Med MLflow kan du:

  • Skapa, fråga, ta bort och sök efter experiment på en arbetsyta.
  • Fråga, ta bort och sök efter körningar på en arbetsyta.
  • Spåra och hämta mått, parametrar, artefakter och modeller från körningar.

En detaljerad jämförelse mellan MLflow och MLflow med öppen källkod när de är anslutna till Azure Machine Learning finns i Supportmatris för frågekörningar och experiment i Azure Machine Learning.

Kommentar

Azure Machine Learning Python SDK v2 tillhandahåller inte inbyggda funktioner för loggning eller spårning. Detta gäller inte bara för loggning utan även för att köra frågor mot de mått som loggas. Använd I stället MLflow för att hantera experiment och körningar. Den här artikeln beskriver hur du använder MLflow för att hantera experiment och körningar i Azure Machine Learning.

Du kan också köra frågor mot och söka efter experiment och körningar med hjälp av MLflow REST API. Se Använda MLflow REST med Azure Machine Learning för ett exempel på hur du använder det.

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.

Fråge- och sökexperiment

Använd MLflow för att söka efter experiment i din arbetsyta. Se följande exempel:

  • Hämta alla aktiva experiment:

    mlflow.search_experiments()
    

    Kommentar

    I äldre versioner av MLflow (<2.0) använder du metoden mlflow.list_experiments() i stället.

  • Hämta alla experiment, inklusive arkiverade:

    from mlflow.entities import ViewType
    
    mlflow.search_experiments(view_type=ViewType.ALL)
    
  • Hämta ett specifikt experiment efter namn:

    mlflow.get_experiment_by_name(experiment_name)
    
  • Hämta ett specifikt experiment efter ID:

    mlflow.get_experiment('1234-5678-90AB-CDEFG')
    

Sökexperiment

Med search_experiments() metoden, som är tillgänglig sedan Mlflow 2.0, kan du söka efter experiment som matchar kriterierna med hjälp av filter_string.

  • Hämta flera experiment baserat på deras ID:n:

    mlflow.search_experiments(filter_string="experiment_id IN ("
        "'CDEFG-1234-5678-90AB', '1234-5678-90AB-CDEFG', '5678-1234-90AB-CDEFG')"
    )
    
  • Hämta alla experiment som skapats efter en viss tid:

    import datetime
    
    dt = datetime.datetime(2022, 6, 20, 5, 32, 48)
    mlflow.search_experiments(filter_string=f"creation_time > {int(dt.timestamp())}")
    
  • Hämta alla experiment med en viss tagg:

    mlflow.search_experiments(filter_string=f"tags.framework = 'torch'")
    

Fråge- och sökkörningar

Med MLflow kan du söka efter körningar i alla experiment, inklusive flera experiment samtidigt. Metoden mlflow.search_runs() accepterar argumentet experiment_ids och experiment_name anger vilka experiment du vill söka i. Du kan också ange search_all_experiments=True om du vill söka i alla experiment på arbetsytan:

  • Efter experimentnamn:

    mlflow.search_runs(experiment_names=[ "my_experiment" ])
    
  • Efter experiment-ID:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ])
    
  • Sök i alla experiment på arbetsytan:

    mlflow.search_runs(filter_string="params.num_boost_round='100'", search_all_experiments=True)
    

Observera att experiment_ids stöder tillhandahålla en matris med experiment, så att du kan söka körningar över flera experiment, om det behövs. Detta kan vara användbart om du vill jämföra körningar av samma modell när den loggas i olika experiment (till exempel av olika personer eller olika projekt iterationer).

Viktigt!

Om experiment_ids, experiment_nameseller search_all_experiments inte anges, söker MLflow som standard i det aktuella aktiva experimentet. Du kan ange det aktiva experimentet med .mlflow.set_experiment()

Som standard returnerar MLflow data i Pandas-format Dataframe , vilket gör det praktiskt när vi bearbetar vår analys av körningarna ytterligare. Returnerade data innehåller kolumner med:

  • Grundläggande information om körningen.
  • Parametrar med kolumnens namn params.<parameter-name>.
  • Mått (senast loggat värde för varje) med kolumnens namn metrics.<metric-name>.

Alla mått och parametrar returneras också när du kör frågor. För mått som innehåller flera värden (till exempel en förlustkurva eller en PR-kurva) returneras dock endast måttets sista värde. Om du vill hämta alla värden för ett visst mått använder du mlflow.get_metric_history metoden. Ett exempel finns i Hämta params och mått från en körning .

Orderkörningar

Som standard är experimenten i fallande ordning start_timeefter , vilket är den tid då experimentet köades i Azure Machine Learning. Du kan dock ändra den här standardinställningen med hjälp av parametern order_by.

  • Orderkörningar efter attribut, till exempel start_time:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ],
                       order_by=["attributes.start_time DESC"])
    
  • Orderkörningar och begränsa resultat. I följande exempel returneras den sista enskilda körningen i experimentet:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       max_results=1, order_by=["attributes.start_time DESC"])
    
  • Orderkörningar med attributet duration:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       order_by=["attributes.duration DESC"])
    

    Dricks

    attributes.duration finns inte i MLflow OSS, men tillhandahålls i Azure Machine Learning för enkelhetens skull.

  • Orderkörningar efter måttets värden:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ]).sort_values("metrics.accuracy", ascending=False)
    

    Varning

    Användning order_by med uttryck som innehåller metrics.*, params.*eller tags.* i parametern order_by stöds inte för närvarande. Använd order_values i stället metoden från Pandas som du ser i exemplet.

Filterkörningar

Du kan också söka efter en körning med en specifik kombination i hyperparametrar med hjälp av parametern filter_string. Använd params för att komma åt körningens parametrar, metrics för att komma åt mått som loggas i körningen och attributes för att få åtkomst till körningsinformation. MLflow stöder uttryck som är kopplade till nyckelordet AND (syntaxen stöder inte OR):

  • Sökkörningar baserat på en parameters värde:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       filter_string="params.num_boost_round='100'")
    

    Varning

    Endast operatorer =, likeoch != stöds för filtrering parameters.

  • Sökkörningar baserat på ett måtts värde:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       filter_string="metrics.auc>0.8")
    
  • Sökkörningar med en viss tagg:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       filter_string="tags.framework='torch'")
    
  • Sökkörningar som skapats av en viss användare:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       filter_string="attributes.user_id = 'John Smith'")
    
  • Sökkörningar som misslyckades. Se Filtrera körningar efter status för möjliga värden:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       filter_string="attributes.status = 'Failed'")
    
  • Sökkörningar som skapats efter en viss tid:

    import datetime
    
    dt = datetime.datetime(2022, 6, 20, 5, 32, 48)
    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       filter_string=f"attributes.creation_time > '{int(dt.timestamp())}'")
    

    Dricks

    För nyckeln attributesska värden alltid vara strängar och därmed kodade mellan citattecken.

  • Sökkörningar som tar längre tid än en timme:

    duration = 360 * 1000 # duration is in milliseconds
    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       filter_string=f"attributes.duration > '{duration}'")
    

    Dricks

    attributes.duration finns inte i MLflow OSS, men tillhandahålls i Azure Machine Learning för enkelhetens skull.

  • Sökkörningar som har ID:t i en viss uppsättning:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       filter_string="attributes.run_id IN ('1234-5678-90AB-CDEFG', '5678-1234-90AB-CDEFG')")
    

Filtrera körningar efter status

När du filtrerar körningar efter status använder MLflow en annan konvention för att namnge olika möjliga status för en körning jämfört med Azure Machine Learning. Följande tabell visar möjliga värden:

Status för Azure Machine Learning-jobb MLFlow's attributes.status Innebörd
Inte startat Scheduled Jobbet/körningen togs emot av Azure Machine Learning.
Queue Scheduled Jobbet/körningen är schemalagd för körning, men den har inte startat ännu.
Förbereda Scheduled Jobbet/körningen har inte startat ännu, men en beräkning allokerades för dess körning och förbereder miljön och dess indata.
Körs Running Jobbet/körningen är för närvarande under aktiv körning.
Slutförd Finished Jobbet/körningen slutfördes utan fel.
Misslyckad Failed Jobbet/körningen slutfördes med fel.
Avbruten Killed Jobbet/körningen avbröts av användaren eller avslutades av systemet.

Exempel:

mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                   filter_string="attributes.status = 'Failed'")

Hämta mått, parametrar, artefakter och modeller

Metoden search_runs returnerar en Pandas Dataframe som innehåller en begränsad mängd information som standard. Du kan hämta Python-objekt om det behövs, vilket kan vara användbart för att få information om dem. Använd parametern output_format för att styra hur utdata returneras:

runs = mlflow.search_runs(
    experiment_ids=[ "1234-5678-90AB-CDEFG" ],
    filter_string="params.num_boost_round='100'",
    output_format="list",
)

Information kan sedan nås från info medlemmen. Följande exempel visar hur du run_idhämtar :

last_run = runs[-1]
print("Last run ID:", last_run.info.run_id)

Hämta params och mått från en körning

När körningar returneras med kan output_format="list"du enkelt komma åt parametrar med hjälp av nyckeln data:

last_run.data.params

På samma sätt kan du fråga efter mått:

last_run.data.metrics

För mått som innehåller flera värden (till exempel en förlustkurva eller en PR-kurva) returneras endast måttets senast loggade värde. Om du vill hämta alla värden för ett visst mått använder du mlflow.get_metric_history metoden. Den här metoden kräver att du använder MlflowClient:

client = mlflow.tracking.MlflowClient()
client.get_metric_history("1234-5678-90AB-CDEFG", "log_loss")

Hämta artefakter från en körning

MLflow kan köra frågor mot alla artefakter som loggas av en körning. Det går inte att komma åt artefakter med själva körningsobjektet och MLflow-klienten bör användas i stället:

client = mlflow.tracking.MlflowClient()
client.list_artifacts("1234-5678-90AB-CDEFG")

Föregående metod listar alla artefakter som loggas i körningen, men de förblir lagrade i artefaktarkivet (Azure Machine Learning Storage). Om du vill ladda ned någon av dem använder du metoden download_artifact:

file_path = mlflow.artifacts.download_artifacts(
    run_id="1234-5678-90AB-CDEFG", artifact_path="feature_importance_weight.png"
)

Kommentar

I äldre versioner av MLflow (<2.0) använder du metoden MlflowClient.download_artifacts() i stället.

Hämta modeller från en körning

Modeller kan också loggas i körningen och sedan hämtas direkt från den. För att hämta en modell måste du känna till sökvägen till artefakten där den lagras. Metoden list_artifacts kan användas för att hitta artefakter som representerar en modell eftersom MLflow-modeller alltid är mappar. Du kan ladda ned en modell genom att ange sökvägen där modellen lagras med hjälp av download_artifact metoden:

artifact_path="classifier"
model_local_path = mlflow.artifacts.download_artifacts(
  run_id="1234-5678-90AB-CDEFG", artifact_path=artifact_path
)

Du kan sedan läsa in modellen från de nedladdade artefakterna med den typiska funktionen load_model i det smakspecifika namnområdet. I följande exempel används xgboost:

model = mlflow.xgboost.load_model(model_local_path)

Med MLflow kan du också utföra båda åtgärderna samtidigt och ladda ned och läsa in modellen i en enda instruktion. MLflow laddar ned modellen till en tillfällig mapp och läser in den därifrån. Metoden load_model använder ett URI-format för att ange varifrån modellen måste hämtas. Vid inläsning av en modell från en körning är URI-strukturen följande:

model = mlflow.xgboost.load_model(f"runs:/{last_run.info.run_id}/{artifact_path}")

Dricks

Information om hur du kör frågor mot och läsa in modeller som registrerats i modellregistret finns i Hantera modellregister i Azure Machine Learning med MLflow.

Hämta underordnade (kapslade) körningar

MLflow stöder begreppet underordnade (kapslade) körningar. Dessa körningar är användbara när du behöver knoppa av träningsrutiner som måste spåras oberoende av huvudträningsprocessen. Optimeringsprocesser för hyperparameterjustering eller Azure Machine Learning-pipelines är typiska exempel på jobb som genererar flera underordnade körningar. Du kan köra frågor mot alla underordnade körningar av en specifik körning med hjälp av egenskapstaggen mlflow.parentRunId, som innehåller körnings-ID:t för den överordnade körningen.

hyperopt_run = mlflow.last_active_run()
child_runs = mlflow.search_runs(
    filter_string=f"tags.mlflow.parentRunId='{hyperopt_run.info.run_id}'"
)

Jämför jobb och modeller i Azure Machine Learning-studio (förhandsversion)

Om du vill jämföra och utvärdera kvaliteten på dina jobb och modeller i Azure Machine Learning-studio använder du förhandsgranskningspanelen för att aktivera funktionen. När du är aktiverad kan du jämföra parametrar, mått och taggar mellan jobben och/eller modellerna som du har valt.

Viktigt!

Objekt markerade (förhandsversion) i den här artikeln är för närvarande i offentlig förhandsversion. Förhandsversionen tillhandahålls utan ett serviceavtal och rekommenderas inte för produktionsarbetsbelastningar. Vissa funktioner kanske inte stöds eller kan vara begränsade. Mer information finns i Kompletterande villkor för användning av Microsoft Azure-förhandsversioner.

Skärmbild av förhandsgranskningspanelen som visar hur du jämför jobb och modeller i Azure Machine Learning-studio.

MLflow med Azure Machine Learning-notebook-filer visar och utökar begrepp som presenteras i den här artikeln.

Stödmatris för frågekörningar och experiment

MLflow SDK exponerar flera metoder för att hämta körningar, inklusive alternativ för att styra vad som returneras och hur. Använd följande tabell för att lära dig om vilka av dessa metoder som för närvarande stöds i MLflow när de är anslutna till Azure Machine Learning:

Funktion Stöds av MLflow Stöds av Azure Machine Learning
Orderkörningar efter attribut
Orderkörningar efter mått 1
Orderkörningar efter parametrar 1
Beställningskörningar efter taggar 1
Filtrering körs efter attribut
Filtrering körs efter mått
Filtrering körs efter mått med specialtecken (undantagna)
Filtrering körs efter parametrar
Filtrering körs efter taggar
Filtreringskörningar med numeriska jämförelsevärden (mått) inklusive =, !=, >, >=, <och <=
Filtrering körs med strängjämnare (params, taggar och attribut): = och != 2
Filtrering körs med strängjämnare (params, taggar och attribut): LIKE/ILIKE
Filtreringskörningar med jämförelse AND
Filtreringskörningar med jämförelse OR
Byta namn på experiment

Kommentar