Udostępnij za pomocą


Wdrażanie modeli MLflow w punktach końcowych online

DOTYCZY: Rozszerzenie interfejsu wiersza polecenia platformy Azure ml w wersji 2 (bieżąca)

W tym artykule przedstawiono sposób wdrażania modelu MLflow w punkcie końcowym online na potrzeby wnioskowania w czasie rzeczywistym. Podczas wdrażania modelu MLflow w punkcie końcowym online nie trzeba określać skryptu oceniania ani środowiska — ta funkcja jest znana jako wdrożenie bez kodu.

W przypadku wdrożenia bez kodu usługa Azure Machine Learning:

  • Dynamicznie instaluje pakiety języka Python, które wymieniasz w pliku conda.yaml. W związku z tym zależności są instalowane podczas wykonywania kontenera.
  • Udostępnia obraz podstawowy MLflow lub wyselekcjonowane środowisko zawierające następujące elementy:

Prerequisites

  • Subskrypcja platformy Azure. Jeśli nie masz subskrypcji Azure, przed rozpoczęciem utwórz darmowe konto.

  • Konto użytkownika, które ma co najmniej jedną z następujących ról kontroli dostępu na podstawie ról (RBAC) platformy Azure:

    • Rola właściciela obszaru roboczego usługi Azure Machine Learning
    • Rola Współautor dla obszaru roboczego usługi Azure Machine Learning
    • Rola niestandardowa, która ma Microsoft.MachineLearningServices/workspaces/onlineEndpoints/* uprawnienia

    Aby uzyskać więcej informacji, zobacz Zarządzanie dostępem do obszarów roboczych usługi Azure Machine Learning.

  • Dostęp do usługi Azure Machine Learning:

    Zainstaluj interfejs wiersza polecenia platformy Azure i ml rozszerzenie do interfejsu wiersza polecenia platformy Azure. Aby uzyskać instrukcje instalacji, zobacz Instalowanie i konfigurowanie interfejsu wiersza polecenia (wersja 2).

Informacje o przykładzie

W przykładzie w tym artykule pokazano, jak wdrożyć model MLflow w punkcie końcowym online w celu wykonania przewidywań. W przykładzie użyto modelu MLflow opartego na zestawie danych Diabetes. Ten zestaw danych zawiera 10 zmiennych bazowych: wiek, płeć, wskaźnik masy ciała, średnie ciśnienie krwi i 6 pomiarów krwi uzyskanych od 442 pacjentów z cukrzycą. Zawiera również odpowiedź na zainteresowanie, ilościową miarę progresji choroby jeden rok po dacie danych odniesienia.

Model został wytrenowany przy użyciu scikit-learn regresora. Wszystkie wymagane kroki wstępnego przetwarzania są pakowane jako potok, więc ten model jest kompleksowym potokiem, przechodząc od nieprzetworzonych danych do przewidywań.

Informacje przedstawione w tym artykule są oparte na przykładach kodu z repozytorium azureml-examples . Jeśli sklonujesz repozytorium, możesz uruchomić polecenia w tym artykule lokalnie bez konieczności kopiowania lub wklejania plików YAML i innych plików. Użyj następujących poleceń, aby sklonować repozytorium i przejść do folderu dla języka kodowania:

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

Śledź w Jupyter Notebook.

Aby wykonać kroki opisane w tym artykule, zobacz notatnik Wdrażanie modelu MLflow do punktów końcowych online w repozytorium przykładów.

Połącz się z Twoim obszarem roboczym

Połącz się z obszarem roboczym usługi Azure Machine Learning:

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

Rejestrowanie modelu

Zarejestrowane modele można wdrażać tylko w punktach końcowych online. W krokach opisanych w tym artykule użyto modelu, który został wytrenowany dla zestawu danych Diabetes. W takim przypadku masz już lokalną kopię modelu w sklonowanym repozytorium, więc wystarczy opublikować model w rejestrze w obszarze roboczym. Ten krok można pominąć, jeśli model, który chcesz wdrożyć, jest już zarejestrowany.

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

Co zrobić, jeśli model został zarejestrowany w trakcie przebiegu?

Jeśli model został zapisany wewnątrz sesji, możesz zarejestrować go bezpośrednio.

Aby zarejestrować model, musisz znać jego lokalizację przechowywania:

  • Jeśli używasz funkcji MLflow autolog , ścieżka do modelu zależy od typu modelu i struktury. Sprawdź dane wyjściowe zadania, aby zidentyfikować nazwę folderu modelu. Ten folder zawiera plik o nazwie MLModel.
  • Jeśli używasz metody log_model do ręcznego rejestrowania modeli, należy przekazać ścieżkę do modelu jako argument tej metody. Na przykład, jeśli używasz mlflow.sklearn.log_model(my_model, "classifier") do rejestrowania modelu, classifier to ścieżka, na której przechowuje się model.

Interfejs wiersza polecenia (CLI) usługi Azure Machine Learning w wersji 2 pozwala utworzyć model z wyników zadania treningowego. Poniższy kod używa artefaktów zadania o identyfikatorze $RUN_ID w celu zarejestrowania modelu o nazwie $MODEL_NAME. $MODEL_PATH to ścieżka używana przez zadanie do przechowywania modelu.

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

Wdrażanie modelu MLflow do punktu końcowego online

  1. Użyj następującego kodu, aby skonfigurować nazwę i tryb uwierzytelniania punktu końcowego, w którym chcesz wdrożyć model:

    Ustaw nazwę punktu końcowego, uruchamiając następujące polecenie. Najpierw zastąp YOUR_ENDPOINT_NAME unikatową nazwą.

    export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"
    

    Aby skonfigurować punkt końcowy, utwórz plik YAML o nazwie create-endpoint.yaml zawierający następujące wiersze:

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
    name: my-endpoint
    auth_mode: key
    
  2. Utwórz punkt końcowy:

    az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/ncd/create-endpoint.yaml
    
  3. Skonfiguruj wdrożenie. Wdrożenie to zestaw zasobów wymaganych do hostowania modelu, który wykonuje rzeczywiste wnioskowanie.

    Utwórz plik YAML o nazwie sklearn-deployment.yaml zawierający następujące wiersze:

    $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

    Automatyczne generowanie elementów scoring_script i environment jest obsługiwane tylko dla odmiany PyFunc modelu. Aby użyć innego wariantu modelu, zobacz Dostosowywanie wdrożeń modelu MLflow.

  4. Utwórz wdrożenie:

    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. Przypisz cały ruch sieciowy do wdrożenia. Do tej pory punkt końcowy ma jedno wdrożenie, ale żaden z jego ruchu nie jest przypisany do niego.

    Ten krok nie jest wymagany w interfejsie wiersza polecenia platformy Azure, jeśli używasz flagi --all-traffic podczas tworzenia. Jeśli musisz zmienić ruch, możesz użyć az ml online-endpoint update --traffic polecenia . Aby uzyskać więcej informacji na temat aktualizowania ruchu, zobacz Postępowe aktualizowanie ruchu.

  6. Zaktualizuj konfigurację punktu końcowego:

    Ten krok nie jest wymagany w interfejsie wiersza polecenia platformy Azure, jeśli używasz flagi --all-traffic podczas tworzenia. Jeśli musisz zmienić ruch, możesz użyć az ml online-endpoint update --traffic polecenia . Aby uzyskać więcej informacji na temat aktualizowania ruchu, zobacz Postępowe aktualizowanie ruchu.

Wywołaj punkt końcowy

Gdy wdrożenie jest gotowe, możesz użyć go do obsługi żądań. Jednym ze sposobów testowania wdrożenia jest użycie wbudowanej funkcji wywołania w kliencie wdrażania. W repozytorium przykładów plik sample-request-sklearn.json zawiera następujący kod JSON. Można go użyć jako przykładowego pliku żądania dla wdrożenia.

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

Ten plik używa input_data klucza zamiast inputs, którego używa usługa MLflow. Usługa Azure Machine Learning wymaga innego formatu danych wejściowych, aby umożliwić automatyczne generowanie kontraktów struktury Swagger dla punktów końcowych. Aby uzyskać więcej informacji na temat oczekiwanych formatów wejściowych, zobacz Wdrażanie we wbudowanym serwerze MLflow a wdrożeniem na serwerze wnioskowania usługi Azure Machine Learning.

Prześlij żądanie do punktu końcowego:

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

Odpowiedź powinna być podobna do następującego tekstu:

[ 
  11633.100167144921,
  8522.117402884991
]

Important

W przypadku wdrożenia bez kodu platformy MLflow testowanie za pośrednictwem lokalnych punktów końcowych nie jest obecnie obsługiwane.

Dostosowywanie wdrożeń modelu MLflow

Nie musisz określać skryptu oceny w definicji procesu wdrożenia modelu MLflow do punktu końcowego online. Można jednak określić skrypt oceniania, jeśli chcesz dostosować proces wnioskowania.

Zazwyczaj chcesz dostosować wdrożenie modelu MLflow w następujących przypadkach:

  • Model nie ma PyFunc smaku.
  • Musisz dostosować sposób uruchamiania modelu. Na przykład należy użyć mlflow.<flavor>.load_model(), aby załadować model z określonym wariantem.
  • Należy wykonać wstępne przetwarzanie lub przetwarzanie końcowe w procedurze oceniania, ponieważ model nie wykonuje tego przetwarzania.
  • Dane wyjściowe modelu nie mogą być ładnie reprezentowane w danych tabelarycznych. Na przykład dane wyjściowe to tensor reprezentujący obraz.

Important

Jeśli określisz skrypt oceniania dla wdrożenia modelu MLflow, musisz również określić środowisko, w którym działa wdrożenie.

Wdrażanie niestandardowego skryptu oceniania

Aby wdrożyć model MLflow, który używa niestandardowego skryptu oceniania, wykonaj kroki opisane w poniższych sekcjach.

Identyfikowanie folderu modelu

Zidentyfikuj folder zawierający model MLflow, wykonując następujące czynności:

  1. Przejdź do usługi Azure Machine Learning Studio.

  2. Przejdź do sekcji Modele .

  3. Wybierz model, który chcesz wdrożyć, i przejdź do karty Artefakty .

  4. Zanotuj wyświetlony folder. Podczas rejestrowania modelu należy określić ten folder.

    Zrzut ekranu przedstawiający folder zawierający artefakty modelu.

Tworzenie skryptu oceniania

Poniższy skrypt oceniania, score.py, zawiera przykład sposobu wnioskowania z modelem MLflow. Ten skrypt można dostosować do swoich potrzeb lub zmienić dowolny z jego części, aby odzwierciedlał twój scenariusz. Zwróć uwagę, że nazwa folderu, który został wcześniej zidentyfikowany, modeljest uwzględniona w init() funkcji .

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

Poradnik MLflow 2.0: Przykładowy skrypt oceniania działa z MLflow 1.X i MLflow 2.X. Jednak oczekiwane formaty danych wejściowych i wyjściowych w tych wersjach mogą się różnić. Sprawdź definicję środowiska, aby zobaczyć używaną wersję platformy MLflow. Platforma MLflow 2.0 jest obsługiwana tylko w języku Python 3.8 i nowszych wersjach.

Tworzenie środowiska

Następnym krokiem jest utworzenie środowiska, w którym można uruchomić skrypt oceniania. Ponieważ model jest modelem MLflow, wymagania conda są również określone w pakiecie modelu. Aby uzyskać więcej informacji na temat plików zawartych w modelu MLflow, zobacz Format modelu MLmodel. Środowisko jest kompilowane przy użyciu zależności conda z pliku. Należy również uwzględnić pakiet azureml-inference-server-http, który jest wymagany do wdrożeń online w Azure Machine Learning.

Możesz utworzyć plik definicji conda o nazwie conda.yaml zawierający następujące wiersze:

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

Sekcja dependencies tego pliku conda zawiera azureml-inference-server-http pakiet.

Użyj tego pliku zależności conda, aby utworzyć środowisko:

Środowisko jest tworzone bezpośrednio w konfiguracji wdrożenia.

Utwórz wdrożenie

W folderze endpoints/online/ncd utwórz plik konfiguracji wdrożenia deployment.yml zawierający następujące wiersze:

$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

Utwórz wdrożenie:

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

Obsługa żądań

Po zakończeniu wdrażania można przystąpić do obsługi żądań. Jednym ze sposobów testowania wdrożenia jest użycie invoke metody z przykładowym plikiem żądania, takim jak następujący plik, 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]
  }}

Prześlij żądanie do punktu końcowego:

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

Odpowiedź powinna być podobna do następującego tekstu:

{
    "predictions": [ 
    1095.2797413413252,
    1134.585328803727
    ]
}

Warning

Porady dotyczące platformy MLflow 2.0: W rozwiązaniu predictions MLflow 1.X odpowiedź nie zawiera klucza.

Czyszczenie zasobów

Jeśli punkt końcowy nie jest już potrzebny, usuń skojarzone z nim zasoby:

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