Loggmått, parametrar och filer med MLflow

GÄLLER FÖR: Python SDK azure-ai-ml v2 (aktuell)

Azure Mašinsko učenje stöder loggnings- och spårningsexperiment med MLflow Tracking. Du kan logga modeller, mått, parametrar och artefakter med MLflow, antingen lokalt på datorn eller i en molnmiljö.

Viktigt!

Till skillnad från Azure Mašinsko učenje SDK v1 finns det inga loggningsfunktioner i Azure Mašinsko učenje SDK för Python (v2). Om du använde Azure Mašinsko učenje SDK v1 tidigare rekommenderar vi att du använder MLflow för spårningsexperiment. Mer information finns i Migrera loggning från SDK v1 till MLflow .

Med loggarna kan du diagnostisera fel och varningar, eller spåra prestandamått som parametrar och modellprestanda. I den här artikeln beskrivs hur du aktiverar loggning i följande scenarier:

  • Logga mått, parametrar och modeller när du skickar jobb.
  • Spåra körningar när du tränar interaktivt.
  • Logga mått asynkront.
  • Visa diagnostikinformation om träning.

Dricks

Den här artikeln visar hur du övervakar modellträningsprocessen. Om du är intresserad av att övervaka resursanvändning och händelser från Azure Mašinsko učenje, till exempel kvoter, slutförda träningsjobb eller slutförda modelldistributioner, kan du läsa Övervaka Azure Mašinsko učenje.

Förutsättningar

  • Du måste ha en Azure Mašinsko učenje-arbetsyta. Om du inte har någon läser du Skapa arbetsyteresurser.

  • Du måste ha paketen mlflow och azureml-mlflow installerade. Om du inte gör det använder du följande kommando för att installera dem i utvecklingsmiljön:

    pip install mlflow azureml-mlflow
    

    Kommentar

    För asynkron loggning av mått måste du ha MLflow version 2.8.0+ och azureml-mlflow version 1.55+.

  • Om du gör fjärrspårning (spårningsexperiment som körs utanför Azure Mašinsko učenje) konfigurerar du MLflow för att spåra experiment. Mer information finns i Konfigurera MLflow för Azure Mašinsko učenje.

  • Om du vill logga mått, parametrar, artefakter och modeller i dina experiment i Azure Mašinsko učenje med MLflow importerar du bara MLflow till skriptet:

    import mlflow
    

Konfigurera experiment

MLflow organiserar informationen i experiment och körningar (i Azure Mašinsko učenje kallas körningar för jobb). Det finns vissa skillnader i hur du konfigurerar dem beroende på hur du kör koden:

När du tränar interaktivt, till exempel i en Jupyter Notebook, använder du följande mönster:

  1. Skapa eller ange det aktiva experimentet.
  2. Starta jobbet.
  3. Använd loggningsmetoder för att logga mått och annan information.
  4. Avsluta jobbet.

Följande kodfragment konfigurerar till exempel experimentet och loggar sedan under ett jobb:

import mlflow
# Set the experiment
mlflow.set_experiment("mlflow-experiment")

# Start the run
mlflow_run = mlflow.start_run()
# Log metrics or other information
mlflow.log_metric('mymetric', 1)
# End run 
mlflow.end_run()

Dricks

Tekniskt sett behöver du inte anropa start_run() eftersom en ny körning skapas om en inte finns och du anropar ett loggnings-API. I så fall kan du använda mlflow.active_run() för att hämta den körning som används för närvarande. Mer information finns i mlflow.active_run().

Du kan också använda kontexthanterarens paradigm:

import mlflow
mlflow.set_experiment("mlflow-experiment")

# Start the run, log metrics, end the run
with mlflow.start_run() as run:
    # Run started when context manager is entered, and ended when context manager exits
    mlflow.log_metric('mymetric', 1)
    mlflow.log_metric('anothermetric',1)
    pass

När du startar en ny körning med mlflow.start_runkan det vara användbart att ange parametern run_name, som sedan översätts till namnet på körningen i Azure Mašinsko učenje användargränssnitt och hjälper dig att identifiera körningen snabbare:

with mlflow.start_run(run_name="iris-classifier-random-forest") as run:
    mlflow.log_metric('mymetric', 1)
    mlflow.log_metric('anothermetric',1)

Mer information om MLflow-loggnings-API:er finns i MLflow-referensen.

Loggparametrar

MLflow stöder de loggningsparametrar som används av experimenten. Parametrar kan vara av vilken typ som helst och kan loggas med hjälp av följande syntax:

