Sdílet prostřednictvím


Protokolování metrik, parametrů a souborů pomocí MLflow

PLATÍ PRO: Python SDK azure-ai-ml v2 (aktuální)

Azure Machine Learning podporuje experimenty protokolování a sledování pomocí MLflow Tracking. Pomocí MLflow můžete protokolovat modely, metriky, parametry a artefakty, a to buď místně na počítači, nebo v cloudovém prostředí.

Důležité

Na rozdíl od sady Azure Machine Learning SDK verze 1 neexistuje žádná funkce protokolování v sadě Azure Machine Learning SDK pro Python (v2). Pokud jste dříve použili sadu Azure Machine Learning SDK v1, doporučujeme využít MLflow ke sledování experimentů. Konkrétní pokyny najdete v tématu Migrace protokolování ze sady SDK v1 do MLflow .

Protokoly vám pomohou při diagnostice chyb a upozornění a také při sledování metriky výkonu, jako jsou parametry a výkon modelu. Tento článek vysvětluje, jak povolit protokolování v následujících scénářích:

  • Protokolování metrik, parametrů a modelů při odesílání úloh
  • Sledování spuštění při interaktivním trénování
  • Metriky protokolů asynchronně.
  • Zobrazení diagnostických informací o trénování

Tip

V tomto článku se dozvíte, jak monitorovat proces trénování modelu. Pokud vás zajímá monitorování využití prostředků a událostí ze služby Azure Machine Learning, jako jsou kvóty, dokončené trénovací úlohy nebo dokončená nasazení modelu, přečtěte si téma Monitorování služby Azure Machine Learning.

Požadavky

  • Musíte mít pracovní prostor Azure Machine Learning. Pokud ho nemáte, přečtěte si téma Vytvoření prostředků pracovního prostoru.

  • Musíte mít mlflow nainstalované balíčky a azureml-mlflow balíčky. Pokud ne, nainstalujte je ve vývojovém prostředí pomocí následujícího příkazu:

    pip install mlflow azureml-mlflow
    

    Poznámka:

    Pro asynchronní protokolování metrik musíte mít MLflow verzi 2.8.0+ a azureml-mlflow verzi 1.55+.

  • Pokud provádíte vzdálené sledování (sledování experimentů, které běží mimo Azure Machine Learning), nakonfigurujte MLflow tak, aby sledoval experimenty. Další informace najdete v tématu Konfigurace MLflow pro Azure Machine Learning.

  • Pokud chcete protokolovat metriky, parametry, artefakty a modely v experimentech ve službě Azure Machine Learning pomocí MLflow, stačí do skriptu naimportovat MLflow:

    import mlflow
    

Konfigurace experimentů

MLflow uspořádá informace v experimentech a spuštěních (ve službě Azure Machine Learning se nazývají úlohy). V závislosti na způsobu spuštění kódu existují některé rozdíly v tom, jak je nakonfigurovat:

Při interaktivním trénování, například v poznámkovém bloku Jupyter, použijte následující vzor:

  1. Vytvořte nebo nastavte aktivní experiment.
  2. Spusťte úlohu.
  3. Pomocí metod protokolování můžete protokolovat metriky a další informace.
  4. Ukončete úlohu.

Například následující fragment kódu nakonfiguruje experiment a pak protokoluje během úlohy:

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

Tip

Technicky vzato nemusíte volat start_run() , protože se vytvoří nové spuštění, pokud neexistuje a zavoláte rozhraní API pro protokolování. V takovém případě můžete použít mlflow.active_run() k načtení aktuálně používaného spuštění. Další informace najdete v tématu mlflow.active_run().

Můžete také použít paradigma správce kontextu:

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

Když spustíte nové spuštění pomocí mlflow.start_run, může být užitečné indikovat parametr run_name, který se pak přeloží na název spuštění v uživatelském rozhraní služby Azure Machine Learning a pomůže vám rychleji identifikovat spuštění:

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

Další informace o rozhraních API protokolování MLflow najdete v referenčních informacích k MLflow.

Parametry protokolu

MLflow podporuje parametry protokolování používané vašimi experimenty. Parametry můžou být libovolného typu a dají se protokolovat pomocí následující syntaxe:

mlflow.log_param("num_epochs", 20)

MLflow také nabízí pohodlný způsob, jak protokolovat více parametrů tím, že je všechny označí pomocí slovníku. Několik architektur může také předávat parametry modelům pomocí slovníků, a proto je to pohodlný způsob, jak je přihlásit do experimentu.

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

