Delen via


MLflow-modellen implementeren op online-eindpunten

VAN TOEPASSING OP: Azure CLI ml-extensie v2 (actueel)

In dit artikel ziet u hoe u uw MLflow-model implementeert op een online-eindpunt voor realtime deductie. Wanneer u uw MLflow-model implementeert op een online-eindpunt, hoeft u geen scorescript of een omgeving op te geven. Deze functionaliteit wordt ook wel implementatie zonder code genoemd.

Voor implementatie zonder code, Azure Machine Learning:

  • Python-pakketten die u in een conda.yaml-bestand vermeldt, worden dynamisch geïnstalleerd. Als gevolg hiervan worden afhankelijkheden geïnstalleerd tijdens de containerruntime.
  • Biedt een MLflow-basisafbeelding of een gecureerde omgeving die de volgende items bevat:

Aanbeveling

In werkruimten zonder openbare netwerktoegang, voordat u MLflow-modellen kunt implementeren op online-eindpunten zonder uitgaande connectiviteit, moet u de modellen verpakken. De functie voor modelverpakking is in previewfase. Wanneer u een model inpakt, kunt u voorkomen dat er een internetverbinding nodig is. Anders vereist Azure Machine Learning om de benodigde Python-pakketten voor de MLflow-modellen dynamisch te installeren.

