Progressiver Rollout von MLflow-Modellen für Onlineendpunkte

In diesem Artikel erfahren Sie, wie MLflow-Modelle schrittweise aktualisiert und auf Onlineendpunkten bereitgestellt werden können, ohne eine Dienstunterbrechung zu verursachen. Sie verwenden die Blau-Grün-Bereitstellung, auch bekannt als sichere Rolloutstrategie, um eine neue Version eines Webdiensts in die Produktion einzuführen. Mit dieser Strategie können Sie Ihre neue Version des Webdiensts für eine kleine Teilmenge von Benutzern oder Anforderungen bereitstellen, bevor Sie sie vollständig einführen.

Über dieses Beispiel

Onlineendpunkte verfügen über ein Konzept aus Endpunkt und Bereitstellung. Ein Endpunkt stellt die API dar, die Kunden zur Nutzung des Modells verwenden, während die Bereitstellung die spezifische Implementierung dieser API angibt. Diese Unterscheidung ermöglicht es Benutzern, die API von der Implementierung zu entkoppeln und die zugrunde liegende Implementierung zu ändern, ohne den Consumer zu beeinträchtigen. In diesem Beispiel werden solche Konzepte verwendet, um das bereitgestellte Modell ohne Dienstunterbrechung auf Endpunkten zu aktualisieren.

Das Modell, das wir bereitstellen werden, basiert auf dem UCI Heart Disease Data Set. Die Datenbank enthält 76 Attribute, von denen wir eine Teilmenge von 14 verwenden. Das Modell versucht, das Vorhandensein einer Herzerkrankung bei einem Patienten vorherzusagen. Der Wert ist eine ganze Zahl, entweder 0 (nicht vorhanden) oder 1 (vorhanden). Es wurde mit einem XGBBoost-Klassifizierer trainiert, und alle erforderlichen Vorverarbeitungen wurden in einer scikit-learn-Pipeline zusammengefasst. Somit handelt es sich bei diesem Modell um eine End-to-End-Pipeline von den Rohdaten bis zu den Vorhersagen.

Die Informationen in diesem Artikel basieren auf Codebeispielen, die im Repository azureml-examples enthalten sind. Klonen Sie das Repository, und wechseln Sie dann in das Verzeichnis sdk/using-mlflow/deploy, um die Befehle lokal auszuführen, ohne Dateien kopieren/einfügen zu müssen.

Folgen in Jupyter Notebooks

Sie können diesem Beispiel in den folgenden Notebooks folgen. Öffnen Sie im geklonten Repository folgendes Notebook: mlflow_sdk_online_endpoints_progresive.ipynb.

Voraussetzungen

