Delen via


Uitvoer in batchimplementaties aanpassen

VAN TOEPASSING OP:Azure CLI ml extension v2 (current)Python SDK azure-ai-ml v2 (current)

In deze handleiding wordt uitgelegd hoe u implementaties maakt waarmee aangepaste uitvoer en bestanden worden gegenereerd. Soms hebt u meer controle over wat is geschreven als uitvoer van batchdeductietaken. Deze gevallen omvatten de volgende situaties:

  • U moet bepalen hoe voorspellingen in de uitvoer worden geschreven. U wilt bijvoorbeeld de voorspelling toevoegen aan de oorspronkelijke gegevens als de gegevens in tabelvorm zijn.
  • U moet uw voorspellingen schrijven in een andere bestandsindeling dan de bestandsindeling die standaard wordt ondersteund door batchimplementaties.
  • Uw model is een generatief model dat de uitvoer niet in tabelvorm kan schrijven. Modellen die bijvoorbeeld afbeeldingen produceren als uitvoer.
  • Uw model produceert meerdere tabellaire bestanden in plaats van één bestand. Bijvoorbeeld modellen die prognoses uitvoeren door meerdere scenario's te overwegen.

Met Batch-implementaties kunt u de controle over de uitvoer van de taken overnemen door u rechtstreeks naar de uitvoer van de batch-implementatietaak te laten schrijven. In deze zelfstudie leert u hoe u een model implementeert om batchdeductie uit te voeren en de uitvoer in parquet-indeling te schrijven door de voorspellingen toe te voegen aan de oorspronkelijke invoergegevens.

Over dit voorbeeld

In dit voorbeeld ziet u hoe u een model kunt implementeren om batchdeductie uit te voeren en hoe uw voorspellingen in de uitvoer worden geschreven. Het model is gebaseerd op de UCI Heart Disease-gegevensset. De database bevat 76 kenmerken, maar in dit voorbeeld wordt een subset van 14 kenmerken gebruikt. Het model probeert de aanwezigheid van hart- en vaatziekten bij een patiënt te voorspellen. Het is een geheel getal van 0 (geen aanwezigheid) tot 1 (aanwezigheid).

Het model is getraind met behulp van een XGBBoost classificatie en alle vereiste voorverwerking is verpakt als pijplijn scikit-learn , waardoor dit model een end-to-end-pijplijn is die van onbewerkte gegevens naar voorspellingen gaat.

Het voorbeeld in dit artikel is gebaseerd op codevoorbeelden in de opslagplaats azureml-examples . Als u de opdrachten lokaal wilt uitvoeren zonder YAML en andere bestanden te hoeven kopiëren/plakken, kloont u eerst de opslagplaats en wijzigt u vervolgens mappen in de map:

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

De bestanden voor dit voorbeeld bevinden zich in:

cd endpoints/batch/deploy-models/custom-outputs-parquet

Volgen in een Jupyter-notebook

Er is een Jupyter-notebook waarmee u dit voorbeeld kunt volgen. Open in de gekloonde opslagplaats het notebook met de naam custom-output-batch.ipynb.

