Nasazení modelů MLflow v dávkových nasazeních
PLATÍ PRO:Rozšíření Azure CLI ml v2 (aktuální)Python SDK azure-ai-ml v2 (aktuální)
V tomto článku se dozvíte, jak nasadit modely MLflow do azure Machine Učení pro obě dávkové odvozování pomocí koncových bodů služby Batch. Při nasazování modelů MLflow do dávkových koncových bodů Učení Azure:
- Poskytuje základní image nebo kurátorované prostředí MLflow, které obsahuje požadované závislosti pro spuštění úlohy Azure Machine Učení Batch.
- Vytvoří kanál dávkové úlohy s bodovacím skriptem, který můžete použít ke zpracování dat pomocí paralelizace.
Poznámka:
Další informace o podporovaných typech vstupních souborů a podrobnostech o tom, jak model MLflow funguje, najdete v tématu Důležité informace o nasazení do dávkového odvozování.
O tomto příkladu
Tento příklad ukazuje, jak můžete nasadit model MLflow do dávkového koncového bodu pro provádění dávkových předpovědí. V tomto příkladu se používá model MLflow založený na datové sadě srdečních onemocnění UCI. Databáze obsahuje 76 atributů, ale používáme podmnožinu 14 z nich. Model se snaží předpovědět přítomnost onemocnění srdce u pacienta. Hodnota integer je od 0 (bez přítomnosti) do 1 (přítomnost).
Model byl vytrénován pomocí XGBBoost
klasifikátoru a všechny požadované předběžné zpracování byly zabaleny jako scikit-learn
kanál, takže tento model představuje kompletní kanál, který přechází z nezpracovaných dat na predikce.
Příklad v tomto článku vychází z ukázek kódu obsažených v úložišti azureml-examples . Pokud chcete příkazy spustit místně, aniž byste museli kopírovat nebo vkládat YAML a další soubory, nejprve naklonujte úložiště a pak změňte adresáře do složky:
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli
Soubory pro tento příklad jsou v:
cd endpoints/batch/deploy-models/heart-classifier-mlflow
Sledování v poznámkových blocích Jupyter
Tuto ukázku můžete sledovat v následujících poznámkových blocích. V naklonovaném úložišti otevřete poznámkový blok mlflow-for-batch-tabular.ipynb.
Požadavky
Než budete postupovat podle kroků v tomto článku, ujistěte se, že máte následující požadavky:
Předplatné Azure. Pokud ještě nemáte předplatné Azure, vytvořte si napřed bezplatný účet. Vyzkoušejte bezplatnou nebo placenou verzi služby Azure Machine Učení.
Pracovní prostor služby Azure Machine Learning. Pokud ho nemáte, vytvořte ho pomocí kroků v článku Správa Učení pracovních prostorů Azure.
Ujistěte se, že máte v pracovním prostoru následující oprávnění:
Vytváření nebo správa dávkových koncových bodů a nasazení: Použijte roli Vlastník, Přispěvatel nebo Vlastní, která umožňuje
Microsoft.MachineLearningServices/workspaces/batchEndpoints/*
.Vytvořte nasazení ARM ve skupině prostředků pracovního prostoru: Použijte roli Vlastník, Přispěvatel nebo Vlastní, která umožňuje
Microsoft.Resources/deployments/write
ve skupině prostředků, ve které je pracovní prostor nasazený.
Abyste mohli pracovat se službou Azure Machine Učení, musíte nainstalovat následující software:
Azure CLI a
ml
rozšíření pro azure machine Učení.az extension add -n ml
Poznámka:
Nasazení součástí kanálu pro koncové body služby Batch byla zavedena ve verzi 2.7
ml
rozšíření pro Azure CLI. Sloužíaz extension update --name ml
k získání poslední verze.
Připojení k pracovnímu prostoru
Pracovní prostor je prostředek nejvyšší úrovně pro Azure Machine Learning, který nabízí centralizované místo, kde můžete pracovat se všemi artefakty, které vytvoříte při použití služby Azure Machine Learning. V této části se připojíme k pracovnímu prostoru, ve kterém budete provádět úlohy nasazení.
Hodnoty ID předplatného, pracovního prostoru, umístění a skupiny prostředků předejte v následujícím kódu:
az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
Kroky
Pomocí těchto kroků nasaďte model MLflow do dávkového koncového bodu pro spuštění dávkového odvozování nad novými daty:
Koncový bod služby Batch může nasazovat jenom registrované modely. V tomto případě už máme v úložišti místní kopii modelu, takže model musíme publikovat jenom do registru v pracovním prostoru. Tento krok můžete přeskočit, pokud už je model, který se pokoušíte nasadit, zaregistrovaný.
Než budeme pokračovat, musíme se ujistit, že dávkové nasazení, která se chystáme vytvořit, může běžet na určité infrastruktuře (výpočetních prostředcích). Nasazení služby Batch se můžou spouštět na libovolném počítači Azure Učení výpočetních prostředků, které už v pracovním prostoru existují. To znamená, že několik dávkových nasazení může sdílet stejnou výpočetní infrastrukturu. V tomto příkladu budeme pracovat na výpočetním clusteru Azure Machine Učení s názvem
cpu-cluster
. Pojďme ověřit, jestli výpočetní prostředky v pracovním prostoru existují, nebo ho vytvořte jinak.Teď je čas vytvořit dávkový koncový bod a nasazení. Nejprve začneme koncovým bodem. Koncové body vyžadují pouze název a popis, který se má vytvořit. Název koncového bodu skončí v identifikátoru URI přidruženém k vašemu koncovému bodu. Z tohoto důvodu musí být názvy dávkových koncových bodů jedinečné v rámci oblasti Azure. Například může existovat pouze jeden dávkový koncový bod s názvem
mybatchendpoint
vwestus2
.Vytvořte koncový bod:
Pokud chcete vytvořit nový koncový bod, vytvořte
YAML
konfiguraci jako následující:endpoint.yml
$schema: https://azuremlschemas.azureedge.net/latest/batchEndpoint.schema.json name: heart-classifier-batch description: A heart condition classifier for batch inference auth_mode: aad_token
Pak vytvořte koncový bod pomocí následujícího příkazu:
az ml batch-endpoint create -n $ENDPOINT_NAME -f endpoint.yml
Teď pojďme vytvořit nasazení. Modely MLflow nevyžadují, abyste při vytváření nasazení při vytváření nasazení označili prostředí ani bodovací skript. Pokud ale chcete přizpůsobit způsob odvození nasazení, můžete je zadat.
Pokud chcete vytvořit nové nasazení v rámci vytvořeného koncového bodu, vytvořte
YAML
konfiguraci jako v následujícím příkladu. Můžete zkontrolovat, jestli schéma YAML celého dávkového koncového bodu obsahuje další vlastnosti.jednoduchý/deployment.yml nasazení
$schema: https://azuremlschemas.azureedge.net/latest/modelBatchDeployment.schema.json endpoint_name: heart-classifier-batch name: classifier-xgboost-mlflow description: A heart condition classifier based on XGBoost type: model model: azureml:heart-classifier-mlflow@latest compute: azureml:batch-cluster resources: instance_count: 2 settings: max_concurrency_per_instance: 2 mini_batch_size: 2 output_action: append_row output_file_name: predictions.csv retry_settings: max_retries: 3 timeout: 300 error_threshold: -1 logging_level: info
Pak vytvořte nasazení pomocí následujícího příkazu:
az ml batch-deployment create --file deployment-simple/deployment.yml --endpoint-name $ENDPOINT_NAME --set-default
Důležité
Nakonfigurujte
timeout
v nasazení podle toho, jak dlouho trvá spuštění odvozování modelu v jedné dávce. Čím větší je velikost dávky, tím delší musí být tato hodnota. Remeber, kterýmini_batch_size
označuje počet souborů v dávce, ne počet vzorků. Při práci s tabulkovými daty může každý soubor obsahovat více řádků, což zvýší dobu potřebnou ke zpracování jednotlivých souborů v dávkovém koncovém bodu. V těchto případech používejte vysoké hodnoty, abyste se vyhnuli chybám vypršení časového limitu.I když můžete vyvolat konkrétní nasazení uvnitř koncového bodu, obvykle budete chtít vyvolat samotný koncový bod a nechat koncový bod rozhodnout, které nasazení použít. Toto nasazení se nazývá výchozí nasazení. To vám dává možnost změnit výchozí nasazení a tím změnit model obsluhující nasazení beze změny kontraktu s uživatelem vyvoláním koncového bodu. K aktualizaci výchozího nasazení použijte následující pokyny:
V tuto chvíli je náš dávkový koncový bod připravený k použití.
Testování nasazení
K otestování koncového bodu použijeme ukázku neoznačeného dat v tomto úložišti, která se dají použít s modelem. Koncové body služby Batch můžou zpracovávat pouze data umístěná v cloudu a přístupná z pracovního prostoru Azure Machine Učení. V tomto příkladu ho nahrajeme do úložiště dat Azure Machine Učení. Zejména vytvoříme datový asset, který se dá použít k vyvolání koncového bodu pro bodování. Všimněte si však, že dávkové koncové body přijímají data, která lze umístit do různých umístění.
Nejprve vytvoříme datový asset. Tento datový prostředek se skládá ze složky s několika soubory CSV, které chceme zpracovat paralelně pomocí dávkových koncových bodů. Tento krok můžete přeskočit, protože vaše data jsou už zaregistrovaná jako datový prostředek nebo chcete použít jiný vstupní typ.
a. Vytvoření definice datového assetu v
YAML
:heart-dataset-unlabeled.yml
$schema: https://azuremlschemas.azureedge.net/latest/data.schema.json name: heart-dataset-unlabeled description: An unlabeled dataset for heart classification. type: uri_folder path: data
b. Vytvoření datového assetu:
az ml data create -f heart-dataset-unlabeled.yml
Teď, když jsou data nahraná a připravená k použití, vyvoláme koncový bod:
JOB_NAME = $(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input azureml:heart-dataset-unlabeled@latest --query name -o tsv)
Poznámka:
jq
Nástroj nemusí být nainstalován v každé instalaci. Pokyny k instalaci najdete na tomto odkazu.Tip
Všimněte si, že v operaci vyvolání neudávajíme název nasazení. Důvodem je to, že koncový bod automaticky směruje úlohu do výchozího nasazení. Vzhledem k tomu, že náš koncový bod má jenom jedno nasazení, je to výchozí. Konkrétní nasazení můžete cílit zadáním argumentu nebo parametru
deployment_name
.Dávková úloha se spustí hned po vrácení příkazu. Stav úlohy můžete monitorovat, dokud se nedokončí:
Analýza výstupů
Výstupní předpovědi se generují v predictions.csv
souboru, jak je uvedeno v konfiguraci nasazení. Úloha vygeneruje pojmenovaný výstup, který se nazývá score
umístění tohoto souboru. Pro každou dávkovou úlohu se vygeneruje jenom jeden soubor.
Soubor je strukturovaný takto:
Každý datový bod, který byl odeslán do modelu, je jeden řádek. U tabulkových dat to znamená, že soubor (
predictions.csv
) obsahuje jeden řádek pro každý řádek, který je v každém zpracovaných souborů. U jiných datových typů (např. obrázků, zvuku, textu) je na každý zpracovaný soubor jeden řádek.Následující sloupce jsou v souboru (v pořadí):
row
(volitelné), odpovídající index řádku ve vstupním datovém souboru. To platí jenom v případě, že jsou vstupní data tabulková. Předpovědi se vrátí ve stejném pořadí, v jakém se zobrazí ve vstupním souboru, takže se můžete spolehnout na číslo řádku, aby odpovídalo odpovídající predikci.prediction
, předpověď přidružená ke vstupním datům. Tato hodnota je vrácena tak, jak je, byla poskytována funkcí modelupredict().
.file_name
, název souboru, ze kterého byla data načtena. V tabulkových datech můžete pomocí tohoto pole zjistit, které předpovědi patří do kterých vstupních dat.
Výsledky úlohy si můžete stáhnout pomocí názvu úlohy:
K stažení předpovědí použijte následující příkaz:
az ml job download --name $JOB_NAME --output-name score --download-path ./
Jakmile se soubor stáhne, můžete ho otevřít pomocí oblíbeného nástroje. Následující příklad načte předpovědi pomocí Pandas
datového rámce.
import pandas as pd
score = pd.read_csv(
"named-outputs/score/predictions.csv", names=["row", "prediction", "file"]
)
Výstup vypadá takto:
row | Předpověď | soubor |
---|---|---|
0 | 0 | heart-unlabeled-0.csv |
1 | 1 | heart-unlabeled-0.csv |
2 | 0 | heart-unlabeled-0.csv |
... | ... | ... |
307 | 0 | heart-unlabeled-3.csv |
Tip
Všimněte si, že v tomto příkladu vstupní data byla tabulková data ve CSV
formátu a existují 4 různé vstupní soubory (heart-unlabeled-0.csv, heart-unlabeled-1.csv, heart-unlabeled-2.csv a heart-unlabeled-3.csv).
Důležité informace o nasazení do dávkového odvozování
Azure Machine Učení podporuje nasazování modelů MLflow do dávkových koncových bodů bez označení hodnoticího skriptu. Představuje pohodlný způsob nasazení modelů, které vyžadují zpracování velkých objemů dat dávkově. Azure Machine Učení používá informace ve specifikaci modelu MLflow k orchestraci procesu odvozování.
Jak se práce distribuuje u pracovních procesů
Koncové body služby Batch distribuují práci na úrovni souboru pro strukturovaná i nestrukturovaná data. V důsledku toho se pro tuto funkci podporují jenom soubory URI a složky identifikátorů URI. Každý pracovní proces zpracovává dávky Mini batch size
souborů najednou. U tabulkových dat dávkové koncové body při distribuci práce nezohlední počet řádků uvnitř každého souboru.
Upozorňující
Během odvozování nejsou prozkoumány struktury vnořených složek. Pokud data rozdělujete pomocí složek, nezapomeňte strukturu předem zploštět.
Dávkové nasazení budou volat predict
funkci modelu MLflow jednou na soubor. U souborů CSV obsahujících více řádků to může mít v podkladovém výpočetním prostředí tlak na paměť a může zvýšit dobu potřebnou k určení skóre jednoho souboru (speciálně pro nákladné modely, jako jsou velké jazykové modely). Pokud v protokolech dojde k několika výjimkám mimo paměť nebo záznamům časového limitu, zvažte rozdělení dat v menších souborech s méně řádky nebo implementaci dávkování na úrovni řádků uvnitř skriptu pro vyhodnocování modelu nebo bodování.
Podpora typů souborů
Následující datové typy jsou podporovány pro dávkové odvozování při nasazování modelů MLflow bez prostředí a bodovacího skriptu. Pokud chcete zpracovat jiný typ souboru nebo provést odvozování jiným způsobem, který dávkové koncové body ve výchozím nastavení dělají, můžete vždy vytvořit nasazení pomocí hodnoticího skriptu, jak je vysvětleno v použití modelů MLflow se skriptem pro bodování.
Přípona souboru | Typ vrácený jako vstup modelu | Požadavek na podpis |
---|---|---|
.csv , , .parquet .pqt |
pd.DataFrame |
ColSpec . Pokud není zadaný, vynucuje se zadávání sloupců. |
.png , .jpg , .jpeg , .tiff , , .bmp .gif |
np.ndarray |
TensorSpec . Vstup se přetvaruje tak, aby odpovídal obrazci tenzorů, pokud je k dispozici. Pokud není k dispozici žádný podpis, odvozují se tensory typu np.uint8 . Další pokyny najdete v článku Důležité informace o aspektech zpracování imagí modelů MLflow. |
Upozorňující
Doporučujeme, aby všechny nepodporované soubory, které můžou být přítomné ve vstupních datech, mohly úlohu selhat. Zobrazí se následující chybová položka: ERROR:azureml:Error processing input file: '/mnt/batch/tasks/.../a-given-file.avro' (Chyba zpracování vstupního souboru: /mnt/batch/tasks/.../a-given-file.avro). Typ souboru avro není podporován.
Vynucení podpisu pro modely MLflow
Datové typy vstupu se vynucují úlohami dávkového nasazení při čtení dat pomocí dostupného podpisu modelu MLflow. To znamená, že vstup dat by měl vyhovovat typům uvedeným v podpisu modelu. Pokud data nelze analyzovat podle očekávání, úloha selže s chybovou zprávou podobnou této: "ERROR:azureml:Error processing input file: '/mnt/batch/tasks/.../a-given-file.csv'. Výjimka: Neplatný literál pro int() se základem 10: 'value'.
Tip
Podpisy v modelech MLflow jsou volitelné, ale důrazně se doporučuje, protože poskytují pohodlný způsob, jak včas rozpoznat problémy s kompatibilitou dat. Další informace o tom, jak protokolovat modely pomocí podpisů, číst protokolovací modely s vlastním podpisem, prostředím nebo ukázkami.
Podpis modelu modelu můžete zkontrolovat otevřením souboru přidruženého k vašemu MLmodel
modelu MLflow. Další podrobnosti o tom, jak podpisy fungují v MLflow, najdete v tématu Podpisy v MLflow.
Podpora příchuť
Nasazení služby Batch podporují pouze nasazování modelů MLflow s příchutí pyfunc
. Pokud potřebujete nasadit jinou příchuť, přečtěte si téma Použití modelů MLflow s bodovacím skriptem.
Přizpůsobení nasazení modelů MLflow pomocí hodnoticího skriptu
Modely MLflow je možné nasadit do dávkových koncových bodů bez označení hodnoticího skriptu v definici nasazení. Můžete se ale přihlásit k označení tohoto souboru (obvykle označovaného jako ovladač dávky) a přizpůsobit způsob odvození.
Tento pracovní postup obvykle vyberete v těchto případech:
- Potřebujete zpracovat typ souboru, který dávkové nasazení MLflow nepodporuje.
- Musíte přizpůsobit způsob spuštění modelu, například použít konkrétní příchuť k jeho
mlflow.<flavor>.load()
načtení . - V rutině bodování je potřeba provést předběžné zpracování nebo zpracování, pokud samotný model neprovádí.
- Výstup modelu nemůže být pěkně reprezentován v tabulkových datech. Jedná se například o tenzor představující obrázek.
- Model nemůže zpracovat každý soubor najednou kvůli omezením paměti a musí ho číst v blocích dat.
Důležité
Pokud se rozhodnete označit bodovací skript pro nasazení modelu MLflow, budete také muset určit prostředí, ve kterém se nasazení spustí.
Kroky
Pomocí následujících kroků nasaďte model MLflow s vlastním skriptem bodování.
Určete složku, ve které je umístěn model MLflow.
a. Přejděte na portál Azure Machine Učení.
b. Přejděte do části Modely.
c. Vyberte model, který se pokoušíte nasadit, a klikněte na kartu Artefakty.
d. Poznamenejte si zobrazenou složku. Tato složka byla označena při registraci modelu.
Vytvořte bodovací skript. Všimněte si, jak byl název
model
složky, který jste identifikovali dříve, součástíinit()
funkce.deployment-custom/code/batch_driver.py
# Copyright (c) Microsoft. All rights reserved. # Licensed under the MIT license. import os import glob import mlflow import pandas as pd import logging def init(): global model global model_input_types global model_output_names # AZUREML_MODEL_DIR is an environment variable created during deployment # It is the path to the model folder # Please provide your model's folder name if there's one model_path = glob.glob(os.environ["AZUREML_MODEL_DIR"] + "/*/")[0] # Load the model, it's input types and output names model = mlflow.pyfunc.load(model_path) if model.metadata and model.metadata.signature: if model.metadata.signature.inputs: model_input_types = dict( zip( model.metadata.signature.inputs.input_names(), model.metadata.signature.inputs.pandas_types(), ) ) if model.metadata.signature.outputs: if model.metadata.signature.outputs.has_input_names(): model_output_names = model.metadata.signature.outputs.input_names() elif len(model.metadata.signature.outputs.input_names()) == 1: model_output_names = ["prediction"] else: logging.warning( "Model doesn't contain a signature. Input data types won't be enforced." ) def run(mini_batch): print(f"run method start: {__file__}, run({len(mini_batch)} files)") data = pd.concat( map( lambda fp: pd.read_csv(fp).assign(filename=os.path.basename(fp)), mini_batch ) ) if model_input_types: data = data.astype(model_input_types) # Predict over the input data, minus the column filename which is not part of the model. pred = model.predict(data.drop("filename", axis=1)) if pred is not pd.DataFrame: if not model_output_names: model_output_names = ["pred_col" + str(i) for i in range(pred.shape[1])] pred = pd.DataFrame(pred, columns=model_output_names) return pd.concat([data, pred], axis=1)
Pojďme vytvořit prostředí, ve kterém se dá spustit bodovací skript. Vzhledem k tomu, že náš model je MLflow, požadavky na conda jsou také specifikovány v balíčku modelu (další podrobnosti o modelech MLflow a soubory, které jsou v něm zahrnuty, viz formát MLmodel). Pak vytvoříme prostředí pomocí závislostí conda ze souboru. Musíme ale také zahrnout balíček
azureml-core
, který je nutný pro nasazení služby Batch.Tip
Pokud už je váš model zaregistrovaný v registru modelů, můžete stáhnout nebo zkopírovat
conda.yml
soubor přidružený k vašemu modelu tak, že přejdete na studio Azure Machine Learning> Modely > vyberte model ze seznamu > Artefakty. Otevřete kořenovou složku v navigaci a vyberteconda.yml
uvedený soubor. Klikněte na Stáhnout nebo zkopírovat jeho obsah.Důležité
Tento příklad používá prostředí conda zadané na adrese
/heart-classifier-mlflow/environment/conda.yaml
. Tento soubor byl vytvořen kombinací původního souboru závislostí MLflow conda a přidáním balíčkuazureml-core
. Soubor z modelu nemůžete použítconda.yml
přímo.Konfigurace nasazení:
Pokud chcete vytvořit nové nasazení v rámci vytvořeného koncového bodu, vytvořte
YAML
konfiguraci jako v následujícím příkladu. Můžete zkontrolovat, jestli schéma YAML celého dávkového koncového bodu obsahuje další vlastnosti.vlastní/deployment.yml nasazení
$schema: https://azuremlschemas.azureedge.net/latest/modelBatchDeployment.schema.json endpoint_name: heart-classifier-batch name: classifier-xgboost-custom description: A heart condition classifier based on XGBoost type: model model: azureml:heart-classifier-mlflow@latest environment: name: batch-mlflow-xgboost image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest conda_file: environment/conda.yaml code_configuration: code: code scoring_script: batch_driver.py compute: azureml:batch-cluster resources: instance_count: 2 settings: max_concurrency_per_instance: 2 mini_batch_size: 2 output_action: append_row output_file_name: predictions.csv retry_settings: max_retries: 3 timeout: 300 error_threshold: -1 logging_level: info
Pojďme teď vytvořit nasazení:
V tuto chvíli je náš dávkový koncový bod připravený k použití.
Vyčištění prostředků
Spuštěním následujícího kódu odstraňte koncový bod dávky a všechna podkladová nasazení. Úlohy dávkového vyhodnocování se neodstraní.
az ml batch-endpoint delete --name $ENDPOINT_NAME --yes