Stellen Sie vor dem Ausführen der Schritte in diesem Artikel sicher, dass Sie über die folgenden erforderlichen Komponenten verfügen:

  • Ein Azure-Abonnement. Wenn Sie nicht über ein Azure-Abonnement verfügen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen. Probieren Sie die kostenlose oder kostenpflichtige Version von Azure Machine Learning aus.
  • Die rollenbasierte Zugriffssteuerung in Azure (Azure RBAC) wird verwendet, um Zugriff auf Vorgänge in Azure Machine Learning zu gewähren. Um die Schritte in diesem Artikel auszuführen, muss Ihrem Benutzerkonto die Rolle „Besitzer“ oder „Mitwirkender“ für den Azure Machine Learning-Arbeitsbereich bzw. eine benutzerdefinierte Rolle zugewiesen werden, die „Microsoft.MachineLearningServices/workspaces/onlineEndpoints/*“ zulässt. Weitere Informationen finden Sie unter Zugriff auf einen Azure Machine Learning-Arbeitsbereich verwalten.

Darüber hinaus müssen Sie Folgendes durchführen:

Herstellen einer Verbindung mit Ihrem Arbeitsbereich

Zunächst stellen wir eine Verbindung mit dem Azure Machine Learning-Arbeitsbereich her, an dem wir arbeiten werden.

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

Registrieren des Modells in der Registrierung

Stellen Sie sicher, dass Ihr Modell in der Azure Machine Learning-Registrierung registriert ist. Die Bereitstellung nicht registrierter Modelle wird in Azure Machine Learning nicht unterstützt. Sie können ein neues Modell mit dem MLflow-SDK registrieren:

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

Erstellen eines Onlineendpunkts

Onlineendpunkte sind Endpunkte, die für Onlinerückschlüsse (Echtzeit) verwendet werden. Onlineendpunkte enthalten Bereitstellungen, die bereit sind, Daten von Clients zu empfangen und Antworten in Echtzeit zurückzusenden.

Wir werden diese Funktionalität nutzen, indem wir mehrere Versionen desselben Modells unter demselben Endpunkt bereitstellen. Die neue Bereitstellung empfängt zu Beginn jedoch 0 % des Datenverkehrs. Sobald wir sicher sind, dass das neue Modell ordnungsgemäß funktioniert, werden wir den Datenverkehr schrittweise von einer Bereitstellung zur anderen verschieben.

  1. Endpunkte erfordern einen Namen, der in derselben Region eindeutig sein muss. Erstellen Sie daher einen Namen, der noch nicht vorhanden ist:

    ENDPOINT_SUFIX=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w ${1:-5} | head -n 1)
    ENDPOINT_NAME="heart-classifier-$ENDPOINT_SUFIX"
    
  2. Konfigurieren des Endpunkts

    endpoint.yml

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
    name: heart-classifier-edp
    auth_mode: key
    
  3. Erstellen des Endpunkts:

    az ml online-endpoint create -n $ENDPOINT_NAME -f endpoint.yml
    
  4. Abrufen des Authentifizierungsgeheimnisses für den Endpunkt

    ENDPOINT_SECRET_KEY=$(az ml online-endpoint get-credentials -n $ENDPOINT_NAME | jq -r ".accessToken")
    

Erstellen einer Blau-Bereitstellung

Bisher ist der Endpunkt leer. Es sind keine Bereitstellungen vorhanden. Wir erstellen die erste, indem wir dasselbe Modell bereitstellen, an dem wir zuvor gearbeitet haben. Diese Bereitstellung wird als "Standard" bezeichnet, die unsere "blaue Bereitstellung" darstellt.

  1. Konfigurieren der Bereitstellung

    blue-deployment.yml

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
    name: default
    endpoint_name: heart-classifier-edp
    model: azureml:heart-classifier@latest
    instance_type: Standard_DS2_v2
    instance_count: 1
    
  2. Erstellen der Bereitstellung

    az ml online-deployment create --endpoint-name $ENDPOINT_NAME -f blue-deployment.yml --all-traffic
    

    Wenn Ihr Endpunkt keine ausgehende Verbindung hat, können Sie Ihre Modelle packen (Vorschau), indem Sie das Flag --with-package einschließen:

    az ml online-deployment create --with-package --endpoint-name $ENDPOINT_NAME -f blue-deployment.yml --all-traffic
    

    Tipp

    Wir legen das Flag --all-traffic im create-Befehl fest, sodass der gesamte Datenverkehr der neuen Bereitstellung zugewiesen wird.

  3. Zuweisen des gesamten Datenverkehrs zur Bereitstellung

    Bisher verfügt der Endpunkt über genau eine Bereitstellung, es ist aber kein Datenverkehr zugewiesen. Dieser wird jetzt zugewiesen.

    Dieser Schritt in ist in der Azure CLI nicht erforderlich, da wir bei der Erstellung --all-traffic verwendet haben.

  4. Aktualisieren Sie die Endpunktkonfiguration:

    Dieser Schritt in ist in der Azure CLI nicht erforderlich, da wir bei der Erstellung --all-traffic verwendet haben.

  5. Erstellen einer Beispieleingabe zum Testen der Bereitstellung

    sample.yml

    {
        "input_data": {
            "columns": [
                "age",
                "sex",
                "cp",
                "trestbps",
                "chol",
                "fbs",
                "restecg",
                "thalach",
                "exang",
                "oldpeak",
                "slope",
                "ca",
                "thal"
            ],
            "data": [
                [ 48, 0, 3, 130, 275, 0, 0, 139, 0, 0.2, 1, 0, "normal" ]
            ]
        }
    }
    
  6. Testen der Bereitstellung

    az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file sample.json
    

Erstellen einer Grün-Bereitstellung unter dem Endpunkt

Angenommen, es gibt eine neue Version des Modells, die vom Entwicklungsteam erstellt wurde und bereit für die Produktion ist. Wir können dieses Modell zuerst testweise einsetzen, und sobald wir sicher sind, können wir den Endpunkt aktualisieren, um den Datenverkehr dorthin weiterzuleiten.

  1. Registrieren einer neuen Modellversion

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

    Rufen wir die Versionsnummer des neuen Modells ab:

    VERSION=$(az ml model show -n heart-classifier --label latest | jq -r ".version")
    
  2. Konfigurieren einer neuen Bereitstellung

    green-deployment.yml

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
    name: xgboost-model
    endpoint_name: heart-classifier-edp
    model: azureml:heart-classifier@latest
    instance_type: Standard_DS2_v2
    instance_count: 1
    

    Wir benennen die Bereitstellung wie folgt:

    GREEN_DEPLOYMENT_NAME="xgboost-model-$VERSION"
    
  3. Erstellen der neuen Bereitstellung

    az ml online-deployment create -n $GREEN_DEPLOYMENT_NAME --endpoint-name $ENDPOINT_NAME -f green-deployment.yml
    

    Wenn Ihr Endpunkt keine ausgehende Verbindung hat, können Sie Ihre Modelle packen (Vorschau), indem Sie das Flag --with-package einschließen:

    az ml online-deployment create --with-package -n $GREEN_DEPLOYMENT_NAME --endpoint-name $ENDPOINT_NAME -f green-deployment.yml
    
  4. Testen der Bereitstellung ohne Änderung des Datenverkehrs

    az ml online-endpoint invoke --name $ENDPOINT_NAME --deployment-name $GREEN_DEPLOYMENT_NAME --request-file sample.json
    

    Tipp

    Beachten Sie, dass wir jetzt den Namen der Bereitstellung angeben, die wir aufrufen möchten.

Schrittweises Aktualisieren des Datenverkehrs

Sobald wir mit der neuen Bereitstellung zufrieden sind, können wir den Datenverkehr so aktualisieren, dass ein Teil davon an die neue Bereitstellung weitergeleitet wird. Datenverkehr wird auf Endpunktebene konfiguriert:

  1. Konfigurieren des Datenverkehrs:

    Dieser Schritt in ist in der Azure CLI nicht erforderlich.

  2. Aktualisieren des Endpunkts

    az ml online-endpoint update --name $ENDPOINT_NAME --traffic "default=90 $GREEN_DEPLOYMENT_NAME=10"
    
  3. Wenn Sie den gesamten Datenverkehr auf die neue Bereitstellung umstellen möchten, aktualisieren Sie den gesamten Datenverkehr:

    Dieser Schritt in ist in der Azure CLI nicht erforderlich.

  4. Aktualisieren des Endpunkts

    az ml online-endpoint update --name $ENDPOINT_NAME --traffic "default=0 $GREEN_DEPLOYMENT_NAME=100"
    
  5. Da die alte Bereitstellung keinen Datenverkehr empfängt, können Sie ihn sicher löschen:

    az ml online-deployment delete --endpoint-name $ENDPOINT_NAME --name default
    

    Tipp

    Beachten Sie, dass an diesem Punkt die frühere „Blau-Bereitstellung“ gelöscht wurde und die neue „Grün-Bereitstellung“ die Stelle der „Blau-Bereitstellung“ eingenommen hat.

Bereinigen von Ressourcen

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

Wichtig

Beachten Sie, dass durch das Löschen eines Endpunkts auch alle darunter befindlichen Bereitstellungen gelöscht werden.

Nächste Schritte