Nasazení modelů MLflow do online koncových bodů
PLATÍ PRO: Rozšíření Azure CLI ml v2 (aktuální)
V tomto článku se dozvíte , jak nasadit model MLflow do online koncového bodu pro odvozování v reálném čase. Když nasadíte model MLflow do online koncového bodu, nemusíte zadávat bodovací skript ani prostředí – tato funkce se označuje jako nasazení bez kódu.
Pro bez nasazení kódu azure Machine Learning:
- Dynamicky instaluje balíčky Pythonu
conda.yaml
poskytnuté v souboru. Proto se závislosti nainstalují během modulu runtime kontejneru. - Poskytuje základní image nebo kurátorované prostředí MLflow, které obsahuje následující položky:
azureml-inference-server-http
mlflow-skinny
- Bodovací skript pro odvozování.
Tip
Pracovní prostory bez přístupu k veřejné síti: Než budete moct modely MLflow nasadit do online koncových bodů bez výchozího připojení, musíte modely zabalit (Preview). Pomocí balení modelů se můžete vyhnout nutnosti připojení k internetu, které by jinak služba Azure Machine Learning vyžadovala dynamicky instalovat nezbytné balíčky Pythonu pro modely MLflow.
O příkladu
Příklad ukazuje, jak můžete nasadit model MLflow do online koncového bodu pro provádění predikcí. V příkladu se používá model MLflow založený na datové sadě Diabetes. Tato datová sada obsahuje 10 základních proměnných: věk, pohlaví, index tělesné hmotnosti, průměrný krevní tlak a šest měření krevního séru získané od 442 pacientů s cukrovkou. Obsahuje také odezvu zájmu, kvantitativní míru progrese onemocnění jeden rok po základní hodnotě.
Model byl natrénován pomocí scikit-learn
regresoru a veškeré požadované předběžné zpracování bylo zabaleno jako kanál, takže tento model představuje kompletní kanál, který přechází z nezpracovaných dat na predikce.
Informace v tomto článku vycházejí 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ě a pak změňte adresáře na cli
, pokud používáte Azure CLI. Pokud používáte sadu Azure Machine Learning SDK pro Python, změňte adresáře na sdk/python/endpoints/online/mlflow
.
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli
Sledování v Poznámkovém bloku Jupyter
Postup použití sady Azure Machine Learning Python SDK můžete provést otevřením modelu Nasazení MLflow do poznámkového bloku online koncových bodů v naklonovaném úložišti.
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 Learning.
Řízení přístupu na základě role v Azure (Azure RBAC) slouží k udělení přístupu k operacím ve službě Azure Machine Learning. Pokud chcete provést kroky v tomto článku, musí mít váš uživatelský účet přiřazenou roli vlastníka nebo přispěvatele pro pracovní prostor Služby Azure Machine Learning nebo vlastní roli, která povoluje
Microsoft.MachineLearningServices/workspaces/onlineEndpoints/*
. Další informace o rolích najdete v tématu Správa přístupu k pracovnímu prostoru Azure Machine Learning.V pracovním prostoru musíte mít zaregistrovaný model MLflow. Tento článek zaregistruje model natrénovaný pro datovou sadu Diabetes v pracovním prostoru.
Potřebujete také:
- Nainstalujte Azure CLI a
ml
rozšíření do Azure CLI. Další informace o instalaci rozhraní příkazového řádku najdete v tématu Instalace a nastavení rozhraní příkazového řádku (v2).
- Nainstalujte Azure CLI a
Připojení k pracovnímu prostoru
Nejprve se připojte k pracovnímu prostoru Azure Machine Learning, kde budete pracovat.
az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
Registrace modelu
Do online koncových bodů můžete nasadit jenom registrované modely. V tomto případě už máte místní kopii modelu v úložišti, takže model je potřeba 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ý.
MODEL_NAME='sklearn-diabetes'
az ml model create --name $MODEL_NAME --type "mlflow_model" --path "endpoints/online/ncd/sklearn-diabetes/model"
Co když se váš model zaprotokoloval uvnitř spuštění?
Pokud se váš model zaprotokoloval uvnitř spuštění, můžete ho zaregistrovat přímo.
Pokud chcete model zaregistrovat, potřebujete znát umístění, kde je uložený. Pokud používáte funkci MLflow autolog
, cesta k modelu závisí na typu modelu a rozhraní. Měli byste zkontrolovat výstup úloh a identifikovat název složky modelu. Tato složka obsahuje soubor s názvem MLModel
.
Pokud metodu log_model
používáte k ručnímu protokolování modelů, předejte cestu k modelu jako argument metodě. Pokud například zapíšete model pomocí mlflow.sklearn.log_model(my_model, "classifier")
, pak cesta, kde je model uložen, je volána classifier
.
Pomocí azure Machine Learning CLI v2 vytvořte model z výstupu trénovací úlohy. V následujícím příkladu je pojmenovaný $MODEL_NAME
model registrován pomocí artefaktů úlohy s ID $RUN_ID
. Cesta, ve které je model uložen, je $MODEL_PATH
.
az ml model create --name $MODEL_NAME --path azureml://jobs/$RUN_ID/outputs/artifacts/$MODEL_PATH
Poznámka:
Cesta $MODEL_PATH
je umístění, ve kterém byl model uložen ve spuštění.
Nasazení modelu MLflow do online koncového bodu
Nakonfigurujte koncový bod, ve kterém se model nasadí. Následující příklad nakonfiguruje režim názvu a ověřování koncového bodu:
Nastavte název koncového bodu spuštěním následujícího příkazu (nahraďte
YOUR_ENDPOINT_NAME
jedinečným názvem):export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"
Konfigurace koncového bodu:
create-endpoint.yaml
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json name: my-endpoint auth_mode: key
Vytvořte koncový bod:
az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/ncd/create-endpoint.yaml
Nakonfigurujte nasazení. Nasazení je sada prostředků vyžadovaných pro hostování modelu, který provádí skutečné odvozování.
sklearn-deployment.yaml
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json name: sklearn-deployment endpoint_name: my-endpoint model: name: mir-sample-sklearn-ncd-model version: 2 path: sklearn-diabetes/model type: mlflow_model instance_type: Standard_DS3_v2 instance_count: 1
Poznámka:
Automatické generování
scoring_script
modelu aenvironment
podporuje se pouze propyfunc
variantu modelu. Pokud chcete použít jinou variantu modelu, přečtěte si téma Přizpůsobení nasazení modelu MLflow.Vytvořte nasazení:
az ml online-deployment create --name sklearn-deployment --endpoint $ENDPOINT_NAME -f endpoints/online/ncd/sklearn-deployment.yaml --all-traffic
Pokud váš koncový bod nemá výchozí připojení, použijte balení modelů (Preview) zahrnutím příznaku
--with-package
:az ml online-deployment create --with-package --name sklearn-deployment --endpoint $ENDPOINT_NAME -f endpoints/online/ncd/sklearn-deployment.yaml --all-traffic
Přiřaďte veškerý provoz k nasazení. Zatím má koncový bod jedno nasazení, ale žádný z jeho provozu se k němu neřadí.
Tento krok není vyžadován v Azure CLI, protože jste příznak použili
--all-traffic
při vytváření. Pokud potřebujete změnit provoz, můžete použít příkazaz ml online-endpoint update --traffic
. Další informace o tom, jak aktualizovat provoz, naleznete v tématu Progresivní aktualizace provozu.Aktualizujte konfiguraci koncového bodu:
Tento krok není vyžadován v Azure CLI, protože jste příznak použili
--all-traffic
při vytváření. Pokud potřebujete změnit provoz, můžete použít příkazaz ml online-endpoint update --traffic
. Další informace o tom, jak aktualizovat provoz, naleznete v tématu Progresivní aktualizace provozu.
Vyvolání koncového bodu
Jakmile je nasazení připravené, můžete ho použít k odeslání žádosti. Jedním ze způsobů, jak otestovat nasazení, je použití integrované funkce vyvolání v klientovi nasazení, který používáte. Následující JSON je ukázkový požadavek na nasazení.
sample-request-sklearn.json
{"input_data": {
"columns": [
"age",
"sex",
"bmi",
"bp",
"s1",
"s2",
"s3",
"s4",
"s5",
"s6"
],
"data": [
[ 1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0 ],
[ 10.0,2.0,9.0,8.0,7.0,6.0,5.0,4.0,3.0,2.0]
],
"index": [0,1]
}}
Poznámka:
input_data
se používá v tomto příkladu místo inputs
toho, že se používá v obsluhě MLflow. Důvodem je to, že Azure Machine Learning vyžaduje, aby bylo možné automaticky generovat kontrakty swaggeru pro koncové body v jiném vstupním formátu. Další informace o očekávaných vstupních formátech najdete v tématu Rozdíly mezi modely nasazenými ve službě Azure Machine Learning a integrovaným serverem MLflow.
Odešlete do koncového bodu žádost následujícím způsobem:
az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/ncd/sample-request-sklearn.json
Odpověď bude podobná následujícímu textu:
[
11633.100167144921,
8522.117402884991
]
Důležité
U MLflow bez nasazení kódu se v současné době nepodporuje testování prostřednictvím místních koncových bodů .
Přizpůsobení nasazení modelů MLflow
V definici nasazení modelu MLflow do online koncového bodu nemusíte zadávat bodovací skript. Můžete se ale rozhodnout, jak se má odvozovat, a přizpůsobit způsob, jakým se odvozuje.
Nasazení modelu MLflow obvykle budete chtít přizpůsobit, když:
- Model na něm nemá příchuť
PyFunc
. - Musíte přizpůsobit způsob spuštění modelu, například použít konkrétní příchuť pro načtení modelu pomocí
mlflow.<flavor>.load_model()
. - V rutině bodování je potřeba provést předběžné zpracování nebo zpracování, pokud to 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.
Důležité
Pokud se rozhodnete zadat bodovací skript pro nasazení modelu MLflow, budete také muset určit prostředí, ve kterém se nasazení spustí.
Kroky
Nasazení modelu MLflow pomocí vlastního hodnoticího skriptu:
Určete složku, ve které se nachází váš model MLflow.
a. Přejděte na studio Azure Machine Learning.
b. Přejděte do části Modely .
c. Vyberte model, který se pokoušíte nasadit, a přejděte na kartu Artefakty .
d. Poznamenejte si zobrazenou složku. Tato složka byla zadána při registraci modelu.
Vytvořte bodovací skript. Všimněte si, že název
model
složky, který jste dříve identifikovali, je součástíinit()
funkce.Tip
Následující bodovací skript je k dispozici jako příklad, jak provést odvozování pomocí modelu MLflow. Tento skript můžete přizpůsobit vašim potřebám nebo změnit libovolnou jeho část tak, aby odrážel váš scénář.
score.py
import logging import os import json import mlflow from io import StringIO from mlflow.pyfunc.scoring_server import infer_and_parse_json_input, predictions_to_json def init(): global model global input_schema # "model" is the path of the mlflow artifacts when the model was registered. For automl # models, this is generally "mlflow-model". model_path = os.path.join(os.getenv("AZUREML_MODEL_DIR"), "model") model = mlflow.pyfunc.load_model(model_path) input_schema = model.metadata.get_input_schema() def run(raw_data): json_data = json.loads(raw_data) if "input_data" not in json_data.keys(): raise Exception("Request must contain a top level key named 'input_data'") serving_input = json.dumps(json_data["input_data"]) data = infer_and_parse_json_input(serving_input, input_schema) predictions = model.predict(data) result = StringIO() predictions_to_json(predictions, result) return result.getvalue()
Upozorňující
Poradce pro MLflow 2.0: Zadaný skript bodování bude fungovat s MLflow 1.X i MLflow 2.X. Doporučujeme však, aby se očekávané formáty vstupu a výstupu v těchto verzích mohly lišit. Zkontrolujte definici prostředí, která se používá, abyste měli jistotu, že používáte očekávanou verzi MLflow. Všimněte si, že MLflow 2.0 se podporuje jenom v Pythonu 3.8 nebo novějším.
Vytvořte prostředí, ve kterém lze spustit bodovací skript. Vzhledem k tomu, že se jedná o model MLflow, jsou požadavky na conda také specifikovány v balíčku modelu. Další podrobnosti o souborech zahrnutých v modelu MLflow naleznete ve formátu MLmodel. Pak vytvoříte prostředí pomocí závislostí conda ze souboru. Musíte ale také zahrnout balíček
azureml-inference-server-http
, který je nutný pro online nasazení ve službě Azure Machine Learning.Definiční soubor conda je následující:
conda.yml
channels: - conda-forge dependencies: - python=3.9 - pip - pip: - mlflow - scikit-learn==1.2.2 - cloudpickle==2.2.1 - psutil==5.9.4 - pandas==2.0.0 - azureml-inference-server-http name: mlflow-env
Poznámka:
Balíček
azureml-inference-server-http
byl přidán do původního souboru závislostí conda.K vytvoření prostředí použijete tento soubor závislostí conda:
Prostředí se vytvoří v konfiguraci nasazení.
Vytvořte nasazení:
Vytvořte konfigurační soubor nasazení deployment.yml:
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json name: sklearn-diabetes-custom endpoint_name: my-endpoint model: azureml:sklearn-diabetes@latest environment: image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu22.04 conda_file: sklearn-diabetes/environment/conda.yml code_configuration: code: sklearn-diabetes/src scoring_script: score.py instance_type: Standard_F2s_v2 instance_count: 1
Vytvořte nasazení:
az ml online-deployment create -f deployment.yml
Jakmile se nasazení dokončí, je připravené obsluhovat žádosti. Jedním ze způsobů, jak otestovat nasazení, je použití ukázkového souboru požadavku spolu s metodou
invoke
.sample-request-sklearn.json
{"input_data": { "columns": [ "age", "sex", "bmi", "bp", "s1", "s2", "s3", "s4", "s5", "s6" ], "data": [ [ 1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0 ], [ 10.0,2.0,9.0,8.0,7.0,6.0,5.0,4.0,3.0,2.0] ], "index": [0,1] }}
Odešlete do koncového bodu žádost následujícím způsobem:
az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/ncd/sample-request-sklearn.json
Odpověď bude podobná následujícímu textu:
{ "predictions": [ 11633.100167144921, 8522.117402884991 ] }
Upozorňující
Poradce pro MLflow 2.0: V MLflow 1.X
predictions
chybí klíč.
Vyčištění prostředků
Po dokončení používání koncového bodu odstraňte přidružené prostředky:
az ml online-endpoint delete --name $ENDPOINT_NAME --yes