Déployer des modèles MLflow sur des points de terminaison en ligne
S’APPLIQUE À : Extension ml Azure 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 :
azureml-inference-server-http
mlflow-skinny
- Script de scoring pour l’inférence.
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 :
- Installer l’interface Azure CLI et l’extension
ml
pour l’interface Azure CLI. Pour plus d’informations sur l’installation de l’interface CLI, consultez Installer et configurer l’interface CLI (v2).
- Installer l’interface Azure CLI et l’extension
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
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
Créez le point de terminaison :
az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/ncd/create-endpoint.yaml
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: 2 path: sklearn-diabetes/model type: mlflow_model instance_type: Standard_DS3_v2 instance_count: 1
Remarque
La génération automatique de
scoring_script
etenvironment
ne sont prises en charge que pour la saveur du modèlepyfunc
. Pour utiliser un modèle différent, consultez Personnalisation des déploiements de modèles MLflow.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
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 commandeaz ml online-endpoint update --traffic
. Pour plus d'informations sur la mise à jour du trafic, consultez Mise à jour progressive du trafic.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 commandeaz 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é :
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.
Créer un script de scoring. Notez que le nom du dossier
model
que vous avez identifié précédemment est inclus dans la fonctioninit()
.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+.
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.
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
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