Déployer des modèles MLflow sur des points de terminaison en ligne

S’APPLIQUE À :Extension Azure ML CLI v2 (actuelle)

Cet article explique comment déployer votre modèle MLflow sur un point de terminaison en ligne pour une inférence en temps réel. Lorsque vous déployez votre modèle MLflow sur un point de terminaison en ligne, vous n’avez plus besoin de spécifier un script de scoring ou un environnement. Cette fonctionnalité est appelée déploiement sans code.

Pour un déploiement sans code, Azure Machine Learning :

  • Installe dynamiquement les packages Python fournis dans le fichier conda.yaml. Par conséquent, les dépendances sont installées pendant l’exécution du conteneur.
  • Fournit une image de base MLflow/un environnement organisé qui contient les éléments suivants :

Conseil

Espaces de travail sans accès au réseau public : avant de pouvoir déployer des modèles MLflow sur des points de terminaison en ligne sans connectivité de sortie, vous devez empaqueter les modèles (préversion). En utilisant l’empaquetage de modèles, vous pouvez éviter la nécessité d’une connexion Internet, qu’Azure Machine Learning nécessiterait pour installer dynamiquement les packages Python nécessaires pour les modèles MLflow.

À propos de l’exemple

L’exemple montre comment déployer un modèle MLflow sur un point de terminaison de lot pour effectuer des prédictions par lots. L’exemple utilise un modèle MLflow basé sur le jeu de données Diabetes. Ce jeu de données contient 10 variables de base, l’âge, le sexe, l’indice de masse corporelle, la pression artérielle moyenne et six mesures de sérum sanguin obtenues auprès de 442 patients diabétiques. Il contient également la réponse d’intérêt, une mesure quantitative de la progression de la maladie un an après la ligne de base.

Le modèle a été entraîné à l’aide d’un régresseur scikit-learn et tout le prétraitement demandé a été empaqueté sous forme de pipeline, 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 au niveau local sans avoir à copier/coller les fichiers YAML et autres, clonez le référentiel, puis remplacez les répertoires par cli, si vous utilisez l'interface de ligne de commande Azure. Si vous utilisez le Kit de développement logiciel (SDK) Azure Machine Learning pour Python, remplacez les répertoires par sdk/python/endpoints/online/mlflow.

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

Suivre dans Notebook Jupyter

Vous pouvez suivre les étapes d'utilisation du kit de développement Azure Machine Learning Python en ouvrant déployer un modèle MLflow vers des points de terminaison en ligne dans le référentiel cloné.

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 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 sur les rôles, consultez Gérer l'accès à un espace de travail Azure Machine Learning.

  • Vous devez disposer d’un modèle MLflow inscrit dans votre espace de travail. Cet article inscrit un modèle entraîné pour le jeu de données Diabetes dans l’espace de travail.

  • En outre, vous devez :


Se connecter à un espace de travail

Connectez-vous d'abord à l'espace de travail Azure Machine Learning dans lequel vous allez travailler.

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

Inscrire le modèle

Vous pouvez déployer uniquement des modèles inscrits sur des points de terminaison en ligne. Dans ce cas, vous avez déjà une copie locale du modèle dans le référentiel. Vous devez donc uniquement publier le modèle dans le registre dans l’espace de travail. Vous pouvez ignorer cette étape si le modèle que vous essayez de déployer est déjà inscrit.

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

Que se passe-t-il si votre modèle est journalisé à l'intérieur d'une exécution ?

Si votre modèle a été journalisé à l’intérieur d’une exécution, vous pouvez également l’inscrire directement.

Pour enregistrer le modèle, vous devez connaître son emplacement. Si vous utilisez la fonctionnalité de autolog MLflow, le chemin d’accès au modèle dépendra du type de modèle et de l’infrastructure. Vous devez vérifier le résultat des travaux pour identifier le nom du dossier du modèle. Le dossier contient un fichier nommé MLModel.

