Distribuera MLflow-modeller till onlineslutpunkter

GÄLLER FÖR:Azure CLI ml extension v2 (aktuell)

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.

Azure Machine Learning för distribution utan kod:

  • 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:

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 Machine Learning 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 Machine Learning 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 Machine Learning 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 Machine Learning.

  • 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 Machine Learning-arbetsytan eller en anpassad roll som tillåter Microsoft.MachineLearningServices/workspaces/onlineEndpoints/*. Mer information om roller finns i Hantera åtkomst till en Azure Machine Learning-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å:


Anslut till din arbetsyta

Anslut först till Azure Machine Learning-arbetsytan 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 classifiersökvägen där modellen lagras .

Använd Azure Machine Learning CLI v2 för att skapa en modell från ett träningsjobb. 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

  1. 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
    
  2. Skapa slutpunkten:

    az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/ncd/create-endpoint.yaml
    
  3. 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: 1
      path: sklearn-diabetes/model
      type: mlflow_model
    instance_type: Standard_DS3_v2
    instance_count: 1
    

    Kommentar

    Autogeneration av scoring_script och environment stöds endast för pyfunc modellsmak. Om du vill använda en annan modellsmak kan du läsa Anpassa MLflow-modelldistributioner.

  4. 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
    
  5. 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 kommandot az ml online-endpoint update --traffic. Mer information om hur du uppdaterar trafik finns i Progressiv uppdatering av trafik.

  6. 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 kommandot az 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 Machine Learning 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 den inbyggda servern Azure Machine Learning och MLflow.

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:

  1. Identifiera mappen där MLflow-modellen finns.

    a. Gå till Azure Machine Learning-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.

    Skärmbild som visar mappen där modellartefakterna placeras.

  2. Skapa ett bedömningsskript. Observera hur mappnamnet model som du tidigare identifierade ingår i init() 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+.

  3. 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 Machine Learning.

    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.

  4. 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
    
  5. 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