Vereiste voorwaarden

  • Een Azure-abonnement. Als u nog geen abonnement op Azure hebt, maak dan een gratis account aan voordat u begint.

  • Een gebruikersaccount met ten minste een van de volgende Azure RBAC-rollen (op rollen gebaseerd toegangsbeheer):

    • Een rol van eigenaar voor de Azure Machine Learning-werkruimte
    • De rol Inzender voor de Azure Machine Learning-werkruimte
    • Een aangepaste rol met Microsoft.MachineLearningServices/workspaces/onlineEndpoints/* machtigingen

    Zie Toegang tot Azure Machine Learning-werkruimten beheren voor meer informatie.

  • Toegang tot Azure Machine Learning:

    Installeer de Azure CLI en de ml extensie voor de Azure CLI. Zie De CLI (v2) installeren en instellen voor installatiestappen.

Over het voorbeeld

In het voorbeeld in dit artikel ziet u hoe u een MLflow-model implementeert op een online-eindpunt om voorspellingen uit te voeren. In het voorbeeld wordt een MLflow-model gebruikt dat is gebaseerd op de gegevensset Diabetes. Deze gegevensset bevat 10 basislijnvariabelen: leeftijd, geslacht, lichaamsmassaindex, gemiddelde bloeddruk en 6 bloedserummetingen verkregen van 442 diabetespatiënten. Het bevat ook de reactie van belang, een kwantitatieve meting van ziektevoortgang één jaar na de datum van de basislijngegevens.

Het model is getraind met behulp van een scikit-learn regressor. Alle vereiste voorverwerking wordt verpakt als een pijplijn, dus dit model is een end-to-end-pijplijn die van onbewerkte gegevens naar voorspellingen gaat.

De informatie in dit artikel is gebaseerd op codevoorbeelden uit de opslagplaats azureml-examples . Als u de opslagplaats kloont, kunt u de opdrachten in dit artikel lokaal uitvoeren zonder YAML-bestanden en andere bestanden te hoeven kopiëren of plakken. Gebruik de volgende opdrachten om de opslagplaats te klonen en naar de map voor uw coderingstaal te gaan:

git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli

Volg mee in het Jupyter Notebook

Als u de stappen in dit artikel wilt volgen, raadpleegt u het MLflow-model implementeren naar het online-eindpuntennotebook in de voorbeeldenopslagplaats.

Verbinding maken met uw werkruimte

Verbinding maken met uw Azure Machine Learning-werkruimte:

az account set --subscription <subscription-ID>
az configure --defaults workspace=<workspace-name> group=<resource-group-name> location=<location>

Het model registreren

U kunt alleen geregistreerde modellen implementeren op online-eindpunten. In de stappen in dit artikel wordt een model gebruikt dat is getraind voor de gegevensset Diabetes. In dit geval hebt u al een lokale kopie van het model in uw gekloonde opslagplaats, dus u hoeft het model alleen in het register in de werkruimte te publiceren. U kunt deze stap overslaan als het model dat u wilt implementeren al is geregistreerd.

MODEL_NAME='sklearn-diabetes'
az ml model create --name $MODEL_NAME --type "mlflow_model" --path "endpoints/online/ncd/sklearn-diabetes/model"

Wat als uw model gelogd was binnen een run?

Als uw model is gelogd in een run, kunt u het rechtstreeks registreren.

Als u het model wilt registreren, moet u de opslaglocatie kennen:

  • Als u de MLflow-functie autolog gebruikt, is het pad naar het model afhankelijk van het modeltype en framework. Controleer de taakuitvoer om de naam van de modelmap te identificeren. Deze map bevat een bestand met de naam MLModel.
  • Als u de log_model methode gebruikt om uw modellen handmatig te registreren, geeft u het pad naar het model als argument door aan die methode. Als u mlflow.sklearn.log_model(my_model, "classifier") gebruikt om het model te registreren, dan is classifier het pad waarop het model is opgeslagen.

U kunt de Azure Machine Learning CLI v2 gebruiken om een model te maken op basis van de uitvoer van trainingstaken. De volgende code gebruikt de artefacten van een taak met id $RUN_ID om een model met de naam $MODEL_NAMEte registreren. $MODEL_PATH is het pad dat door de taak wordt gebruikt om het model op te slaan.

az ml model create --name $MODEL_NAME --path azureml://jobs/$RUN_ID/outputs/artifacts/$MODEL_PATH

Een MLflow-model implementeren op een online-eindpunt

  1. Gebruik de volgende code om de naam en verificatiemodus te configureren van het eindpunt waarop u het model wilt implementeren:

    Stel een eindpuntnaam in door de volgende opdracht uit te voeren. Vervang eerst YOUR_ENDPOINT_NAME door een unieke naam.

    export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"
    

    Als u uw eindpunt wilt configureren, maakt u een YAML-bestand met de naam create-endpoint.yaml met de volgende regels:

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
    name: my-endpoint
    auth_mode: key
    
  2. Maak het eindpunt:

    az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/ncd/create-endpoint.yaml
    
  3. Configureer de implementatie. Een implementatie is een set resources die vereist is voor het hosten van het model dat de werkelijke deductie uitvoert.

    Maak een YAML-bestand met de naam sklearn-deployment.yaml met de volgende regels:

    $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
    

    Opmerking

    Het automatisch genereren van de scoring_script en environment wordt alleen ondersteund voor de PyFunc modelvariant. Zie MLflow-modelimplementaties aanpassen als u een andere modelsmaak wilt gebruiken.

  4. De implementatie maken:

    az ml online-deployment create --name sklearn-deployment --endpoint $ENDPOINT_NAME -f endpoints/online/ncd/sklearn-deployment.yaml --all-traffic
    

    Als uw eindpunt geen uitgaande connectiviteit heeft, gebruikt u modelverpakking (voorbeeldweergave) door de vlag --package-model op te geven:

    az ml online-deployment create --package-model --name sklearn-deployment --endpoint $ENDPOINT_NAME -f endpoints/online/ncd/sklearn-deployment.yaml --all-traffic
    
  5. Wijs al het verkeer toe aan de implementatie. Tot nu toe heeft het eindpunt één implementatie, maar er wordt geen verkeer aan het eindpunt toegewezen.

    Deze stap is niet vereist in de Azure CLI als u de vlag gebruikt tijdens het --all-traffic maken. Als u het verkeer wilt wijzigen, kunt u de az ml online-endpoint update --traffic opdracht gebruiken. Zie Progressief het verkeer bijwerken voor meer informatie over het bijwerken van verkeer.

  6. Werk de eindpuntconfiguratie bij:

    Deze stap is niet vereist in de Azure CLI als u de vlag gebruikt tijdens het --all-traffic maken. Als u verkeer wilt wijzigen, kunt u de az ml online-endpoint update --traffic opdracht gebruiken. Zie Progressief het verkeer bijwerken voor meer informatie over het bijwerken van verkeer.

Het eindpunt aanroepen

Wanneer uw implementatie gereed is, kunt u deze gebruiken om aanvragen te verwerken. Een manier om de implementatie te testen, is door gebruik te maken van de ingebouwde aanroepfunctie in uw implementatieclient. In de opslagplaats met voorbeelden bevat het bestand sample-request-sklearn.json de volgende JSON-code. U kunt het gebruiken als voorbeeldaanvraagbestand voor de implementatie.

{"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]
  }}

Opmerking

In dit bestand wordt de input_data sleutel gebruikt in plaats van inputs, die door MLflow wordt gebruikt. Voor Azure Machine Learning is een andere invoerindeling vereist om automatisch de Swagger-contracten voor de eindpunten te kunnen genereren. Zie Implementatie in de ingebouwde MLflow-server versus implementatie in de inferentieserver van Azure Machine Learning voor meer informatie over de verwachte invoerformaten.

Dien een aanvraag in bij het eindpunt:

az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/ncd/sample-request-sklearn.json

Het antwoord moet er ongeveer uitzien als de volgende tekst:

[ 
  11633.100167144921,
  8522.117402884991
]

Belangrijk

Testen via lokale eindpunten wordt momenteel niet ondersteund voor MLflow-implementatie zonder code.

MLflow-modelimplementaties aanpassen

U hoeft geen scorescript op te geven in de implementatiedefinitie van een MLflow-model naar een online-eindpunt. U kunt echter een scorescript opgeven als u het deductieproces wilt aanpassen.

Doorgaans wilt u de implementatie van uw MLflow-model aanpassen in de volgende gevallen:

  • Het model mist een PyFunc smaak.
  • U moet de manier waarop u het model uitvoert aanpassen. U moet bijvoorbeeld mlflow.<flavor>.load_model() gebruiken om een specifieke smaak te kiezen voor het laden van het model.
  • U moet preprocessing of naverwerking uitvoeren in uw scoreroutine, omdat het model deze verwerking niet uitvoert.
  • De uitvoer van het model kan niet mooi worden weergegeven in tabelgegevens. De uitvoer is bijvoorbeeld een tensor die een afbeelding vertegenwoordigt.

Belangrijk

Als u een scorescript opgeeft voor een implementatie van een MLflow-model, moet u ook de omgeving opgeven waarin de implementatie wordt uitgevoerd.

Een aangepast scorescript implementeren

Als u een MLflow-model wilt implementeren dat gebruikmaakt van een aangepast scorescript, voert u de stappen uit in de volgende secties.

De modelmap herkennen

Identificeer de map die uw MLflow-model bevat door de volgende stappen uit te voeren:

  1. Ga naar Azure Machine Learning-studio.

  2. Ga naar de sectie Modellen .

  3. Selecteer het model dat u wilt implementeren en ga naar het tabblad Artefacten .

  4. Noteer de map die wordt weergegeven. Wanneer u een model registreert, geeft u deze map op.

    Schermopname van de map met de modelartefacten.

Een scorescript maken

Het volgende scorescript, score.py, biedt een voorbeeld van het uitvoeren van deductie met een MLflow-model. U kunt dit script aanpassen aan uw behoeften of de onderdelen ervan aanpassen aan uw scenario. U ziet dat de mapnaam die u eerder hebt geïdentificeerd, modelis opgenomen in de init() functie.

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()

Waarschuwing

MLflow 2.0-advies: Het voorbeeldscript voor scoren werkt met MLflow 1.X en MLflow 2.X. De verwachte invoer- en uitvoerindelingen voor deze versies kunnen echter variëren. Controleer uw omgevingsdefinitie om te zien welke MLflow-versie u gebruikt. MLflow 2.0 wordt alleen ondersteund in Python 3.8 en latere versies.

Een omgeving maken

De volgende stap is het maken van een omgeving waarin u het scorescript kunt uitvoeren. Omdat het model een MLflow-model is, worden de conda-vereisten ook opgegeven in het modelpakket. Zie de MLmodel-indeling voor meer informatie over de bestanden die zijn opgenomen in een MLflow-model. U bouwt de omgeving met behulp van de conda-afhankelijkheden uit het bestand. U moet echter ook het azureml-inference-server-http pakket opnemen, dat vereist is voor online implementaties in Azure Machine Learning.

U kunt een conda-definitiebestand maken met de naam conda.yaml met de volgende regels:

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

Opmerking

De dependencies sectie van dit Conda-bestand bevat het azureml-inference-server-http pakket.

Gebruik dit conda-afhankelijkhedenbestand om de omgeving te maken:

De omgeving wordt in lijn gemaakt binnen de implementatieconfiguratie.

De implementatie maken

Maak in de map eindpunten/online/ncd een implementatieconfiguratiebestand, deployment.yml, dat de volgende regels bevat:

$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.yaml
code_configuration:
    code: sklearn-diabetes/src
    scoring_script: score.py
instance_type: Standard_F2s_v2
instance_count: 1

De implementatie maken:

az ml online-deployment create -f endpoints/online/ncd/deployment.yml

Aanvragen verwerken

Zodra uw implementatie is voltooid, is deze klaar om aanvragen te verwerken. Een manier om de implementatie te testen, is door de invoke methode te gebruiken met een voorbeeldaanvraagbestand, zoals het volgende bestand, 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]
  }}

Dien een aanvraag in bij het eindpunt:

az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/ncd/sample-request-sklearn.json

Het antwoord moet er ongeveer uitzien als de volgende tekst:

{
    "predictions": [ 
    1095.2797413413252,
    1134.585328803727
    ]
}

Waarschuwing

MLflow 2.0 advies: In MLflow 1.X bevat het antwoord niet de predictions sleutel.

De hulpbronnen opschonen

Als u het eindpunt niet meer nodig hebt, verwijdert u de bijbehorende resources:

az ml online-endpoint delete --name $ENDPOINT_NAME --yes