mlflow.log_params(params)

Metriky protokolů

Metriky na rozdíl od parametrů jsou vždy číselné a dají se protokolovat buď synchronně, nebo asynchronně. Když se metriky zaprotokolují, jsou okamžitě dostupné pro využití po vrácení volání. Následující tabulka popisuje, jak protokolovat konkrétní číselné typy:

Zaprotokolovaná hodnota Příklad kódu Notes
Protokolování číselné hodnoty (int nebo float) mlflow.log_metric("my_metric", 1)
Protokolování číselné hodnoty (int nebo float) v průběhu času mlflow.log_metric("my_metric", 1, step=1) Pomocí parametru step můžete určit krok, ve kterém protokolujete hodnotu metriky. Může to být libovolné celé číslo. Výchozí hodnota je nula.
Protokolování logické hodnoty mlflow.log_metric("my_metric", 0) 0 = Pravda, 1 = Nepravda

Důležité

Aspekty výkonu: Pokud potřebujete protokolovat více metrik (nebo více hodnot pro stejnou metriku), vyhněte se volání mlflow.log_metric ve smyčce. Lepšího výkonu lze dosáhnout pomocí asynchronního protokolování nebo mlflow.log_metric("metric1", 9.42, synchronous=False) protokolováním dávky metrik.

Asynchronní protokolování metrik

MLflow také umožňuje protokolování metrik asynchronním způsobem. Asynchronní protokolování metrik je zvlášť užitečné v případech, kdy můžou být spuštěné velké trénovací úlohy s desítkami výpočetních uzlů a snaží se protokolovat metriky souběžně. Je také užitečné, když se malý počet uzlů pokouší protokolovat velký počet metrik.

Asynchronní protokolování metrik umožňuje protokolovat metriky okamžitě tím, že se vyhnete čekání na jejich materializaci v back-endové službě. Tento přístup se škáluje na rozsáhlé trénovací rutiny, které protokolují stovky tisíc hodnot metrik a jedná se o doporučený přístup.

MLflow ve výchozím nastavení protokoluje metriky synchronně, ale toto chování můžete kdykoli změnit:

import mlflow

mlflow.config.enable_async_logging()

Stejnou vlastnost lze nastavit pomocí proměnné prostředí:

export MLFLOW_ENABLE_ASYNC_LOGGING=True

Pokud chcete protokolovat konkrétní metriky asynchronně, použijte rozhraní API pro protokolování MLflow, jak obvykle chcete, ale přidejte další parametr synchronous=False.

import mlflow

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

Při použití log_metric(synchronous=False)se ovládací prvek automaticky vrátí volajícímu, jakmile je operace přijata. Hodnota však není k dispozici pro čtení mediately. Asynchronní protokolování metrik zaručuje pořadí a uchovávají se s časovým razítkem, kdy byly protokolovány.

Důležité

I v případě synchronous=False, že Azure Machine Learning zaručuje řazení metrik.

Pokud potřebujete počkat na zachování určité hodnoty v back-endu, můžete použít operaci metriky vrácenou a počkat na ni, jak je znázorněno v následujícím příkladu:

import mlflow

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

Jednu metriku můžete asynchronně protokolovat nebo protokolovat dávku metrik, jak je znázorněno v následujícím příkladu:

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,
    )

Operace wait() je k dispozici také při protokolování dávky metrik:

run_operation.wait()

Pokud nepotřebujete okamžitý přístup k hodnotám metrik, nemusíte volat wait() rutiny. Azure Machine Learning automaticky čeká, až se úloha dokončí, a zjistí, jestli se má zachovat nějaká čekající metrika. V době, kdy se úloha dokončí ve službě Azure Machine Learning, je zaručeno, že se všechny metriky zachovají.

Křivky protokolu nebo seznam hodnot

Křivky (nebo seznam číselných hodnot) je možné protokolovat pomocí MLflow tak, že několikrát zaprotokolujete stejnou metriku. Následující příklad ukazuje, jak to udělat:

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])

Protokolování imagí

MLflow podporuje dva způsoby protokolování imagí. Oba způsoby zachovají danou image jako artefakt uvnitř spuštění.

Zaprotokolovaná hodnota Příklad kódu Notes
Protokolování metrik numpy nebo objektů obrázků PIL mlflow.log_image(img, "figure.png") img by měla být instancí numpy.ndarray nebo PIL.Image.Image. figure.png je název artefaktu vygenerovaného uvnitř spuštění. Nemusí se jednat o existující soubor.
Log matplotlib plot or image file mlflow.log_figure(fig, "figure.png") figure.png je název artefaktu vygenerovaného uvnitř spuštění. Nemusí se jednat o existující soubor.

