Distribuera MLflow-modeller till onlineslutpunkter
GÄLLER FÖR: Azure CLI ml-tillägget v2 (aktuellt)
I den här artikeln får du lära dig hur du distribuerar din MLflow-modell till en onlineslutpunkt för realtidsinferens. När du distribuerar MLflow-modellen till en onlineslutpunkt behöver du inte ange ett bedömningsskript eller en miljö – den här funktionen kallas ingen koddistribution.
För distribution utan kod Mašinsko učenje Azure:
- Installerar Python-paket som tillhandahålls i
conda.yaml
filen dynamiskt. Beroenden installeras därför under containerkörningen. - Tillhandahåller en MLflow-basavbildning/kuraterad miljö som innehåller följande objekt:
azureml-inference-server-http
mlflow-skinny
- Ett bedömningsskript för slutsatsdragning.
Dricks
Arbetsytor utan åtkomst till offentligt nätverk: Innan du kan distribuera MLflow-modeller till onlineslutpunkter utan utgående anslutning måste du paketera modellerna (förhandsversion). Genom att använda modellpaketering kan du undvika behovet av en Internetanslutning, som Azure Mašinsko učenje annars skulle kräva för att dynamiskt installera nödvändiga Python-paket för MLflow-modellerna.
Om exemplet
Exemplet visar hur du kan distribuera en MLflow-modell till en onlineslutpunkt för att utföra förutsägelser. I exemplet används en MLflow-modell som baseras på datauppsättningen Diabetes. Denna datamängd innehåller 10 baslinjevariabler: ålder, kön, kroppsmasseindex, genomsnittligt blodtryck och sex blodserummätningar från 442 diabetespatienter. Det innehåller också svaret av intresse, ett kvantitativt mått på sjukdomsprogression ett år efter baslinjen.
Modellen tränades med en scikit-learn
regressor och all nödvändig förbearbetning har paketerats som en pipeline, vilket gör den här modellen till en pipeline från slutpunkt till slutpunkt som går från rådata till förutsägelser.
Informationen i den här artikeln baseras på kodexempel som finns i lagringsplatsen azureml-examples . Om du vill köra kommandona lokalt utan att behöva kopiera/klistra in YAML och andra filer klonar du lagringsplatsen och ändrar sedan katalogerna till cli
, om du använder Azure CLI. Om du använder Azure Mašinsko učenje SDK för Python ändrar du kataloger till sdk/python/endpoints/online/mlflow
.
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli
Följ med i Jupyter Notebook
Du kan följa stegen för att använda Azure Mašinsko učenje Python SDK genom att öppna notebook-filen Deploy MLflow model to online endpoints (Distribuera MLflow-modell till onlineslutpunkter) på den klonade lagringsplatsen.
Förutsättningar
Innan du följer stegen i den här artikeln kontrollerar du att du har följande förutsättningar:
En Azure-prenumeration. Om du inte har någon Azure-prenumeration kan du skapa ett kostnadsfritt konto innan du börjar. Prova den kostnadsfria eller betalda versionen av Azure Mašinsko učenje.
Rollbaserade åtkomstkontroller i Azure (Azure RBAC) används för att bevilja åtkomst till åtgärder i Azure Machine Learning. Om du vill utföra stegen i den här artikeln måste ditt användarkonto tilldelas rollen ägare eller deltagare för Azure Mašinsko učenje-arbetsytan eller en anpassad roll som tillåter
Microsoft.MachineLearningServices/workspaces/onlineEndpoints/*
. Mer information om roller finns i Hantera åtkomst till en Azure Mašinsko učenje-arbetsyta.Du måste ha en MLflow-modell registrerad på din arbetsyta. Den här artikeln registrerar en modell som tränats för datamängden Diabetes på arbetsytan.
Du måste också:
- Installera Azure CLI och
ml
tillägget till Azure CLI. Mer information om hur du installerar CLI finns i Installera och konfigurera CLI (v2).
- Installera Azure CLI och
Anslut till din arbetsyta
Anslut först till den Azure Mašinsko učenje-arbetsyta där du ska arbeta.
az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
Registrera modellen
Du kan bara distribuera registrerade modeller till onlineslutpunkter. I det här fallet har du redan en lokal kopia av modellen på lagringsplatsen, så du behöver bara publicera modellen till registret på arbetsytan. Du kan hoppa över det här steget om den modell som du försöker distribuera redan är registrerad.
MODEL_NAME='sklearn-diabetes'
az ml model create --name $MODEL_NAME --type "mlflow_model" --path "endpoints/online/ncd/sklearn-diabetes/model"
Vad händer om din modell loggades inuti en körning?
Om din modell loggades inuti en körning kan du registrera den direkt.
Om du vill registrera modellen måste du veta var den lagras. Om du använder MLflow-funktionen autolog
beror sökvägen till modellen på modelltypen och ramverket. Du bör kontrollera jobbens utdata för att identifiera namnet på modellens mapp. Den här mappen innehåller en fil med namnet MLModel
.
Om du använder log_model
metoden för att manuellt logga dina modeller skickar du sökvägen till modellen som argument till metoden. Om du till exempel loggar modellen med hjälp av mlflow.sklearn.log_model(my_model, "classifier")
kallas classifier
sökvägen där modellen lagras .
Använd Azure Mašinsko učenje CLI v2 för att skapa en modell från ett träningsjobbsutdata. I följande exempel registreras en modell med namnet $MODEL_NAME
med artefakterna för ett jobb med ID $RUN_ID
. Sökvägen där modellen lagras är $MODEL_PATH
.
az ml model create --name $MODEL_NAME --path azureml://jobs/$RUN_ID/outputs/artifacts/$MODEL_PATH
Kommentar
Sökvägen $MODEL_PATH
är den plats där modellen har lagrats i körningen.
Distribuera en MLflow-modell till en onlineslutpunkt
Konfigurera slutpunkten där modellen ska distribueras. I följande exempel konfigureras slutpunktens namn och autentiseringsläge:
Ange ett slutpunktsnamn genom att köra följande kommando (ersätt
YOUR_ENDPOINT_NAME
med ett unikt namn):export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"
Konfigurera slutpunkten:
create-endpoint.yaml
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json name: my-endpoint auth_mode: key
Skapa slutpunkten:
az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/ncd/create-endpoint.yaml
Konfigurera distributionen. En distribution är en uppsättning resurser som krävs för att vara värd för den modell som utför den faktiska inferensen.
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
Kommentar
Autogeneration av
scoring_script
ochenvironment
stöds endast förpyfunc
modellsmak. Om du vill använda en annan modellsmak kan du läsa Anpassa MLflow-modelldistributioner.Skapa distributionen:
az ml online-deployment create --name sklearn-deployment --endpoint $ENDPOINT_NAME -f endpoints/online/ncd/sklearn-deployment.yaml --all-traffic
Om slutpunkten inte har utgående anslutning använder du modellpaketering (förhandsversion) genom att inkludera flaggan
--with-package
:az ml online-deployment create --with-package --name sklearn-deployment --endpoint $ENDPOINT_NAME -f endpoints/online/ncd/sklearn-deployment.yaml --all-traffic
Tilldela all trafik till distributionen. Än så länge har slutpunkten en distribution, men ingen av dess trafik har tilldelats den.
Det här steget krävs inte i Azure CLI eftersom du använde
--all-traffic
flaggan när du skapade den. Om du behöver ändra trafik kan du använda kommandotaz ml online-endpoint update --traffic
. Mer information om hur du uppdaterar trafik finns i Progressiv uppdatering av trafik.Uppdatera slutpunktskonfigurationen:
Det här steget krävs inte i Azure CLI eftersom du använde
--all-traffic
flaggan när du skapade den. Om du behöver ändra trafik kan du använda kommandotaz ml online-endpoint update --traffic
. Mer information om hur du uppdaterar trafik finns i Progressiv uppdatering av trafik.
Anropa slutpunkten
När distributionen är klar kan du använda den för att hantera begäran. Ett sätt att testa distributionen är att använda den inbyggda anropsfunktionen i distributionsklienten som du använder. Följande JSON är en exempelbegäran för distributionen.
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]
}}
Kommentar
input_data
används i det här exemplet i stället för inputs
som används i MLflow-servering. Det beror på att Azure Mašinsko učenje kräver ett annat indataformat för att automatiskt kunna generera swagger-kontrakten för slutpunkterna. Mer information om förväntade indataformat finns i Skillnader mellan modeller som distribueras i Azure Mašinsko učenje och den inbyggda MLflow-servern.
Skicka en begäran till slutpunkten på följande sätt:
az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/ncd/sample-request-sklearn.json
Svaret liknar följande text:
[
11633.100167144921,
8522.117402884991
]
Viktigt!
För MLflow no-code-deployment stöds för närvarande inte testning via lokala slutpunkter .
Anpassa MLflow-modelldistributioner
Du behöver inte ange ett bedömningsskript i distributionsdefinitionen för en MLflow-modell till en onlineslutpunkt. Du kan dock välja att göra det och anpassa hur slutsatsdragningen ska köras.
Vanligtvis vill du anpassa din MLflow-modelldistribution när:
- Modellen har
PyFunc
ingen smak på den. - Du måste anpassa hur modellen körs, till exempel för att använda en specifik smak för att läsa in modellen med hjälp av
mlflow.<flavor>.load_model()
. - Du måste utföra för-/efterbearbetning i din bedömningsrutin när den inte görs av själva modellen.
- Modellens utdata kan inte representeras på ett bra sätt i tabelldata. Det är till exempel en tensor som representerar en bild.
Viktigt!
Om du väljer att ange ett bedömningsskript för en MLflow-modelldistribution måste du också ange den miljö där distributionen ska köras.
Steg
Så här distribuerar du en MLflow-modell med ett anpassat bedömningsskript:
Identifiera mappen där MLflow-modellen finns.
a. Gå till Azure Mašinsko učenje Studio.
b. Gå till avsnittet Modeller .
c. Välj den modell som du försöker distribuera och gå till fliken Artefakter .
d. Anteckna mappen som visas. Den här mappen angavs när modellen registrerades.
Skapa ett bedömningsskript. Observera hur mappnamnet
model
som du tidigare identifierade ingår iinit()
funktionen.Dricks
Följande bedömningsskript tillhandahålls som ett exempel på hur du utför slutsatsdragning med en MLflow-modell. Du kan anpassa det här skriptet efter dina behov eller ändra någon av dess delar så att det återspeglar ditt scenario.
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()
Varning
MLflow 2.0-rådgivning: Det angivna bedömningsskriptet fungerar med både MLflow 1.X och MLflow 2.X. Observera dock att de förväntade in- och utdataformaten för dessa versioner kan variera. Kontrollera den miljödefinition som används för att se till att du använder den förväntade MLflow-versionen. Observera att MLflow 2.0 endast stöds i Python 3.8+.
Skapa en miljö där bedömningsskriptet kan köras. Eftersom modellen är en MLflow-modell anges även conda-kraven i modellpaketet. Mer information om de filer som ingår i en MLflow-modell finns i MLmodel-formatet. Sedan skapar du miljön med hjälp av conda-beroendena från filen. Du måste dock även inkludera paketet
azureml-inference-server-http
, som krävs för onlinedistributioner i Azure Mašinsko učenje.Conda-definitionsfilen är följande:
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
Kommentar
Paketet
azureml-inference-server-http
har lagts till i den ursprungliga conda-beroendefilen.Du använder den här conda-beroendefilen för att skapa miljön:
Miljön skapas infogat i distributionskonfigurationen.
Skapa distributionen:
Skapa en distributionskonfigurationsfil 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
Skapa distributionen:
az ml online-deployment create -f deployment.yml
När distributionen är klar är den redo att hantera begäranden. Ett sätt att testa distributionen är att använda en exempelbegäransfil tillsammans med
invoke
metoden.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] }}
Skicka en begäran till slutpunkten på följande sätt:
az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/ncd/sample-request-sklearn.json
Svaret liknar följande text:
{ "predictions": [ 11633.100167144921, 8522.117402884991 ] }
Varning
MLflow 2.0-rekommendation: I MLflow 1.X
predictions
saknas nyckeln.
Rensa resurser
När du är klar med slutpunkten tar du bort dess associerade resurser:
az ml online-endpoint delete --name $ENDPOINT_NAME --yes