Lancement progressif de modèles MLflow sur des points de terminaison en ligne

Dans cet article, vous allez découvrir comment mettre à jour, puis déployer progressivement des modèles MLflow sur des points de terminaison en ligne sans perturber le service. Vous allez utiliser le déploiement bleu-vert, également appelé stratégie de lancement sécurisé, pour introduire une nouvelle version d’un service web en production. Cette stratégie vous permettra de déployer votre nouvelle version du service web sur un petit sous-ensemble d’utilisateurs ou de demandes avant de le déployer complètement.

À propos de cet exemple

Les points de terminaison en ligne suivent le concept de point de terminaison et de déploiement. Un point de terminaison représente l’API que les clients utilisent pour consommer le modèle, tandis que le déploiement indique l’implémentation spécifique de cette API. Cette distinction permet aux utilisateurs de dissocier l’API de l’implémentation et de modifier l’implémentation sous-jacente sans affecter le consommateur. Cet exemple utilise ces concepts pour mettre à jour le modèle déployé dans les points de terminaison sans interrompre le service.

Le modèle que nous allons déployer est basé sur le jeu de données UCI Heart Disease. La base de données contient 76 attributs, mais nous utilisons un sous-ensemble de 14 d’entre eux. Le modèle tente de prédire la présence de maladie cardiaque chez un patient. Il est entier compris entre 0 (aucune présence de maladie) et 1 (présence de maladie). Il a été entraîné à l’aide d’un classifieur XGBBoost et tout le prétraitement requis a été empaqueté en tant que pipeline scikit-learn, ce qui fait de ce modèle un pipeline de bout en bout qui passe des données brutes aux prédictions.

Les informations de cet article sont basées sur des exemples de code contenus dans le référentiel azureml-examples. Pour exécuter les commandes localement sans avoir à copier/coller les fichiers, clonez le dépôt, puis remplacez les répertoires par sdk/using-mlflow/deploy.

Suivre dans les notebooks Jupyter

Vous pouvez suivre cet exemple dans les notebooks suivants. Dans le dépôt cloné, ouvrez le notebook : mlflow_sdk_online_endpoints_progresive.ipynb.

Prérequis