Soubory protokolu

Obecně platí, že soubory v MLflow se nazývají artefakty. Artefakty můžete protokolovat několika způsoby v Mlflow:

Zaprotokolovaná hodnota Příklad kódu Notes
Protokolování textu v textovém souboru mlflow.log_text("text string", "notes.txt") Text se zachovají uvnitř spuštění v textovém souboru s názvem notes.txt.
Slovníky protokolů jako soubory JSON a YAML mlflow.log_dict(dictionary, "file.yaml" dictionary je objekt slovníku obsahující veškerou strukturu, kterou chcete zachovat jako soubor JSON nebo YAML.
Protokolování triviálního souboru, který už existuje mlflow.log_artifact("path/to/file.pkl") Soubory se vždy protokolují v kořenovém adresáři spuštění. Pokud artifact_path je k dispozici, soubor se zaprotokoluje do složky, jak je uvedeno v daném parametru.
Protokolování všech artefaktů v existující složce mlflow.log_artifacts("path/to/folder") Struktura složek se zkopíruje do spuštění, ale kořenová složka uvedená není zahrnutá.

Tip

Když protokolujete velké soubory s log_artifact nebo log_model, může docházet k chybám vypršení časového limitu před dokončením nahrávání souboru. Zvažte zvýšení hodnoty časového limitu úpravou proměnné AZUREML_ARTIFACTS_DEFAULT_TIMEOUTprostředí . Výchozí hodnota je 300 (sekund).

Modely protokolů

MLflow představuje koncept modelů jako způsob, jak zabalit všechny artefakty potřebné pro fungování daného modelu. Modely v MLflow jsou vždy složkou s libovolným počtem souborů v závislosti na rozhraní použitém k vygenerování modelu. Modely protokolování mají výhodu sledování všech prvků modelu jako jedné entity, kterou je možné zaregistrovat a pak nasadit. Kromě toho modely MLflow využívají výhod nasazení bez kódu a dají se používat s řídicím panelem Zodpovědné AI ve studiu. Další informace najdete v tématu Od artefaktů k modelům v MLflow.

Pokud chcete model uložit z trénovacího spuštění, použijte log_model() rozhraní API pro architekturu, se kterou pracujete. Například mlflow.sklearn.log_model() Další informace najdete v tématu Protokolování modelů MLflow. Pokud chcete migrovat existující modely do MLflow, přečtěte si téma Převod vlastních modelů na MLflow.

Tip

Při protokolování velkých modelů může dojít k chybě Failed to flush the queue within 300 seconds. Obvykle to znamená, že operace vyprší před dokončením nahrávání artefaktů modelu. Zvažte zvýšení hodnoty časového limitu úpravou proměnné AZUREML_ARTIFACTS_DEFAULT_TIMEOUTprostředí .

Automatické protokolování

Díky Azure Machine Learning a MLflow můžou uživatelé protokolovat metriky, parametry modelu a artefakty modelu automaticky při trénování modelu. Každá architektura se rozhodne, co se má automaticky sledovat za vás. Podporují se různé oblíbené knihovny strojového učení. Přečtěte si další informace o automatickém protokolování pomocí MLflow.

Pokud chcete povolit automatické protokolování, vložte před trénovací kód následující kód:

mlflow.autolog()

Tip

Můžete určit, co se automaticky zaprotokoluje pomocí automatického protokolu. Pokud například zadáte mlflow.autolog(log_models=False), MLflow za vás zaznamená všechno, ale modely. Tento ovládací prvek je užitečný v případech, kdy chcete modely protokolovat ručně, ale přesto si můžete vychutnat automatické protokolování metrik a parametrů. Všimněte si také, že některé architektury můžou zakázat automatické protokolování modelů, pokud trénovaný model překročí konkrétní hranice. Toto chování závisí na použité příchutě a doporučujeme zobrazit dokumentaci, pokud se jedná o váš případ.

Zobrazení informací o úlohách nebo spuštěních pomocí MLflow

Protokolované informace můžete zobrazit pomocí MLflow prostřednictvím objektu MLflow.entities.Run :

import mlflow

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

Metriky, parametry a značky spuštění můžete zobrazit v datovém poli objektu run.

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

Poznámka:

Slovník metrik vrácený mlflow.get_run nebo mlflow.search_runs vrací pouze naposledy zaprotokolovanou hodnotu pro daný název metriky. Pokud například zaznamenáte metriku volanou iteration vícekrát s hodnotami, 1, 2, 3, pak 4, vrátí se při volání run.data.metrics['iteration']pouze 4 .

Pokud chcete získat všechny metriky protokolované pro konkrétní název metriky, můžete použít MlFlowClient.get_metric_history() , jak je vysvětleno v příkladu Získání parametrů a metrik ze spuštění.

Tip

MLflow může načíst metriky a parametry z několika spuštění současně, což umožňuje rychlé porovnání napříč několika pokusy. Další informace najdete v tématu Dotazování a porovnání experimentů a spuštění pomocí MLflow.

MLflow může dotazovat jakýkoli artefakt protokolovaný spuštěním. Artefakty nelze získat přístup pomocí samotného objektu run a místo toho by se měl použít klient MLflow:

client = mlflow.tracking.MlflowClient()
client.list_artifacts("<RUN_ID>")

Tato metoda zobrazí seznam všech artefaktů přihlášených ke spuštění, ale zůstanou uložené v úložišti artefaktů (azure Machine Learning Storage). Ke stažení některé z nich použijte metodu download_artifact:

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

Další informace najdete v tématu Získání metrik, parametrů, artefaktů a modelů.

Zobrazení informací o úlohách nebo spuštěních v sadě Studio

V studio Azure Machine Learning můžete procházet dokončené záznamy úloh, včetně protokolovaných metrik.

Přejděte na kartu Úlohy . Pokud chcete zobrazit všechny úlohy v pracovním prostoru napříč experimenty, vyberte kartu Všechny úlohy . Pokud chcete přejít k podrobnostem úloh pro konkrétní experimenty, použijte filtr Experiment v horním řádku nabídek. Vyberte úlohu, kterou zajímáte, abyste zadali zobrazení podrobností, a pak vyberte kartu Metriky .

Vyberte protokolované metriky pro vykreslení grafů na pravé straně. Grafy můžete přizpůsobit použitím vyhlazení, změnou barvy nebo vykreslením více metrik v jednom grafu. Můžete také změnit velikost a změnit uspořádání rozložení podle potřeby. Po vytvoření požadovaného zobrazení ho můžete uložit pro budoucí použití a sdílet ho s ostatními členy týmu pomocí přímého odkazu.

Snímek obrazovky se zobrazením metrik

Zobrazení a stažení diagnostických protokolů

Soubory protokolů jsou základním prostředkem pro ladění úloh Azure Machine Learning. Po odeslání trénovací úlohy přejděte k podrobnostem konkrétního spuštění a zobrazte jeho protokoly a výstupy:

  1. Přejděte na kartu Úlohy .
  2. Vyberte ID spuštění pro konkrétní spuštění.
  3. V horní části stránky vyberte Výstupy a protokoly .
  4. Výběrem možnosti Stáhnout vše stáhnete všechny protokoly do složky ZIP.
  5. Jednotlivé soubory protokolu můžete stáhnout také tak, že zvolíte soubor protokolu a vyberete Stáhnout.

Snímek obrazovky s částí Výstup a protokoly spuštění

user_logs složka

Tato složka obsahuje informace o protokolech generovaných uživatelem. Tato složka je ve výchozím nastavení otevřená a je vybraná std_log.txt protokol. Std_log.txt se zobrazují protokoly kódu (například příkazy print). Tento soubor obsahuje stdout protokoly a stderr protokoly z řídicího skriptu a trénovacího skriptu, jeden pro jednotlivé procesy. Ve většině případů tady monitorujete protokoly.

složka system_logs

Tato složka obsahuje protokoly vygenerované službou Azure Machine Learning a ve výchozím nastavení je zavřená. Protokoly vygenerované systémem jsou seskupené do různých složek na základě fáze úlohy v modulu runtime.

Další složky

Pro úlohy trénování v clusterech s více výpočetními prostředky se protokoly nacházejí pro každý uzel IP adresy. Struktura pro každý uzel je stejná jako úlohy s jedním uzlem. Existuje ještě jedna složka protokolů pro celkové spouštění, stderr a protokoly stdout.

Azure Machine Learning během trénování protokoluje informace z různých zdrojů, jako je AutoML nebo kontejner Dockeru, který spouští trénovací úlohu. Mnohé z těchto protokolů nejsou zdokumentované. Pokud narazíte na problémy a kontaktujte podporu Microsoftu, můžou tyto protokoly používat během řešení potíží.