Vereisten

  • Een Azure-abonnement. Als u nog geen abonnement op Azure hebt, maak dan een gratis account aan voordat u begint. Probeer de gratis of betaalde versie van Azure Machine Learning.

  • Een Azure Machine Learning-werkruimte. Zie Azure Machine Learning-werkruimten beheren om een werkruimte te maken.

  • Zorg ervoor dat u de volgende machtigingen hebt in de Machine Learning-werkruimte:

    • Batch-eindpunten en -implementaties maken of beheren: gebruik een eigenaar, inzender of aangepaste rol die dit toestaat Microsoft.MachineLearningServices/workspaces/batchEndpoints/*.
    • Azure Resource Manager-implementaties maken in de werkruimteresourcegroep: gebruik een eigenaar, inzender of aangepaste rol waarmee de resourcegroep waarin de werkruimte is geïmplementeerd, is toegestaan Microsoft.Resources/deployments/write .
  • Installeer de volgende software om te werken met Machine Learning:

    Voer de volgende opdracht uit om de Azure CLI en de ml extensie voor Azure Machine Learning te installeren:

    az extension add -n ml
    

    Implementaties van pijplijnonderdelen voor Batch-eindpunten worden geïntroduceerd in versie 2.7 van de ml extensie voor de Azure CLI. Gebruik de az extension update --name ml opdracht om de nieuwste versie op te halen.


Verbinding maken met uw werkruimte

De werkruimte is de resource op het hoogste niveau voor Machine Learning. Het biedt een centrale plek om te werken met alle artefacten die u maakt wanneer u Machine Learning gebruikt. In deze sectie maakt u verbinding met de werkruimte waar u uw implementatietaken uitvoert.

Voer in de volgende opdracht de waarden in voor uw abonnements-id, werkruimte, locatie en resourcegroep:

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

Een batchimplementatie maken met een aangepaste uitvoer

In dit voorbeeld maakt u een implementatie die rechtstreeks naar de uitvoermap van de batch-implementatietaak kan schrijven. De implementatie gebruikt deze functie om aangepaste Parquet-bestanden te schrijven.

Het model registreren

U kunt geregistreerde modellen alleen implementeren met behulp van een batch-eindpunt. In dit geval hebt u al een lokale kopie van het model in de 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 probeert te implementeren al is geregistreerd.

MODEL_NAME='heart-classifier-sklpipe'
az ml model create --name $MODEL_NAME --type "custom_model" --path "model"

Een scorescript maken

U moet een scorescript maken waarmee de invoergegevens van de batchimplementatie kunnen worden gelezen en de scores van het model kunnen worden geretourneerd. U gaat ook rechtstreeks naar de uitvoermap van de taak schrijven. Kortom, het voorgestelde scorescript doet het volgende:

  1. Leest de invoergegevens als CSV-bestanden.
  2. Voert een MLflow-modelfunctie predict uit op de invoergegevens.
  3. Voegt de voorspellingen toe aan een pandas.DataFrame samen met de invoergegevens.
  4. Hiermee schrijft u de gegevens in een bestand met de naam het invoerbestand, maar in parquet indeling.

code/batch_driver.py

import os
import pickle
import glob
import pandas as pd
from pathlib import Path
from typing import List


def init():
    global model
    global output_path

    # 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:
    output_path = os.environ["AZUREML_BI_OUTPUT_PATH"]
    model_path = os.environ["AZUREML_MODEL_DIR"]
    model_file = glob.glob(f"{model_path}/*/*.pkl")[-1]

    with open(model_file, "rb") as file:
        model = pickle.load(file)


def run(mini_batch: List[str]):
    for file_path in mini_batch:
        data = pd.read_csv(file_path)
        pred = model.predict(data)

        data["prediction"] = pred

        output_file_name = Path(file_path).stem
        output_file_path = os.path.join(output_path, output_file_name + ".parquet")
        data.to_parquet(output_file_path)

    return mini_batch

Opmerkingen:

  • U ziet hoe de omgevingsvariabele AZUREML_BI_OUTPUT_PATH wordt gebruikt om toegang te krijgen tot het uitvoerpad van de implementatietaak.
  • De init() functie vult een globale variabele output_path in die later kan worden gebruikt om te weten waar u moet schrijven.
  • De run methode retourneert een lijst met de verwerkte bestanden. Het is vereist dat de run functie een list of een pandas.DataFrame object retourneert.

Waarschuwing

Houd er rekening mee dat alle batchexecutors tegelijkertijd schrijftoegang tot dit pad hebben. Dit betekent dat u rekening moet houden met gelijktijdigheid. Zorg er in dit geval voor dat elke uitvoerder een eigen bestand schrijft met behulp van de naam van het invoerbestand als de naam van de uitvoermap.

Het eindpunt maken

U maakt nu een batch-eindpunt met de naam heart-classifier-batch waar het model is geïmplementeerd.

  1. Bepaal de naam van het eindpunt. De naam van het eindpunt wordt weergegeven in de URI die is gekoppeld aan uw eindpunt, zodat namen van batcheindpunten uniek moeten zijn binnen een Azure-regio. Er kan bijvoorbeeld slechts één batcheindpunt zijn met de naam mybatchendpoint in westus2.

    In dit geval plaatst u de naam van het eindpunt in een variabele, zodat u er later eenvoudig naar kunt verwijzen.

    ENDPOINT_NAME="heart-classifier-custom"
    
  2. Configureer uw batch-eindpunt.

    Het volgende YAML-bestand definieert een batch-eindpunt:

    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
    
  3. Maak het eindpunt:

    az ml batch-endpoint create -n $ENDPOINT_NAME -f endpoint.yml
    

