Sdílet prostřednictvím


Nasazení modelů MLflow do online koncových bodů

PLATÍ PRO: Rozšíření Azure CLI ml v2 (aktuální)

V tomto článku se dozvíte, jak nasadit model MLflow do online koncového bodu pro odvozování v reálném čase. Když nasadíte model MLflow do online koncového bodu, nemusíte zadávat bodovací skript ani prostředí – tato funkce se označuje jako nasazení bez kódu.

Pro bez nasazení kódu azure Machine Learning:

  • Dynamicky instaluje balíčky Pythonu, které vypíšete do souboru conda.yaml. V důsledku toho se závislosti nainstalují během modulu runtime kontejneru.
  • Poskytuje základní image MLflow nebo kurátorované prostředí, které obsahuje následující položky:

Prerequisites

  • Předplatné služby Azure. Pokud nemáte předplatné Azure, vytvořte si bezplatný účet před zahájením.

  • Uživatelský účet, který má alespoň jednu z následujících rolí řízení přístupu na základě role v Azure (Azure RBAC):

    • Role Vlastník pro pracovní prostor Azure Machine Learning
    • Role Přispěvatel pro pracovní prostor Azure Machine Learning
    • Vlastní role s Microsoft.MachineLearningServices/workspaces/onlineEndpoints/* oprávněními

    Další informace najdete v tématu Správa přístupu k pracovním prostorům Azure Machine Learning.

  • Přístup ke službě Azure Machine Learning:

    Nainstalujte Azure CLI a ml rozšíření do Azure CLI. Postup instalace najdete v tématu Instalace a nastavení rozhraní příkazového řádku (v2).

O příkladu

Příklad v tomto článku ukazuje, jak nasadit model MLflow do online koncového bodu pro provádění predikcí. V příkladu se používá model MLflow založený na datové sadě Diabetes. Tato datová sada obsahuje 10 základních proměnných: věk, pohlaví, index tělesné hmotnosti, průměrný krevní tlak a 6 měření krevního séru získané od 442 pacientů s cukrovkou. Obsahuje také odezvu zájmu, kvantitativní míru progrese onemocnění o jeden rok po datu základních dat.

Model byl natrénován pomocí regresoru scikit-learn . Veškerý požadovaný předzpracování je zabalený jako kanál, takže tento model je kompletní kanál, který přechází z nezpracovaných dat na predikce.

Informace v tomto článku jsou založené na ukázkách kódu z úložiště příkladů azureml . Pokud naklonujete úložiště, můžete příkazy v tomto článku spustit místně, aniž byste museli kopírovat nebo vkládat soubory YAML a další soubory. Pomocí následujících příkazů naklonujte úložiště a přejděte do složky pro váš kódovací jazyk:

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

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

Pokud chcete postupovat podle kroků v tomto článku, podívejte se na poznámkový blok Nasazení modelu MLflow do online koncových bodů v úložišti příkladů.

Připojení k pracovnímu prostoru

Připojte se k pracovnímu prostoru Azure Machine Learning:

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

Registrace modelu

Do online koncových bodů můžete nasadit jenom registrované modely. Kroky v tomto článku používají model, který je natrénovaný pro datovou sadu Diabetes. V takovém případě už máte v naklonovaném úložišti místní kopii modelu, takže model musíte publikovat jenom do registru v pracovním prostoru. Tento krok můžete přeskočit, pokud už je model, který chcete nasadit, zaregistrovaný.

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

Co když se váš model zaprotokoloval do spuštění?

Pokud byl váš model přihlášený do spuštění, můžete ho zaregistrovat přímo.

Pokud chcete model zaregistrovat, potřebujete znát jeho umístění úložiště:

  • Pokud používáte funkci MLflow autolog , cesta k modelu závisí na typu modelu a rozhraní. Zkontrolujte výstup úlohy a identifikujte název složky modelu. Tato složka obsahuje soubor s názvem MLModel.
  • Pokud metodu log_model použijete k ručnímu protokolování modelů, předáte mu cestu jako argument této metody. Pokud například použijete mlflow.sklearn.log_model(my_model, "classifier") k protokolování modelu, je cesta, classifier na které je model uložený.

Pomocí azure Machine Learning CLI v2 můžete vytvořit model z výstupu trénovací úlohy. Následující kód používá artefakty úlohy s ID $RUN_ID k registraci modelu s názvem $MODEL_NAME. $MODEL_PATH je cesta, kterou úloha používá k uložení modelu.

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

Nasazení modelu MLflow do online koncového bodu

  1. Pomocí následujícího kódu nakonfigurujte režim názvu a ověřování koncového bodu, do kterého chcete model nasadit:

    Nastavte název koncového bodu spuštěním následujícího příkazu. Nejprve nahraďte YOUR_ENDPOINT_NAME jedinečným názvem.

    export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"
    

    Pokud chcete nakonfigurovat koncový bod, vytvořte soubor YAML s názvem create-endpoint.yaml, který obsahuje následující řádky:

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
    name: my-endpoint
    auth_mode: key
    
  2. Vytvořte koncový bod:

    az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/ncd/create-endpoint.yaml
    
  3. Nakonfigurujte nasazení. Nasazení je sada prostředků vyžadovaných pro hostování modelu, který provádí skutečné inferování.

    Vytvořte soubor YAML s názvem sklearn-deployment.yaml, který obsahuje následující řádky:

    $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
    

    Note

    Automatické generování scoring_script a environment je podporováno pouze pro variantu modelu PyFunc. Pokud chcete použít jinou variantu modelu, přečtěte si téma Přizpůsobení nasazení modelu MLflow.

  4. Vytvořte nasazení:

    az ml online-deployment create --name sklearn-deployment --endpoint $ENDPOINT_NAME -f endpoints/online/ncd/sklearn-deployment.yaml --all-traffic
    
    az ml online-deployment create --name sklearn-deployment --endpoint $ENDPOINT_NAME -f endpoints/online/ncd/sklearn-deployment.yaml --all-traffic
    
  5. Přiřaďte veškerý síťový provoz k nasazení. Zatím má koncový bod jedno nasazení, ale žádný z jeho provozu se k němu neřadí.

    Tento krok se v Azure CLI nevyžaduje, pokud během vytváření použijete --all-traffic příznak. Pokud potřebujete změnit provoz, můžete použít az ml online-endpoint update --traffic příkaz. Další informace o tom, jak aktualizovat provoz, naleznete v tématu Progresivní aktualizace provozu.

  6. Aktualizujte konfiguraci koncového bodu:

    Tento krok se v Azure CLI nevyžaduje, pokud během vytváření použijete --all-traffic příznak. Pokud potřebujete změnit provoz, můžete použít az ml online-endpoint update --traffic příkaz. Další informace o tom, jak aktualizovat provoz, naleznete v tématu Progresivní aktualizace provozu.

Vyvolání koncového bodu

Jakmile je nasazení připravené, můžete ho použít k vyřizování požadavků. Jedním ze způsobů, jak nasazení otestovat, je použití integrované funkce vyvolání v klientovi nasazení. V úložišti příkladů soubor sample-request-sklearn.json obsahuje následující kód JSON. Můžete ho použít jako ukázkový soubor požadavku pro nasazení.

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

Note

Tento soubor používá klíč input_data místo inputs, který používá služba MLflow. Azure Machine Learning vyžaduje jiný vstupní formát, aby mohly být automaticky vygenerovány kontrakty Swagger pro koncové body. Další informace o očekávaných formátech vstupu najdete v tématu Nasazení integrovaného serveru MLflow vs. nasazení na serveru odvozování ve službě Azure Machine Learning.

Odešlete žádost do koncového bodu:

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

Odpověď by měla být podobná následujícímu textu:

[ 
  11633.100167144921,
  8522.117402884991
]

Important

U MLflow bez nasazení kódu se v současné době nepodporuje testování prostřednictvím místních koncových bodů .

Přizpůsobení nasazení modelů MLflow

V definici nasazení modelu MLflow do online koncového bodu nemusíte zadávat bodovací skript. Pokud ale chcete přizpůsobit proces odvozování, můžete zadat bodovací skript.

Nasazení modelu MLflow obvykle chcete přizpůsobit v následujících případech:

  • Model nemá příchuť PyFunc .
  • Musíte přizpůsobit způsob, jakým model spouštíte. Například musíte použít mlflow.<flavor>.load_model() ke načtení modelu s konkrétní variantou.
  • V rutině bodování je potřeba provést předběžné zpracování nebo následné zpracování, protože model toto zpracování neprovádí.
  • Výstup modelu nemůže být pěkně reprezentován v tabulkových datech. Výstup je například tensor, který představuje obrázek.

Important

Pokud zadáte bodovací skript pro nasazení modelu MLflow, musíte také určit prostředí, ve kterém se nasazení spouští.

Nasazení vlastního hodnoticího skriptu

Pokud chcete nasadit model MLflow, který používá vlastní bodovací skript, proveďte kroky v následujících částech.

Identifikace složky modelu

Pomocí následujících kroků identifikujte složku, která obsahuje váš model MLflow:

  1. Přejděte na studio Azure Machine Learning.

  2. Přejděte do části Modely .

  3. Vyberte model, který chcete nasadit, a přejděte na kartu Artefakty .

  4. Poznamenejte si zobrazenou složku. Při registraci modelu zadáte tuto složku.

    Snímek obrazovky znázorňující složku, která obsahuje artefakty modelu

Vytvoření hodnoticího skriptu

Následující bodovací skript, score.py, poskytuje příklad, jak provádět odvozování pomocí modelu MLflow. Tento skript můžete přizpůsobit vašim potřebám nebo změnit libovolnou jeho část tak, aby odrážel váš scénář. Všimněte si, že název složky, kterou jste dříve identifikovali, modelje součástí init() funkce.

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

Warning

Poradce pro MLflow 2.0: Ukázkový skript bodování funguje s MLflow 1.X a MLflow 2.X. Očekávané vstupní a výstupní formáty v těchto verzích se ale mohou lišit. Zkontrolujte definici prostředí a zjistěte, jakou verzi MLflow používáte. MLflow 2.0 se podporuje jenom v Pythonu 3.8 a novějších verzích.

Vytvoření prostředí

Dalším krokem je vytvoření prostředí, ve které můžete spustit bodovací skript. Vzhledem k tomu, že model je model MLflow, jsou požadavky na conda také specifikovány v balíčku modelu. Další informace o souborech zahrnutých v modelu MLflow naleznete v tématu Formát MLmodel. Prostředí sestavíte pomocí závislostí conda ze souboru. Musíte ale také zahrnout azureml-inference-server-http balíček, který je nutný pro online nasazení ve službě Azure Machine Learning.

Můžete vytvořit definiční soubor conda s názvem conda.yaml, který obsahuje následující řádky:

channels:
- conda-forge
dependencies:
- python=3.12
- pip
- pip:
  - mlflow
  - scikit-learn==1.7.0
  - cloudpickle==3.1.1
  - psutil==7.0.0
  - pandas==2.3.0
  - azureml-inference-server-http
name: mlflow-env

Note

Část dependencies tohoto souboru conda obsahuje azureml-inference-server-http balíček.

K vytvoření prostředí použijte tento soubor závislostí conda:

Prostředí se vytvoří přímo v konfiguraci nasazení.

Vytvořte nasazení

Ve složce koncových bodů/online/ncd vytvořte konfigurační soubor nasazení deployment.yml, který obsahuje následující řádky:

$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

Vytvořte nasazení:

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

Obsluha požadavků

Po dokončení nasazení je připravená obsluhovat žádosti. Jedním ze způsobů, jak otestovat nasazení, je použít invoke metodu s ukázkovým souborem požadavku, jako je například následující soubor, 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]
  }}

Odešlete žádost do koncového bodu:

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

Odpověď by měla být podobná následujícímu textu:

{
    "predictions": [ 
    1095.2797413413252,
    1134.585328803727
    ]
}

Warning

Poradce pro MLflow 2.0: V MLflow 1.X odpověď neobsahuje predictions klíč.

Vyčistěte zdroje

Pokud už koncový bod nepotřebujete, odstraňte jeho přidružené prostředky:

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