Si vous utilisez la méthode log_model pour journaliser manuellement vos modèles, passez le chemin d’accès au modèle en tant qu’argument à la méthode. Par exemple, si vous journalisez le modèle à l’aide de mlflow.sklearn.log_model(my_model, "classifier"), le chemin d’accès de l’emplacement où le modèle est stocké est classifier.

Utilisez l’interface CLI Azure Machine Learning v2 pour créer un modèle à partir de la sortie d’un travail d’entraînement. Dans l’exemple suivant, un modèle nommé $MODEL_NAME est inscrit à l’aide des artefacts d’un travail avec l’ID $RUN_ID. Le chemin d’accès où le modèle est stocké est $MODEL_PATH.

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

Notes

Le chemin $MODEL_PATH est l’emplacement où le modèle a été stocké dans l’exécution.

Déployer des modèles MLflow sur un point de terminaison en ligne

  1. Configurez le point de terminaison où le modèle sera déployé. L’exemple suivant configure le nom et le mode d’authentification du point de terminaison :

    Définissez un nom de point de terminaison en exécutant la commande suivante (remplacez YOUR_ENDPOINT_NAME par un nom unique) :

    export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"
    

    Configurer le point de terminaison :

    create-endpoint.yaml

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
    name: my-endpoint
    auth_mode: key
    
  2. Créez le point de terminaison :

    az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/ncd/create-endpoint.yaml
    
  3. Configurez le déploiement. Un déploiement est un ensemble de ressources nécessaires pour héberger le modèle qui effectue l’inférence réelle.

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

    Remarque

    La génération automatique de scoring_script et environment ne sont prises en charge que pour la saveur du modèle pyfunc. Pour utiliser un modèle différent, consultez Personnalisation des déploiements de modèles MLflow.

  4. Créez le déploiement :

    az ml online-deployment create --name sklearn-deployment --endpoint $ENDPOINT_NAME -f endpoints/online/ncd/sklearn-deployment.yaml --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 --name sklearn-deployment --endpoint $ENDPOINT_NAME -f endpoints/online/ncd/sklearn-deployment.yaml --all-traffic
    
  5. Attribuez tout le trafic au déploiement. Jusqu’à présent, le point de terminaison a un déploiement, mais aucun trafic ne lui est attribué.

    Cette étape n’est pas nécessaire avec l’interface Azure CLI, car nous avons utilisé l'indicateur --all-traffic lors de la création. Si vous avez besoin de modifier le trafic, vous pouvez utiliser la commande az ml online-endpoint update --traffic. Pour plus d'informations sur la mise à jour du trafic, consultez Mise à jour progressive du trafic.

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

    Cette étape n’est pas nécessaire avec l’interface Azure CLI, car nous avons utilisé l'indicateur --all-traffic lors de la création. Si vous avez besoin de modifier le trafic, vous pouvez utiliser la commande az ml online-endpoint update --traffic. Pour plus d'informations sur la mise à jour du trafic, consultez Mise à jour progressive du trafic.

Appeler le point de terminaison

Une fois votre déploiement prêt, vous pouvez l’utiliser pour traiter des requêtes. Vous pouvez tester le déploiement en utilisant la fonctionnalité d’appel intégrée dans le client de déploiement que vous utilisez. Le code JSON suivant est un exemple de requête pour le déploiement.

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

Remarque

input_data est utilisé dans cet exemple, plutôt que inputs qui est utilisé dans le service MLflow. Cela est dû au fait qu’Azure Machine Learning nécessite un format d’entrée différent pour pouvoir générer automatiquement les contrats Swagger pour les points de terminaison. Pour plus d’ informations sur le format d’entrée attendu, consultez Différences entre les modèles déployés dans Azure Machine Learning et le serveur intégré MLflow.

Envoyez une requête au point de terminaison comme suit :

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

La réponse ressemblera au texte suivant :

[ 
  11633.100167144921,
  8522.117402884991
]

Important

Pour le déploiement sans code MLflow, les tests via des points de terminaison locaux ne sont pas pris en charge actuellement.

Personnalisez les déploiements de modèles MLflow