mlflow.log_param("num_epochs", 20)

MLflow erbjuder också ett bekvämt sätt att logga flera parametrar genom att ange alla med hjälp av en ordlista. Flera ramverk kan också skicka parametrar till modeller med hjälp av ordlistor och därför är detta ett bekvämt sätt att logga dem i experimentet.

params = {
    "num_epochs": 20,
    "dropout_rate": .6,
    "objective": "binary_crossentropy"
}

mlflow.log_params(params)

Loggmått

Mått, till skillnad från parametrar, är alltid numeriska och kan loggas synkront eller asynkront. När mått loggas är de omedelbart tillgängliga för förbrukning vid anropsretur. I följande tabell beskrivs hur du loggar specifika numeriska typer:

Loggat värde Exempelkod Kommentar
Logga ett numeriskt värde (int eller flyttal) mlflow.log_metric("my_metric", 1)
Logga ett numeriskt värde (int eller flyttal) över tid mlflow.log_metric("my_metric", 1, step=1) Använd parametern step för att ange det steg där du loggar måttvärdet. Det kan vara valfritt heltalsnummer. Standardvärdet är noll.
Logga ett booleskt värde mlflow.log_metric("my_metric", 0) 0 = Sant, 1 = Falskt

Viktigt!

Prestandaöverväganden: Om du behöver logga flera mått (eller flera värden för samma mått) bör du undvika att göra anrop till mlflow.log_metric i loopar. Bättre prestanda kan uppnås genom att använda asynkron loggning med mlflow.log_metric("metric1", 9.42, synchronous=False) eller genom att logga en batch med mått.

Logga mått asynkront

MLflow tillåter också loggning av mått på ett asynkront sätt. Asynkron måttloggning är särskilt användbart i fall där stora träningsjobb med tiotals beräkningsnoder kan köras och försöker logga mått samtidigt. Det är också användbart när ett litet antal noder försöker logga ett stort antal mått.

Med asynkron måttloggning kan du logga mått omedelbart genom att undvika att vänta på att de ska materialiseras i serverdelstjänsten. Den här metoden skalar till stora träningsrutiner som loggar hundratusentals måttvärden och det är den rekommenderade metoden.

MLflow loggar mått synkront som standard, men du kan ändra det här beteendet när som helst:

import mlflow

mlflow.config.enable_async_logging()

Samma egenskap kan anges med hjälp av en miljövariabel:

export MLFLOW_ENABLE_ASYNC_LOGGING=True

Om du vill logga specifika mått asynkront använder du MLflow-loggnings-API:et som vanligt, men lägger till den extra parametern synchronous=False.

import mlflow

with mlflow.start_run():
    # (...)
    mlflow.log_metric("metric1", 9.42, synchronous=False)
    # (...)

När du använder log_metric(synchronous=False)returneras kontrollen automatiskt till anroparen när åtgärden har godkänts. Värdet är dock inte tillgängligt för att läsa omedelbart. Asynkron loggning av mått garanterar ordningen och de sparas med tidsstämpeln för när de loggades.

Viktigt!

Även med synchronous=Falsegaranterar Azure Mašinsko učenje ordningen på mått.

Om du behöver vänta på att ett visst värde ska sparas i serverdelen kan du använda måttåtgärden som returneras för att vänta på det, som du ser i följande exempel:

import mlflow

with mlflow.start_run():
    # (...)
    run_operation = mlflow.log_metric("metric1", 9.42, synchronous=False)
    # (...)
    run_operation.wait()
    # (...)

Du kan asynkront logga ett mått i taget eller logga en batch med mått, som du ser i följande exempel:

import mlflow
import time
from mlflow.entities import Metric

with mlflow.start_run() as current_run:
    mlflow_client = mlflow.tracking.MlflowClient()

    metrics = {"metric-0": 3.14, "metric-1": 6.28}
    timestamp = int(time.time() * 1000)
    metrics_arr = [Metric(key, value, timestamp, 0) for key, value in metrics.items()]

    run_operation = mlflow_client.log_batch(
        run_id=current_run.info.run_id,
        metrics=metrics_arr,
        synchronous=False,
    )

Åtgärden wait() är också tillgänglig när du loggar en batch med mått:

run_operation.wait()

Du behöver inte anropa wait() dina rutiner om du inte behöver omedelbar åtkomst till måttvärdena. Azure Mašinsko učenje väntar automatiskt när jobbet är på väg att slutföras för att se om det finns något väntande mått som ska sparas. När ett jobb har slutförts i Azure Mašinsko učenje kommer alla mått garanterat att sparas.

