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

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

Azure Machine Učení 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 Učení SDK verze 1 neexistuje žádná funkce protokolování v sadě Azure Machine Učení SDK pro Python (v2). Pokud jste dříve použili sadu Azure Machine Učení 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í
  • 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 Učení, 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 Učení.

Požadavky

  • Musíte mít pracovní prostor Azure Machine Učení. 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
    
  • Pokud provádíte vzdálené sledování (sledování experimentů, které běží mimo azure Machine Učení), nakonfigurujte MLflow tak, aby sledoval experimenty. Další informace najdete v tématu Konfigurace MLflow pro azure machine Učení.

  • Pokud chcete protokolovat metriky, parametry, artefakty a modely ve svých experimentech ve službě Azure Machine Učení 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 Učení 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í Azure Machine Učení 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, stejně jako opačné než parametry, jsou vždy číselné. 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 protokolováním dávky metrik. Použijte metodu mlflow.log_metrics , která přijímá slovník se všemi metrikami, které chcete protokolovat najednou, nebo použijte MLflowClient.log_batch , který přijímá více typů prvků pro protokolování. Příklad najdete v křivkách protokolu nebo seznamu hodnot .

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 matlotlib 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 pomocí 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í

S azure Machine Učení 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řesahuje 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í úloh/spuštění informací 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 Učení 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í úloh/spuštění informací 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 Učení. 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 Učení 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 Učení protokoluje informace z různých zdrojů během trénování, 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íží.

Další kroky