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 conda.yaml poskytnuté v souboru. Proto se závislosti nainstalují během modulu runtime kontejneru.
  • Poskytuje základní image nebo kurátorované prostředí MLflow, které obsahuje následující položky:

Tip

Pracovní prostory bez přístupu k veřejné síti: Než budete moct modely MLflow nasadit do online koncových bodů bez výchozího připojení, musíte modely zabalit (Preview). Pomocí balení modelů se můžete vyhnout nutnosti připojení k internetu, které by jinak služba Azure Machine Learning vyžadovala dynamicky instalovat nezbytné balíčky Pythonu pro modely MLflow.

O příkladu

Příklad ukazuje, jak můžete 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 šest měření krevního séru získané od 442 pacientů s cukrovkou. Obsahuje také odezvu zájmu, kvantitativní míru progrese onemocnění jeden rok po základní hodnotě.

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

Informace v tomto článku vycházejí 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, naklonujte úložiště a pak změňte adresáře na cli, pokud používáte Azure CLI. Pokud používáte sadu Azure Machine Learning SDK pro Python, změňte adresáře na sdk/python/endpoints/online/mlflow.

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

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

Postup použití sady Azure Machine Learning Python SDK můžete provést otevřením modelu Nasazení MLflow do poznámkového bloku online koncových bodů v naklonovaném úložišti.

Požadavky

