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:
- Installieren Sie die Azure CLI und die ml-Erweiterung für die Azure CLI. Weitere Informationen finden Sie unter Installieren, Einrichten und Verwenden der CLI (v2).
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.
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"
Konfigurieren des Endpunkts
endpoint.yml
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json name: heart-classifier-edp auth_mode: key
Erstellen des Endpunkts:
az ml online-endpoint create -n $ENDPOINT_NAME -f endpoint.yml
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.
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
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.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.Aktualisieren Sie die Endpunktkonfiguration:
Dieser Schritt in ist in der Azure CLI nicht erforderlich, da wir bei der Erstellung
--all-traffic
verwendet haben.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" ] ] } }
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.
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")
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"
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
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:
Konfigurieren des Datenverkehrs:
Dieser Schritt in ist in der Azure CLI nicht erforderlich.
Aktualisieren des Endpunkts
az ml online-endpoint update --name $ENDPOINT_NAME --traffic "default=90 $GREEN_DEPLOYMENT_NAME=10"
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.
Aktualisieren des Endpunkts
az ml online-endpoint update --name $ENDPOINT_NAME --traffic "default=0 $GREEN_DEPLOYMENT_NAME=100"
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.