Nasazení modelů MLflow v dávkových nasazeních ve službě Azure Machine Learning
PLATÍ PRO:Rozšíření Azure CLI ml v2 (aktuální)Python SDK azure-ai-ml v2 (aktuální)
Tento článek popisuje, jak nasadit modely MLflow do služby Azure Machine Learning pro dávkové odvozování pomocí dávkových koncových bodů. Když nasadíte modely MLflow do dávkových koncových bodů, Azure Machine Learning dokončí následující úlohy:
- Poskytuje základní image nebo kurátorované prostředí MLflow, které obsahuje požadované závislosti pro spuštění dávkové úlohy Machine Learning.
- Vytvoří kanál dávkové úlohy s bodovacím skriptem, který můžete použít ke zpracování dat pomocí paralelizace.
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í.
Požadavky
Předplatné Azure. Pokud ještě nemáte předplatné Azure, vytvořte si napřed bezplatný účet.
Pracovní prostor služby Azure Machine Learning. Pokud chcete vytvořit pracovní prostor, přečtěte si téma Správa pracovních prostorů Služby Azure Machine Learning.
Následující oprávnění v pracovním prostoru Azure Machine Learning:
- Pro vytváření nebo správu dávkových koncových bodů a nasazení: Použijte roli Vlastník, Přispěvatel nebo Vlastní role, která má přiřazená
Microsoft.MachineLearningServices/workspaces/batchEndpoints/*
oprávnění. - Vytváření nasazení Azure Resource Manageru ve skupině prostředků pracovního prostoru: Použijte roli Vlastník, Přispěvatel nebo Vlastní role, která má přiřazená
Microsoft.Resources/deployments/write
oprávnění ve skupině prostředků, ve které je pracovní prostor nasazený.
- Pro vytváření nebo správu dávkových koncových bodů a nasazení: Použijte roli Vlastník, Přispěvatel nebo Vlastní role, která má přiřazená
Azure Machine Learning CLI nebo sada Azure Machine Learning SDK pro Python:
Spuštěním následujícího příkazu nainstalujte Azure CLI a
ml
rozšíření pro Azure Machine Learning:az extension add -n ml
Nasazení součástí kanálu pro dávkové koncové body jsou zavedena ve verzi 2.7
ml
rozšíření pro Azure CLI.az extension update --name ml
Pomocí příkazu získejte nejnovější verzi.
Připojení k pracovnímu prostoru
Pracovní prostor je prostředek nejvyšší úrovně pro Azure Machine Learning. Poskytuje centralizované místo pro práci se všemi artefakty, které vytvoříte při použití služby Azure Machine Learning. V této části se připojíte k pracovnímu prostoru, ve kterém provádíte úlohy nasazení.
V následujícím příkazu zadejte ID předplatného, název pracovního prostoru, název skupiny prostředků a umístění:
az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
Prozkoumání příkladu
Příklad v tomto článku ukazuje, jak nasadit model MLflow do dávkového koncového bodu pro provádění dávkových predikcí. Model MLflow je založen na datové sadě UCI Srdeční onemocnění. Databáze obsahuje 76 atributů, ale v příkladu se používá pouze podmnožina 14. Model se snaží předpovědět přítomnost onemocnění srdce u pacienta s celočíselnou hodnotou od 0 (bez přítomnosti) do 1 (přítomnost).
Model se trénuje pomocí klasifikátoru XGBBoost
. Všechna požadovaná předzpracování jsou zabalená jako scikit-learn
kanál, takže model je 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, naklonujte úložiště pomocí následujících příkazů a přejděte do složky pro váš kódovací jazyk:
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli
Soubory pro tento příklad jsou umístěny v následující složce:
cd endpoints/batch/deploy-models/heart-classifier-mlflow
Sledování v poznámkových blocích Jupyter
Tuto ukázku můžete sledovat pomocí veřejného poznámkového bloku Jupyter. V naklonovaném úložišti otevřete poznámkový blok mlflow-for-batch-tabular.ipynb .
Nasazení modelu MLflow
V této části nasadíte model MLflow do dávkového koncového bodu, abyste mohli spouštět dávkové odvozování nad novými daty. Než budete pokračovat s nasazením, musíte zajistit, aby byl váš model zaregistrovaný a v pracovním prostoru je dostupný výpočetní cluster.
Registrace modelu
Koncové body služby Batch můžou nasazovat jenom registrované modely. V tomto článku použijete místní kopii modelu v úložišti. V důsledku toho musíte model publikovat jenom do registru v pracovním prostoru.
Poznámka:
Pokud už je model, který nasazujete, zaregistrovaný, můžete pokračovat v části Vytvoření výpočetního clusteru .
Zaregistrujte model spuštěním následujícího příkazu:
MODEL_NAME='heart-classifier-mlflow'
az ml model create --name $MODEL_NAME --type "mlflow_model" --path "model"
Vytvoření výpočetního clusteru
Potřebujete zajistit, aby dávkové nasazení běžela na určité dostupné infrastruktuře (výpočetních prostředcích). Nasazení služby Batch se můžou spouštět na libovolných výpočetních prostředcích služby Machine Learning, které už v pracovním prostoru existují. Stejnou výpočetní infrastrukturu může sdílet několik dávkových nasazení.
V tomto článku pracujete na výpočetním clusteru Machine Learning s názvem cpu-cluster. Následující příklad ověří, že výpočetní prostředky existují v pracovním prostoru nebo vytvoří nový výpočetní objekt.
Vytvoření výpočetního clusteru:
az ml compute create -n batch-cluster --type amlcompute --min-instances 0 --max-instances 5
Vytvoření dávkového koncového bodu
K vytvoření koncového bodu potřebujete název a popis. Název koncového bodu se zobrazí v identifikátoru URI přidruženém k vašemu koncovému bodu, takže musí být jedinečný v rámci oblasti Azure. V oblasti WestUS2 může být například jenom jeden dávkový koncový bod s názvem mybatchendpoint
.
Název koncového bodu umístěte do proměnné pro pozdější použití:
Vytvořte koncový bod:
Pokud chcete vytvořit nový koncový bod, vytvořte
YAML
konfiguraci, jako je následující kód: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
Pomocí následujícího příkazu vytvořte koncový bod:
az ml batch-endpoint create -n $ENDPOINT_NAME -f endpoint.yml
Vytvoření dávkového nasazení
Modely MLflow nevyžadují, abyste při vytváření nasazení označili prostředí nebo bodovací skript. Automaticky se vytvoří prostředí nebo bodovací skript. Pokud ale chcete přizpůsobit způsob odvozování nasazení, můžete zadat prostředí nebo bodovací skript.
Pokud chcete vytvořit nové nasazení v rámci vytvořeného koncového bodu, vytvořte
YAML
konfiguraci, jak je znázorněno v následujícím kódu. 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
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é
timeout
Nakonfigurujte hodnotu v nasazení na základě toho, jak dlouho trvá spuštění odvozování modelu v jedné dávce. Čím větší je velikost dávky, tím delší timeout
je hodnota. Mějte na paměti, že mini_batch_size
hodnota označuje počet souborů v dávce, nikoli počet vzorků. Při práci s tabulkovými daty může každý soubor obsahovat více řádků, což zvyšuje dobu potřebnou ke zpracování jednotlivých souborů v dávkovém koncovém bodu. V takovýchpřípadechch timeout
Vyvolání koncového bodu
I když můžete vyvolat konkrétní nasazení uvnitř koncového bodu, je běžné vyvolat samotný koncový bod a nechat koncový bod rozhodnout, které nasazení použít. Tento typ nasazení má název výchozí nasazení. Tento přístup umožňuje změnit výchozí nasazení, které umožňuje změnit model obsluhující nasazení beze změny kontraktu s uživatelem, který vyvolá koncový bod.
K aktualizaci výchozího nasazení použijte následující pokyny:
DEPLOYMENT_NAME="classifier-xgboost-mlflow"
az ml batch-endpoint update --name $ENDPOINT_NAME --set defaults.deployment_name=$DEPLOYMENT_NAME
Koncový bod batch je teď připravený k použití.
Otestování nasazení
K otestování koncového bodu použijete ukázku neoznaených dat umístěných 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 Machine Learning. V tomto příkladu nahrajete ukázku do úložiště dat Machine Learning. Vytvoříte datový asset, který můžete použít k vyvolání koncového bodu pro bodování. Mějte na paměti, že dávkové koncové body přijímají data, která je možné umístit do různých umístění.
Nejprve vytvořte datový asset. 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.
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
Vytvoření datového assetu:
az ml data create -f heart-dataset-unlabeled.yml
Po nahrání dat vyvoláte koncový bod.
Tip
V následujícíchpříkazch
invoke
Koncový bod automaticky směruje úlohu do výchozího nasazení, protože koncový bod má pouze jedno nasazení. Konkrétní nasazení můžete cílit tak, že uvedete argument/parametrdeployment_name
.Spusťte následující příkaz:
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 v tématu Stažení jq.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 souboru predictions.csv , jak je uvedeno v konfiguraci nasazení. Úloha vygeneruje výstupní pojmenované skóre, kde je tento soubor umístěn. Pro každou dávkovou úlohu se vygeneruje jenom jeden soubor.
Soubor je strukturovaný takto:
Jeden řádek na každý datový bod odeslaný do modelu. U tabulkových dat soubor predictions.csv obsahuje jeden řádek pro každý řádek, který je v každém zpracovaném souboru. U jiných datových typů (obrázků, zvuku, textu) je na každý zpracovaný soubor jeden řádek.
Následující sloupce jsou v souboru (v zadaném pořadí):
row
(volitelné): Odpovídající index řádku ve vstupním datovém souboru. Tento sloupec 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. Můžete se spolehnout na číslo řádku tak, aby odpovídalo odpovídající predikci.prediction
: Předpověď přidružená ke vstupním datům. Tato hodnota se vrátí tak, jak je, protože ji poskytlapredict().
funkce modelu.file_name
: Název souboru, ve kterém se data čtou. V tabulkových datech můžete pomocí tohoto pole určit, které předpovědi patří do jednotlivý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 ./
Po stažení souboru můžete soubor otevřít pomocí preferovaného nástroje pro úpravy. Následující příklad načte předpovědi pomocí datového Pandas
rámce.
import pandas as pd
score = pd.read_csv(
"named-outputs/score/predictions.csv", names=["row", "prediction", "file"]
)
Výstup zobrazí tabulku:
Řádek | Predikce | 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 obsahují tabulková data ve formátu CSV. Existují čtyři různé vstupní soubory: heart-unlabeled-0.csv, heart-unlabeled-1.csv, heart-unlabeled-2.csv a heart-unlabeled-3.csv.
Kontrola důležitých informací o dávkovém odvozování
Machine Learning podporuje nasazení modelů MLflow do dávkových koncových bodů bez označení hodnoticího skriptu. Tento přístup představuje pohodlný způsob nasazení modelů, které vyžadují zpracování velkých objemů dat podobných dávkovému zpracování. Machine Learning používá informace ve specifikaci modelu MLflow k orchestraci procesu odvozování.
Prozkoumání distribuce práce na pracovních činnostech
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í
Vnořené struktury složek se během odvozování neprobídnou. Pokud data rozdělíte pomocí složek, nezapomeňte před pokračováním strukturu zploštět.
Dávkové nasazení volají predict
funkci modelu MLflow jednou na soubor. U souborů CSV s více řádky může tato akce v podkladových výpočetních prostředcích tlačit na paměť. Toto chování může zvýšit dobu potřebnou k určení skóre jednoho souboru, zejména u drahých modelů, jako jsou velké jazykové modely. Pokud v protokolech dojde k několika výjimkám z nedostatku paměti 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ř hodnoticího skriptu modelu.
Kontrola podpory typů souborů
Následující datové typy jsou podporovány pro dávkové odvozování při nasazování modelů MLflow bez prostředí nebo bodovacího skriptu. Pokud chcete zpracovat jiný typ souboru nebo provést odvození odlišně, můžete nasazení vytvořit přizpůsobením nasazení modelu MLflow pomocí hodnoticího skriptu.
Přípona souboru | Typ vrácený jako vstup modelu | Požadavek na podpis |
---|---|---|
.csv , , .parquet .pqt |
pd.DataFrame |
ColSpec . Pokud není zadaný, nevynucuje 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ší informace najdete v tématu Důležité informace o modelech MLflow zpracovávajících obrázky. |
Upozorňující
Jakýkoli nepodporovaný soubor, který může být součástí vstupních dat, způsobí selhání úlohy. V takových případech se zobrazí chyba podobná chybě ERROR:azureml:Error processing input file: '/mnt/batch/tasks/.../a-given-file.avro'. Typ souboru avro není podporován.
Vysvětlení vynucení podpisu pro modely MLflow
Úlohy nasazení služby Batch vynucují datové typy vstupu při čtení dat pomocí dostupného podpisu modelu MLflow. V důsledku toho vstup dat odpovídá typům uvedeným v podpisu modelu. Pokud se data nedají analyzovat podle očekávání, úloha selže s chybou podobnou chybě 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. Poskytují pohodlný způsob, jak včas odhalit problémy s kompatibilitou dat. Další informace o protokolování modelů pomocí podpisů najdete v tématu Protokolování modelů 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ší informace o tom, jak podpisy fungují v MLflow, najdete v tématu Podpisy v MLflow.
Prozkoumání podpory příchut
Nasazení služby Batch podporují nasazování modelů MLflow pouze s příchutí pyfunc
. Pokud chcete nasadit jinou příchuť, přečtěte si téma Přizpůsobení nasazení modelu pomocí hodnoticího skriptu.
Přizpůsobení nasazení modelu 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 (běžně označovaného jako ovladač dávky) a přizpůsobit provádění odvozování.
Tento pracovní postup obvykle vyberete pro následující scénáře:
- Zpracování typů souborů, které nejsou podporovány dávkovými nasazeními nasazení MLflow
- Přizpůsobte si, jak model běží, například použití konkrétního typu k načtení pomocí
mlflow.<flavor>.load()
funkce. - Dokončení předběžného nebo následného zpracování v rutině bodování, pokud není dokončeno samotným modelem.
- Upravte prezentaci modelu, který se dobře nezobrazuje s tabulkovými daty, jako je například tenzorový graf, který představuje obrázek.
- Povolit modelu čtení dat v blocích dat, protože nemůže zpracovat každý soubor najednou kvůli omezením paměti.
Důležité
Pokud chcete označit bodovací skript pro nasazení modelu MLflow, musíte zadat prostředí, ve kterém se nasazení spouští.
Použití hodnoticího skriptu
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.
Vytvořte bodovací skript. Všimněte si, jak je součástí
init()
funkce název předchozí složkymodel
.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)
Vytvořte prostředí, ve kterém lze spustit bodovací skript. Vzhledem k tomu, že model v tomto příkladu je MLflow, požadavky na conda jsou také určeny v balíčku modelu. Další informace o modelech MLflow a zahrnutých souborech naleznete ve formátu MLmodel.
V tomto kroku vytvoříte prostředí pomocí závislostí conda ze souboru. Musíte také zahrnout
azureml-core
balíček, který je nutný pro nasazení služby Batch.Tip
Pokud je váš model již zaregistrovaný v registru modelů, můžete stáhnout a zkopírovat soubor přidružený k vašemu
conda.yml
modelu. Soubor je k dispozici v studio Azure Machine Learning v části Modely>Vyberte model ze seznamu>Artefakty. V kořenové složce vyberteconda.yml
soubor a pak vyberte 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ímazureml-core
balíčku. Soubor nemůžete použítconda.yml
přímo z modelu.Konfigurace nasazení:
Pokud chcete vytvořit nové nasazení v rámci vytvořeného koncového bodu, vytvořte
YAML
konfiguraci, jak je znázorněno v následujícím fragmentu kódu. 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
Vytvořte nasazení:
Koncový bod batch je teď připravený k použití.
Vyčištění prostředků
Po dokončení cvičení odstraňte prostředky, které už nejsou potřeba.
Spuštěním následujícího kódu odstraňte koncový bod batch a všechna podkladová nasazení:
az ml batch-endpoint delete --name $ENDPOINT_NAME --yes
Tento příkaz neodstraní dávkové bodovací úlohy.