Než budete postupovat podle kroků v tomto článku, ujistěte se, že máte následující 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.

  • Řízení přístupu na základě role v Azure (Azure RBAC) slouží k udělení přístupu k operacím ve službě Azure Machine Learning. Pokud chcete provést kroky v tomto článku, musí mít váš uživatelský účet přiřazenou roli vlastníka nebo přispěvatele pro pracovní prostor Služby Azure Machine Learning nebo vlastní roli, která povoluje Microsoft.MachineLearningServices/workspaces/onlineEndpoints/*. Další informace o rolích najdete v tématu Správa přístupu k pracovnímu prostoru Azure Machine Learning.

  • V pracovním prostoru musíte mít zaregistrovaný model MLflow. Tento článek zaregistruje model natrénovaný pro datovou sadu Diabetes v pracovním prostoru.

  • Potřebujete také:


Připojení k pracovnímu prostoru

Nejprve se připojte k pracovnímu prostoru Azure Machine Learning, kde budete pracovat.

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

Registrace modelu

Do online koncových bodů můžete nasadit jenom registrované modely. 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='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 uvnitř spuštění?

Pokud se váš model zaprotokoloval uvnitř spuštění, můžete ho zaregistrovat přímo.

Pokud chcete model zaregistrovat, potřebujete znát umístění, kde je uložený. Pokud používáte funkci MLflow autolog , cesta k modelu závisí na typu modelu a rozhraní. Měli byste zkontrolovat výstup úloh a identifikovat název složky modelu. Tato složka obsahuje soubor s názvem MLModel.

Pokud metodu log_model používáte k ručnímu protokolování modelů, předejte cestu k modelu jako argument metodě. Pokud například zapíšete model pomocí mlflow.sklearn.log_model(my_model, "classifier"), pak cesta, kde je model uložen, je volána classifier.

Pomocí azure Machine Learning CLI v2 vytvořte model z výstupu trénovací úlohy. V následujícím příkladu je pojmenovaný $MODEL_NAME model registrován pomocí artefaktů úlohy s ID $RUN_ID. Cesta, ve které je model uložen, je $MODEL_PATH.

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

Poznámka:

Cesta $MODEL_PATH je umístění, ve kterém byl model uložen ve spuštění.

Nasazení modelu MLflow do online koncového bodu

  1. Nakonfigurujte koncový bod, ve kterém se model nasadí. Následující příklad nakonfiguruje režim názvu a ověřování koncového bodu:

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

    export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"
    

    Konfigurace koncového bodu:

    create-endpoint.yaml

    $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é odvozování.

    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: 2
      path: sklearn-diabetes/model
      type: mlflow_model
    instance_type: Standard_DS3_v2
    instance_count: 1
    

    Poznámka:

    Automatické generování scoring_script modelu a environment podporuje se pouze pro pyfunc variantu modelu. 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
    

    Pokud váš koncový bod nemá výchozí připojení, použijte balení modelů (Preview) zahrnutím příznaku --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. Přiřaďte veškerý provoz k nasazení. Zatím má koncový bod jedno nasazení, ale žádný z jeho provozu se k němu neřadí.

    Tento krok není vyžadován v Azure CLI, protože jste příznak použili --all-traffic při vytváření. Pokud potřebujete změnit provoz, můžete použít příkaz az ml online-endpoint update --traffic. Další informace o tom, jak aktualizovat provoz, naleznete v tématu Progresivní aktualizace provozu.

  6. Aktualizujte konfiguraci koncového bodu:

    Tento krok není vyžadován v Azure CLI, protože jste příznak použili --all-traffic při vytváření. Pokud potřebujete změnit provoz, můžete použít příkaz az ml online-endpoint update --traffic. 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 odeslání žádosti. Jedním ze způsobů, jak otestovat nasazení, je použití integrované funkce vyvolání v klientovi nasazení, který používáte. Následující JSON je ukázkový požadavek na nasazení.

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

Poznámka:

input_data se používá v tomto příkladu místo inputs toho, že se používá v obsluhě MLflow. Důvodem je to, že Azure Machine Learning vyžaduje, aby bylo možné automaticky generovat kontrakty swaggeru pro koncové body v jiném vstupním formátu. Další informace o očekávaných vstupních formátech najdete v tématu Rozdíly mezi modely nasazenými ve službě Azure Machine Learning a integrovaným serverem MLflow.

Odešlete do koncového bodu žádost následujícím způsobem:

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

Odpověď bude podobná následujícímu textu:

[ 
  11633.100167144921,
  8522.117402884991
]

Přizpůsobení nasazení modelů MLflow

V definici nasazení modelu MLflow do online koncového bodu nemusíte zadávat bodovací skript. Můžete se ale rozhodnout, jak se má odvozovat, a přizpůsobit způsob, jakým se odvozuje.

Nasazení modelu MLflow obvykle budete chtít přizpůsobit, když:

  • Model na něm nemá příchuť PyFunc .
  • Musíte přizpůsobit způsob spuštění modelu, například použít konkrétní příchuť pro načtení modelu pomocí mlflow.<flavor>.load_model().
  • V rutině bodování je potřeba provést předběžné zpracování nebo zpracování, pokud to samotný model neprovádí.
  • Výstup modelu nemůže být pěkně reprezentován v tabulkových datech. Jedná se například o tenzor představující obrázek.

Důležité

Pokud se rozhodnete zadat bodovací skript pro nasazení modelu MLflow, budete také muset určit prostředí, ve kterém se nasazení spustí.

Kroky

Nasazení modelu MLflow pomocí vlastního hodnoticího skriptu:

  1. Určete složku, ve které se nachází váš model MLflow.

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

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

    c. Vyberte model, který se pokoušíte nasadit, a přejděte na kartu Artefakty .

    d. Poznamenejte si zobrazenou složku. Tato složka byla zadána při registraci modelu.

    Snímek obrazovky se složkou, ve které jsou umístěné artefakty modelu

  2. Vytvořte bodovací skript. Všimněte si, že název model složky, který jste dříve identifikovali, je součástí init() funkce.

    Tip

    Následující bodovací skript je k dispozici jako příklad, jak provést 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ář.

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

    Upozorňující

    Poradce pro MLflow 2.0: Zadaný skript bodování bude fungovat s MLflow 1.X i MLflow 2.X. Doporučujeme však, aby se očekávané formáty vstupu a výstupu v těchto verzích mohly lišit. Zkontrolujte definici prostředí, která se používá, abyste měli jistotu, že používáte očekávanou verzi MLflow. Všimněte si, že MLflow 2.0 se podporuje jenom v Pythonu 3.8 nebo novějším.

  3. Vytvořte prostředí, ve kterém lze spustit bodovací skript. Vzhledem k tomu, že se jedná o model MLflow, jsou požadavky na conda také specifikovány v balíčku modelu. Další podrobnosti o souborech zahrnutých v modelu MLflow naleznete ve formátu MLmodel. Pak vytvoříte prostředí pomocí závislostí conda ze souboru. Musíte ale také zahrnout balíček azureml-inference-server-http, který je nutný pro online nasazení ve službě Azure Machine Learning.

    Definiční soubor conda je následující:

    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
    

    Poznámka:

    Balíček azureml-inference-server-http byl přidán do původního souboru závislostí conda.

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

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

  4. Vytvořte nasazení:

    Vytvořte konfigurační soubor nasazení 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
    

    Vytvořte nasazení:

    az ml online-deployment create -f deployment.yml
    
  5. Jakmile se nasazení dokončí, je připravené obsluhovat žádosti. Jedním ze způsobů, jak otestovat nasazení, je použití ukázkového souboru požadavku spolu s metodou invoke .

    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 do koncového bodu žádost následujícím způsobem:

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

    Odpověď bude podobná následujícímu textu:

    {
      "predictions": [ 
        11633.100167144921,
        8522.117402884991
      ]
    }
    

    Upozorňující

    Poradce pro MLflow 2.0: V MLflow 1.X predictions chybí klíč.

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

Po dokončení používání koncového bodu odstraňte přidružené prostředky:

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