Přizpůsobení výstupů v dávkových nasazeních

PLATÍ PRO:Rozšíření Azure CLI ml v2 (aktuální)Python SDK azure-ai-ml v2 (aktuální)

Tato příručka vysvětluje, jak vytvořit nasazení, která generují vlastní výstupy a soubory. Někdy potřebujete větší kontrolu nad tím, co se zapisuje jako výstup z dávkových úloh odvozovat. Mezi tyto případy patří následující situace:

  • Potřebujete řídit, jak se predikce zapisují ve výstupu. Pokud jsou například data tabulková, chcete k původním datům připojit předpověď.
  • Predikce musíte zapsat v jiném formátu souboru, než je to, které podporuje dávkové nasazení.
  • Váš model je generativní model, který nemůže napsat výstup v tabulkovém formátu. Například modely, které vytvářejí obrázky jako výstupy.
  • Váš model vytváří více tabulkových souborů místo jednoho souboru. Například modely, které provádějí prognózy zvážením více scénářů.

Nasazení batch umožňují převzít kontrolu nad výstupem úloh tím, že vám umožní zapisovat přímo do výstupu úlohy dávkového nasazení. V tomto kurzu se dozvíte, jak nasadit model pro provedení dávkového odvozování a zápis výstupů ve formátu parquet připojením předpovědí k původním vstupním datům.

O této ukázce

Tento příklad ukazuje, jak můžete nasadit model pro provedení dávkového odvozování a přizpůsobení způsobu zápisu předpovědí ve výstupu. Model je založený na datové sadě UCI Heart Disease. Databáze obsahuje 76 atributů, ale tento příklad používá podmnožinu 14 z nich. Model se snaží předpovědět přítomnost onemocnění srdce u pacienta. Hodnota integer je od 0 (bez přítomnosti) na 1 (přítomnost).

Model byl vytrénován pomocí XGBBoost klasifikátoru a veškeré požadované předběžné zpracování bylo zabaleno jako scikit-learn kanál, takže tento model představuje kompletní kanál, který přechází z nezpracovaných dat na predikce.

Příklad v tomto článku vychází 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, nejprve naklonujte úložiště a pak změňte adresáře do složky:

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

Soubory pro tento příklad jsou v:

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

Sledování v poznámkovém bloku Jupyter