De implementatie maken

Volg de volgende stappen om een implementatie te maken met behulp van het vorige scorescript:

  1. Maak eerst een omgeving waarin het scorescript kan worden uitgevoerd:

    Er is geen extra stap vereist voor de Azure Machine Learning CLI. De omgevingsdefinitie is opgenomen in het implementatiebestand.

    environment:
      name: batch-mlflow-xgboost
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
      conda_file: environment/conda.yaml
    
  2. Maak de implementatie. U ziet dat output_action nu is ingesteld op SUMMARY_ONLY.

    Notitie

    In dit voorbeeld wordt ervan uitgegaan dat u een rekencluster met de naam batch-clusterhebt. Wijzig die naam dienovereenkomstig.

    Als u een nieuwe implementatie wilt maken onder het gemaakte eindpunt, maakt u een YAML-configuratie zoals hieronder. U kunt het YAML-schema voor het volledige batcheindpunt controleren op extra eigenschappen.

    $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 and Scikit-Learn pipelines that append predictions on parquet files.
    type: model
    model: azureml:heart-classifier-sklpipe@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: summary_only
      retry_settings:
        max_retries: 3
        timeout: 300
      error_threshold: -1
      logging_level: info
    

    Maak vervolgens de implementatie met de volgende opdracht:

    az ml batch-deployment create --file deployment.yml --endpoint-name $ENDPOINT_NAME --set-default
    
  3. Op dit moment is ons batcheindpunt gereed om te worden gebruikt.

De implementatie testen

Als u uw eindpunt wilt testen, gebruikt u een voorbeeld van niet-gelabelde gegevens in deze opslagplaats, die met het model kunnen worden gebruikt. Batch-eindpunten kunnen alleen gegevens verwerken die zich in de cloud bevinden en toegankelijk zijn vanuit de Azure Machine Learning-werkruimte. In dit voorbeeld uploadt u deze naar een Azure Machine Learning-gegevensarchief. U gaat een gegevensasset maken die kan worden gebruikt om het eindpunt aan te roepen voor scoren. U ziet echter dat batcheindpunten gegevens accepteren die op meerdere typen locaties kunnen worden geplaatst.

  1. Roep het eindpunt aan met gegevens uit een opslagaccount:

    JOB_NAME = $(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input https://azuremlexampledata.blob.core.windows.net/data/heart-disease-uci/data --query name -o tsv)
    

    Notitie

    Het hulpprogramma jq is mogelijk niet geïnstalleerd bij elke installatie. U kunt instructies op GitHub krijgen.

  2. Er wordt een batchtaak gestart zodra de opdracht wordt geretourneerd. U kunt de status van de taak controleren totdat deze is voltooid:

    az ml job show -n $JOB_NAME --web
    

De uitvoer analyseren

De taak genereert een benoemde uitvoer die wordt aangeroepen score waar alle gegenereerde bestanden worden geplaatst. Omdat u rechtstreeks in de map hebt geschreven, één bestand per invoerbestand, kunt u verwachten dat u hetzelfde aantal bestanden hebt. Geef in dit specifieke voorbeeld de uitvoerbestanden dezelfde naam als de invoer, maar ze hebben een Parquet-extensie.

Notitie

U ziet dat een bestand predictions.csv ook is opgenomen in de uitvoermap. Dit bestand bevat de samenvatting van de verwerkte bestanden.

U kunt de resultaten van de taak downloaden met behulp van de taaknaam:

Gebruik de volgende opdracht om de voorspellingen te downloaden:

az ml job download --name $JOB_NAME --output-name score --download-path ./

Zodra het bestand is gedownload, kunt u het openen met uw favoriete hulpprogramma. In het volgende voorbeeld worden de voorspellingen geladen met behulp van Pandas dataframe.

import pandas as pd
import glob

output_files = glob.glob("named-outputs/score/*.parquet")
score = pd.concat((pd.read_parquet(f) for f in output_files))
score

De uitvoer ziet er als volgt uit:

leeftijd geslacht ... thal voorspelling
63 1 ... vast 0
67 1 ... normaal 1
67 1 ... omkeerbaar 0
37 1 ... normaal 0

Resources opschonen

Voer de volgende code uit om het batch-eindpunt en alle onderliggende implementaties te verwijderen. Batchscoretaken worden niet verwijderd.

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