Loggmått, parametrar och filer med MLflow
GÄLLER FÖR: Python SDK azure-ai-ml v2 (aktuell)
Azure Machine Learning 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 Machine Learning SDK v1 finns det inga loggningsfunktioner i Azure Machine Learning SDK för Python (v2). Om du använde Azure Machine Learning SDK v1 tidigare rekommenderar vi att du använder MLflow för att spåra experiment. 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 Machine Learning, till exempel kvoter, slutförda träningsjobb eller slutförda modelldistributioner, kan du läsa Övervaka Azure Machine Learning.
Förutsättningar
Du måste ha en Azure Machine Learning-arbetsyta. Om du inte har någon läser du Skapa arbetsyteresurser.
Du måste ha paketen
mlflow
ochazureml-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+ ochazureml-mlflow
version 1.55+.Om du gör fjärrspårning (spårningsexperiment som körs utanför Azure Machine Learning) konfigurerar du MLflow för att spåra experiment. Mer information finns i Konfigurera MLflow för Azure Machine Learning.
Om du vill logga mått, parametrar, artefakter och modeller i dina experiment i Azure Machine Learning med MLflow importerar du bara MLflow till skriptet:
import mlflow
Konfigurera experiment
MLflow organiserar informationen i experiment och körningar (i Azure Machine Learning 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:
- Skapa eller ange det aktiva experimentet.
- Starta jobbet.
- Använd loggningsmetoder för att logga mått och annan information.
- 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_run
kan det vara användbart att ange parametern run_name
, som sedan översätts till namnet på körningen i Azure Machine Learning-användargränssnittet 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 de 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=False
garanterar Azure Machine Learning 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 Machine Learning väntar automatiskt när jobbet är på väg att slutföras för att se om det finns några väntande mått som ska sparas. När ett jobb har slutförts i Azure Machine Learning 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. |
Loggmatplotlib-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_model
kan 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 Machine Learning 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 listar alla artefakter som loggas i körningen, men de lagras fortfarande i artefaktarkivet (Azure Machine Learning 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 Machine Learning-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.
Visa och ladda ned diagnostikloggar
Loggfiler är en viktig resurs för felsökning av Azure Machine Learning-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:
- Gå till fliken Jobb .
- Välj runID för en specifik körning.
- Välj Utdata och loggar överst på sidan.
- Välj Ladda ned alla för att ladda ned alla loggar till en zip-mapp.
- Du kan också ladda ned enskilda loggfiler genom att välja loggfilen och välja Ladda ned
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 Machine Learning 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 nod. Det finns ytterligare en loggmapp för övergripande körning, stderr och stdout-loggar.
Azure Machine Learning 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.