K tomuto příkladu můžete použít poznámkový blok Jupyter. V klonovaném úložišti otevřete poznámkový blok s názvem custom-output-batch.ipynb.

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.

  • Pracovní prostor služby Azure Machine Learning. Pokud chcete vytvořit pracovní prostor, přečtěte si téma Správa pracovních prostorů Služby Azure Machine Learning.

  • Ujistěte se, že máte v pracovním prostoru Machine Learning následující oprávnění:

    • Vytváření nebo správa dávkových koncových bodů a nasazení: Použijte roli Vlastník, Přispěvatel nebo Vlastní, která umožňuje Microsoft.MachineLearningServices/workspaces/batchEndpoints/*.
    • Vytvořte nasazení Azure Resource Manageru ve skupině prostředků pracovního prostoru: Použijte roli Vlastník, Přispěvatel nebo Vlastní, která umožňuje Microsoft.Resources/deployments/write ve skupině prostředků, ve které je pracovní prostor nasazený.
  • Nainstalujte následující software pro práci se službou Machine Learning:

    Spuštěním následujícího příkazu nainstalujte Azure CLI a ml rozšíření pro Azure Machine Learning:

    az extension add -n ml
    

    Nasazení součástí kanálu pro koncové body služby Batch se zavádí ve verzi 2.7 ml rozšíření pro Azure CLI. az extension update --name ml Pomocí příkazu získejte nejnovější verzi.


Připojení k pracovnímu prostoru

Pracovní prostor je prostředek nejvyšší úrovně pro Machine Learning. Poskytuje centralizované místo pro práci se všemi artefakty, které vytvoříte při použití služby Machine Learning. V této části se připojíte k pracovnímu prostoru, ve kterém provádíte úlohy nasazení.

V následujícím příkazu zadejte hodnoty ID předplatného, pracovního prostoru, umístění a skupiny prostředků:

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

Vytvoření dávkového nasazení s vlastním výstupem

V tomto příkladu vytvoříte nasazení, které může zapisovat přímo do výstupní složky úlohy dávkového nasazení. Nasazení používá tuto funkci k zápisu vlastních souborů parquet.

Registrace modelu

Registrované modely můžete nasadit pouze pomocí dávkového koncového bodu. 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='heart-classifier-sklpipe'
az ml model create --name $MODEL_NAME --type "custom_model" --path "model"

Vytvoření hodnoticího skriptu

Potřebujete vytvořit bodovací skript, který může číst vstupní data poskytnutá dávkovém nasazením a vracet skóre modelu. Také budete zapisovat přímo do výstupní složky úlohy. V souhrnu navrhovaný bodovací skript provede takto:

  1. Přečte vstupní data jako soubory CSV.
  2. Spustí funkci modelu predict MLflow na vstupní data.
  3. Připojí předpovědi spolu pandas.DataFrame se vstupními daty.
  4. Zapíše data do souboru pojmenovaného jako vstupní soubor, ale ve parquet formátu.

kód/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

Poznámky:

  • Všimněte si, jak se proměnná AZUREML_BI_OUTPUT_PATH prostředí používá k získání přístupu k výstupní cestě úlohy nasazení.
  • Funkce init() naplní globální proměnnou, output_path která se dá použít později, abyste věděli, kde psát.
  • Metoda run vrátí seznam zpracovaných souborů. Funkce musí run vrátit list objekt nebo pandas.DataFrame objekt.

Upozorňující

Vezměte v úvahu, že všechny dávkové exekutory mají přístup k zápisu do této cesty současně. To znamená, že potřebujete počítat s souběžností. V takovém případě zajistěte, aby každý exekutor zapisuje svůj vlastní soubor pomocí názvu vstupního souboru jako názvu výstupní složky.

Vytvoření koncového bodu

Teď vytvoříte dávkový koncový bod s názvem heart-classifier-batch , ve kterém je model nasazený.

  1. Rozhodněte se o názvu koncového bodu. Název koncového bodu se zobrazí v identifikátoru URI přidruženém k vašemu koncovému bodu, takže názvy dávkových koncových bodů musí být jedinečné v rámci oblasti Azure. Například může existovat pouze jeden dávkový koncový bod s názvem mybatchendpoint v westus2.

    V tomto případě umístěte název koncového bodu do proměnné, abyste na něj později mohli snadno odkazovat.

    ENDPOINT_NAME="heart-classifier-custom"
    
  2. Nakonfigurujte svůj dávkový koncový bod.

    Následující soubor YAML definuje dávkový koncový bod:

    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. Vytvořte koncový bod:

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

Vytvoření nasazení

Pomocí následujícího postupu vytvořte nasazení pomocí předchozího hodnoticího skriptu:

  1. Nejprve vytvořte prostředí, ve kterém se dá spustit bodovací skript:

    Rozhraní příkazového řádku služby Azure Machine Learning nevyžaduje žádný další krok. Definice prostředí je součástí souboru nasazení.

    environment:
      name: batch-mlflow-xgboost
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
      conda_file: environment/conda.yaml
    
  2. Vytvořte nasazení. Všimněte si, že output_action je nyní nastavena na SUMMARY_ONLYhodnotu .

    Poznámka:

    Tento příklad předpokládá, že máte výpočetní cluster s názvem batch-cluster. Odpovídajícím způsobem změňte tento název.

    Pokud chcete vytvořit nové nasazení v rámci vytvořeného koncového bodu, vytvořte konfiguraci YAML, jako je následující. Můžete zkontrolovat, jestli schéma YAML celého dávkového koncového bodu obsahuje další vlastnosti.

    $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
    

    Pak vytvořte nasazení pomocí následujícího příkazu:

    az ml batch-deployment create --file deployment.yml --endpoint-name $ENDPOINT_NAME --set-default
    
  3. V tuto chvíli je náš dávkový koncový bod připravený k použití.

Otestování nasazení

K otestování koncového bodu použijte ukázku neoznačeného dat umístěného v tomto úložišti, která se dají použít s modelem. Koncové body služby Batch můžou zpracovávat pouze data umístěná v cloudu a jsou přístupná z pracovního prostoru Azure Machine Learning. V tomto příkladu ho nahrajete do úložiště dat Azure Machine Learning. Vytvoříte datový asset, který můžete použít k vyvolání koncového bodu pro bodování. Všimněte si však, že dávkové koncové body přijímají data, která lze umístit do více typů umístění.

  1. Vyvolání koncového bodu s daty z účtu úložiště:

    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)
    

    Poznámka:

    jq Nástroj nemusí být nainstalován v každé instalaci. Pokyny najdete na GitHubu.

  2. Dávková úloha se spustí hned po vrácení příkazu. Stav úlohy můžete monitorovat, dokud se nedokončí:

    az ml job show -n $JOB_NAME --web
    

Analýza výstupů

Úloha vygeneruje pojmenovaný výstup, který se nazývá score umístění všech vygenerovaných souborů. Vzhledem k tomu, že jste do adresáře napsali přímo, jeden soubor na každý vstupní soubor, můžete očekávat, že bude mít stejný počet souborů. V tomto konkrétním příkladu pojmenujte výstupní soubory stejně jako vstupy, ale mají příponu parquet.

Poznámka:

Všimněte si, že výstupní složka obsahuje také soubor predictions.csv . Tento soubor obsahuje souhrn zpracovaných souborů.

Výsledky úlohy si můžete stáhnout pomocí názvu úlohy:

K stažení předpovědí použijte následující příkaz:

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

Jakmile se soubor stáhne, můžete ho otevřít pomocí oblíbeného nástroje. Následující příklad načte předpovědi pomocí Pandas datového rámce.

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

Výstup vypadá takto:

stáří Sex ... thal předpověď
63 0 ... stabilní 0
67 0 ... normální 0
67 0 ... vratný 0
37 0 ... normální 0

Vyčištění prostředků

Spuštěním následujícího kódu odstraňte koncový bod dávky a všechna podkladová nasazení. Úlohy dávkového vyhodnocování se neodstraní.

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