Il n'est pas nécessaire de spécifier un script de scoring dans la définition du déploiement d'un modèle MLflow vers un point de terminaison en ligne. Toutefois, vous pouvez choisir de le faire et personnaliser la façon dont l’inférence est exécutée.

De manière générale, vous voudrez personnaliser le déploiement de votre modèle MLflow lorsque :

  • Il n’y a pas de variante PyFunc appliquée à ce modèle.
  • Vous devez personnaliser la façon dont le modèle est exécuté, par exemple, utiliser une saveur spécifique pour charger le modèle, en utilisant mlflow.<flavor>.load_model().
  • Vous devez effectuer le pré/post-traitement dans votre routine de scoring lorsqu’il n’est pas effectué par le modèle lui-même.
  • La sortie du modèle ne peut pas être correctement représentée dans les données tabulaires. Par exemple, il s’agit d’un capteur qui représente une image.

Important

Si vous choisissez de spécifier un script de scoring pour un déploiement de modèle MLflow, vous devez également spécifier l’environnement dans lequel le déploiement s’exécutera.

Étapes

Pour déployer un modèle MLflow avec un script de scoring personnalisé :

  1. Identifiez le dossier dans lequel se trouve votre modèle MLflow.

    a. Accédez à Azure Machine Learning Studio.

    b. Accédez à la section Modèles.

    c. Sélectionnez le modèle que vous essayez de déployer, puis cliquez sur onglet Artifacts.

    d. Notez le dossier affiché. Ce dossier a été spécifié lors de l’inscription du modèle.

    Screenshot showing the folder where the model artifacts are placed.

  2. Créer un script de scoring. Notez que le nom du dossier model que vous avez identifié précédemment est inclus dans la fonction init().

    Conseil

    Le script de scoring suivant est fourni comme exemple sur la façon d’effectuer l’inférence avec un modèle MLflow. Vous pouvez adapter ce script à vos besoins ou modifier l’une de ses parties pour refléter votre scénario.

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

    Avertissement

    Avis MLflow 2.0 : le script de scoring fourni fonctionne avec MLflow 1.X et MLflow 2.X. Toutefois, notez que les formats d’entrée/sortie attendus sur ces versions peuvent varier. Vérifiez la définition d’environnement utilisée pour vérifier que vous utilisez la version de MLflow attendue. Notez que MLflow 2.0 est uniquement pris en charge dans Python 3.8+.

  3. Créez un environnement dans lequel le script de scoring peut être exécuté. Comme il s'agit d'un modèle MLflow, les exigences de conda sont également spécifiées dans le package du modèle. Pour plus d’informations sur les fichiers inclus dans un modèle MLflow, consultez le format MLmodel. Vous construirez ensuite l'environnement à l’aide des dépendances conda du fichier. Toutefois, vous devez aussi inclure le package azureml-inference-server-http requis pour les déploiements en ligne dans Azure Machine Learning.

    Le fichier de définition conda se présente comme suit :

    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
    

    Remarque

    Le package azureml-inference-server-http a été ajouté au fichier de dépendances de conda d’origine.

    Vous allez utiliser ce fichier de dépendances conda pour créer l’environnement :

    L’environnement sera créé inline dans la configuration du déploiement.

  4. Créez le déploiement :

    Créez un fichier de configuration de déploiement 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
    

    Créez le déploiement :

    az ml online-deployment create -f deployment.yml
    
  5. Une fois votre déploiement terminé, il peut déjà traiter les requêtes. Vous pouvez tester le déploiement en utilisant un exemple de fichier de requête avec la méthode 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]
      }}
    

    Envoyez une requête au point de terminaison comme suit :

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

    La réponse ressemblera au texte suivant :

    {
      "predictions": [ 
        11633.100167144921,
        8522.117402884991
      ]
    }
    

    Avertissement

    Avis MLflow 2.0 : dans MLflow 1.X, la clé predictions est manquante.

Nettoyer les ressources

Une fois que vous avez fini d'utiliser le point d'accès, supprimez les ressources qui lui sont associées :

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