Loggkurvor eller lista med värden

Kurvor (eller en lista med numeriska värden) kan loggas med MLflow genom att logga samma mått flera gånger. I följande exempel visas hur du gör det:

list_to_log = [1, 2, 3, 2, 1, 2, 3, 2, 1]
from mlflow.entities import Metric
from mlflow.tracking import MlflowClient
import time

client = MlflowClient()
client.log_batch(mlflow.active_run().info.run_id, 
                 metrics=[Metric(key="sample_list", value=val, timestamp=int(time.time() * 1000), step=0) for val in list_to_log])

Loggbilder

MLflow stöder två sätt att logga bilder. Båda sätten bevarar den angivna avbildningen som en artefakt inuti körningen.

Loggat värde Exempelkod Kommentar
Logga numpy-mått eller PIL-bildobjekt mlflow.log_image(img, "figure.png") img ska vara en instans av numpy.ndarray eller PIL.Image.Image. figure.png är namnet på artefakten som genereras inuti körningen. Det behöver inte vara en befintlig fil.
Loggmatlotlib-diagram eller bildfil mlflow.log_figure(fig, "figure.png") figure.png är namnet på artefakten som genereras inuti körningen. Det behöver inte vara en befintlig fil.

Loggfiler

I allmänhet kallas filer i MLflow artefakter. Du kan logga artefakter på flera sätt i Mlflow:

Loggat värde Exempelkod Kommentar
Logga text i en textfil mlflow.log_text("text string", "notes.txt") Texten sparas inuti körningen i en textfil med namnet notes.txt.
Logga ordlistor som JSON- och YAML-filer mlflow.log_dict(dictionary, "file.yaml" dictionary är ett ordlisteobjekt som innehåller all struktur som du vill spara som en JSON- eller YAML-fil.
Logga en trivial fil som redan finns mlflow.log_artifact("path/to/file.pkl") Filer loggas alltid i roten för körningen. Om artifact_path anges loggas filen i en mapp enligt vad som anges i parametern.
Logga alla artefakter i en befintlig mapp mlflow.log_artifacts("path/to/folder") Mappstrukturen kopieras till körningen, men den angivna rotmappen ingår inte.

Dricks

När du loggar stora filer med log_artifact eller log_modelkan det uppstå timeout-fel innan uppladdningen av filen har slutförts. Överväg att öka timeout-värdet genom att justera miljövariabeln AZUREML_ARTIFACTS_DEFAULT_TIMEOUT. Standardvärdet är 300 (sekunder).

Loggmodeller

MLflow introducerar begreppet modeller som ett sätt att paketera alla artefakter som krävs för att en viss modell ska fungera. Modeller i MLflow är alltid en mapp med ett godtyckligt antal filer, beroende på vilket ramverk som används för att generera modellen. Loggningsmodeller har fördelen att spåra alla element i modellen som en enda entitet som kan registreras och sedan distribueras. Dessutom kan MLflow-modeller dra nytta av distribution utan kod och kan användas med instrumentpanelen Ansvarsfull AI i Studio. Mer information finns i Från artefakter till modeller i MLflow.

Om du vill spara modellen från en träningskörning använder du API:et log_model() för det ramverk som du arbetar med. Till exempel mlflow.sklearn.log_model(). Mer information finns i Loggning av MLflow-modeller. Information om hur du migrerar befintliga modeller till MLflow finns i Konvertera anpassade modeller till MLflow.

Dricks

När du loggar stora modeller kan det uppstå felet Failed to flush the queue within 300 seconds. Vanligtvis innebär det att åtgärden tar tid innan uppladdningen av modellartefakterna har slutförts. Överväg att öka timeout-värdet genom att justera miljövariabeln AZUREML_ARTIFACTS_DEFAULT_TIMEOUT.

Automatisk loggning

Med Azure Mašinsko učenje och MLflow kan användarna logga mått, modellparametrar och modellartefakter automatiskt när de tränar en modell. Varje ramverk bestämmer vad du ska spåra automatiskt åt dig. En mängd populära maskininlärningsbibliotek stöds. Läs mer om automatisk loggning med MLflow.

Om du vill aktivera automatisk loggning infogar du följande kod före träningskoden:

mlflow.autolog()

Dricks

Du kan styra vad som loggas automatiskt med automatisk loggning. Om du till exempel anger mlflow.autolog(log_models=False)loggar MLflow allt utom modeller åt dig. Sådan kontroll är användbar i fall där du vill logga modeller manuellt men ändå ha automatisk loggning av mått och parametrar. Observera också att vissa ramverk kan inaktivera automatisk loggning av modeller om den tränade modellen överskrider specifika gränser. Sådant beteende beror på vilken smak som används och vi rekommenderar att du visar dokumentationen om så är fallet.

Visa information om jobb eller körningar med MLflow

Du kan visa den loggade informationen med MLflow via objektet MLflow.entities.Run :

import mlflow

run = mlflow.get_run(run_id="<RUN_ID>")

Du kan visa mått, parametrar och taggar för körningen i datafältet för körningsobjektet.

metrics = run.data.metrics
params = run.data.params
tags = run.data.tags

Kommentar

Måttordlistan som returneras av mlflow.get_run eller mlflow.search_runs returnerar endast det senast loggade värdet för ett visst måttnamn. Om du till exempel loggar ett mått som kallas iteration flera gånger med värden, 1, sedan 2, sedan 3, sedan 4, returneras endast 4 när du anropar run.data.metrics['iteration'].

Om du vill få alla mått loggade för ett visst måttnamn kan du använda MlFlowClient.get_metric_history() enligt beskrivningen i exemplet Hämta params och mått från en körning.

Dricks

MLflow kan hämta mått och parametrar från flera körningar samtidigt, vilket möjliggör snabba jämförelser mellan flera utvärderingar. Mer information finns i Fråga och jämför experiment och körningar med MLflow.

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

Den här metoden visar alla artefakter som loggas i körningen, men de lagras fortfarande i artefaktarkivet (Azure Mašinsko učenje storage). Om du vill ladda ned någon av dem använder du metoden download_artifact:

file_path = client.download_artifacts("<RUN_ID>", path="feature_importance_weight.png")

Mer information finns i Hämta mått, parametrar, artefakter och modeller.

Visa information om jobb eller körningar i studion

Du kan bläddra bland slutförda jobbposter, inklusive loggade mått, i Azure Mašinsko učenje Studio.

Gå till fliken Jobb . Om du vill visa alla dina jobb på arbetsytan i experiment väljer du fliken Alla jobb . Du kan öka detaljnivån för jobb för specifika experiment genom att använda experimentfiltret i den översta menyraden. Välj det intressanta jobbet för att ange informationsvyn och välj sedan fliken Mått.

Välj de loggade måtten för att återge diagram till höger. Du kan anpassa diagrammen genom att använda utjämning, ändra färg eller rita flera mått i en enda graf. Du kan också ändra storlek på och ordna om layouten som du vill. När du har skapat önskad vy kan du spara den för framtida användning och dela den med dina teammedlemmar med hjälp av en direktlänk.

Skärmbild av måttvyn.

Visa och ladda ned diagnostikloggar

Loggfiler är en viktig resurs för felsökning av Azure Mašinsko učenje-arbetsbelastningar. När du har skickat ett träningsjobb kan du öka detaljnivån till en specifik körning för att visa loggar och utdata:

  1. Gå till fliken Jobb .
  2. Välj runID för en specifik körning.
  3. Välj Utdata och loggar överst på sidan.
  4. Välj Ladda ned alla för att ladda ned alla loggar till en zip-mapp.
  5. Du kan också ladda ned enskilda loggfiler genom att välja loggfilen och välja Ladda ned

Skärmbild av avsnittet Utdata och loggar i en körning.

user_logs mapp

Den här mappen innehåller information om de användargenererade loggarna. Den här mappen är öppen som standard och std_log.txt loggen är markerad. Det std_log.txt är där kodens loggar (till exempel utskriftsuttryck) visas. Den här filen innehåller stdout loggar och stderr loggar från kontrollskriptet och träningsskriptet, en per process. I de flesta fall övervakar du loggarna här.

system_logs mapp

Den här mappen innehåller loggarna som genereras av Azure Mašinsko učenje och stängs som standard. Loggarna som genereras av systemet grupperas i olika mappar, baserat på fasen för jobbet i körningen.

Andra mappar

För jobbträning i kluster med flera beräkningsfunktioner finns loggar för varje IP-nod. Strukturen för varje nod är densamma som jobb med en enda nod. Det finns ytterligare en loggmapp för övergripande körning, stderr och stdout-loggar.

Azure Mašinsko učenje loggar information från olika källor under träningen, till exempel AutoML eller Docker-containern som kör träningsjobbet. Många av dessa loggar är inte dokumenterade. Om du stöter på problem och kontaktar Microsofts support kan de kanske använda dessa loggar under felsökningen.