Avant de suivre les étapes décrites dans cet article, vérifiez que vous disposez des composants requis suivants :

  • Un abonnement Azure. Si vous n’avez pas d’abonnement Azure, créez un compte gratuit avant de commencer. Essayez la version gratuite ou payante d’Azure Machine Learning.
  • Les contrôles d’accès en fonction du rôle Azure (Azure RBAC) sont utilisés pour accorder l’accès aux opérations dans Azure Machine Learning. Pour que vous puissiez effectuer les étapes décrites dans cet article, votre compte d’utilisateur doit avoir le rôle propriétaire ou contributeur sur l’espace de travail Azure Machine Learning ou un rôle personnalisé autorisant Microsoft.MachineLearningServices/workspaces/onlineEndpoints/*. Pour plus d’informations, consultez Gérer l’accès à un espace de travail Azure Machine Learning.

En outre, vous devez :

Se connecter à un espace de travail

Tout d’abord, nous allons nous connecter à l’espace de travail Azure Machine Learning sur lequel nous allons travailler.

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

Inscription du modèle dans le registre

Vérifiez que votre modèle est inscrit dans le registre Azure Machine Learning. Le déploiement de modèles non inscrits n’est pas pris en charge dans Azure Machine Learning. Vous pouvez inscrire un nouveau modèle à l’aide du kit de développement logiciel (SDK) MLflow :

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

Créez un point de terminaison en ligne

Les points de terminaison en ligne sont des points de terminaison utilisés pour l’inférence en ligne (en temps réel). Les points de terminaison en ligne contiennent des déploiements prêts à recevoir des données des clients et pouvant renvoyer des réponses en temps réel.

Nous allons exploiter cette fonctionnalité en déployant plusieurs versions du même modèle sous le même point de terminaison. Mais le nouveau déploiement recevra 0 % du trafic pour commencer. Une fois que nous sommes sûrs que le nouveau modèle fonctionne correctement, nous allons déplacer progressivement le trafic d’un déploiement à l’autre.

  1. Les points de terminaison nécessitent un nom, qui doit être unique dans la même région. Assurons-nous d’en créer un qui n’existe pas :

    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. Configurer le point de terminaison

    endpoint.yml

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
    name: heart-classifier-edp
    auth_mode: key
    
  3. Créez le point de terminaison :

    az ml online-endpoint create -n $ENDPOINT_NAME -f endpoint.yml
    
  4. Obtention du secret d’authentification pour le point de terminaison.

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

Créer un déploiement bleu

À ce stade, le point de terminaison est vide. Il ne contient aucun déploiement. Créons le premier déploiement en déployant le même modèle que celui sur lequel nous travaillions auparavant. Nous appellerons ce déploiement « par défaut », représentant notre « déploiement bleu ».

  1. Configurer le déploiement

    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. Créer le déploiement

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

    Si votre point de terminaison n’a pas de connectivité de sortie, utilisez l’empaquetage de modèle (préversion) en incluant l’indicateur --with-package :

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

    Conseil

    Nous définissons l’indicateur --all-traffic dans la commande create, qui affectera tout le trafic au nouveau déploiement.

  3. Attribuer tout le trafic au déploiement

    Jusqu’à présent, le point de terminaison a un déploiement, mais aucun trafic ne lui est attribué. Nous allons le lui attribuer maintenant.

    Cette étape n’est pas nécessaire avec l’interface Azure CLI, car nous avons utilisé --all-traffic au moment de la création.

  4. Mettez à jour la configuration du point de terminaison :

    Cette étape n’est pas nécessaire avec l’interface Azure CLI, car nous avons utilisé --all-traffic au moment de la création.

  5. Créer un exemple d’entrée pour tester le déploiement

    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. test du déploiement

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

Créer un déploiement vert sous le point de terminaison en ligne

Imaginons qu’il existe une nouvelle version du modèle créée par l’équipe de développement et qu’il soit prêt à être mis en production. Nous pouvons d’abord tester ce modèle et une fois que nous sommes confiants, nous pouvons mettre à jour le point de terminaison pour acheminer le trafic vers celui-ci.

  1. Inscrire une nouvelle version du modèle

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

    Obtenons le numéro de version du nouveau modèle :

    VERSION=$(az ml model show -n heart-classifier --label latest | jq -r ".version")
    
  2. Configurer un nouveau déploiement

    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
    

    Nous allons nommer le déploiement comme suit :

    GREEN_DEPLOYMENT_NAME="xgboost-model-$VERSION"
    
  3. Créer le nouveau déploiement

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

    Si votre point de terminaison n’a pas de connectivité de sortie, utilisez l’empaquetage de modèle (préversion) en incluant l’indicateur --with-package :

    az ml online-deployment create --with-package -n $GREEN_DEPLOYMENT_NAME --endpoint-name $ENDPOINT_NAME -f green-deployment.yml
    
  4. Tester le déploiement sans modifier le trafic

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

    Conseil

    Notez comment nous indiquons maintenant le nom du déploiement que nous voulons appeler.

Mettre à jour progressivement le trafic

Une fois que nous sommes confiants concernant le nouveau déploiement, nous pouvons mettre à jour le trafic pour acheminer une partie de celui-ci vers le nouveau déploiement. Le trafic est configuré au niveau du point de terminaison :

  1. Configurez le trafic :

    Cette étape n’est pas obligatoire dans l’interface CLI Azure

  2. Mettre à jour le point de terminaison

    az ml online-endpoint update --name $ENDPOINT_NAME --traffic "default=90 $GREEN_DEPLOYMENT_NAME=10"
    
  3. Si vous décidez de basculer l’ensemble du trafic vers le nouveau déploiement, mettez à jour tout le trafic :

    Cette étape n’est pas obligatoire dans l’interface CLI Azure

  4. Mettre à jour le point de terminaison

    az ml online-endpoint update --name $ENDPOINT_NAME --traffic "default=0 $GREEN_DEPLOYMENT_NAME=100"
    
  5. Comme l’ancien déploiement ne reçoit aucun trafic, vous pouvez le supprimer en toute sécurité :

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

    Conseil

    Notez qu’à ce stade, l’ancien « déploiement bleu » a été supprimé et le nouveau « déploiement vert » a pris la place du « déploiement bleu ».

Nettoyer les ressources

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

Important

Notez que la suppression d’un point de terminaison supprime également tous les déploiements qu’il contient.

Étapes suivantes