Guide pratique pour déployer un pipeline afin d’effectuer un scoring par lots avec prétraitement
S’APPLIQUE À :Extension Azure CLI v2 (actuelle)Kit de développement logiciel (SDK) Python azure-ai-ml v2 (version actuelle)
Dans cet article, vous allez apprendre à déployer un pipeline d’inférence (ou de scoring) sous un point de terminaison par lots. Le pipeline effectue le scoring sur un modèle inscrit tout en réutilisant un composant de prétraitement à partir du moment où le modèle a été entraîné. La réutilisation du même composant de prétraitement garantit que le même prétraitement est appliqué pendant le scoring.
Vous allez apprendre à :
- Créer un pipeline qui réutilise des composants existants à partir de l’espace de travail
- Déployer le pipeline sur un point de terminaison
- Utiliser les prédictions générées par le pipeline
À propos de cet exemple
Cet exemple vous montre comment réutiliser le code de prétraitement et les paramètres appris pendant le prétraitement avant d’utiliser votre modèle pour l’inférence. En réutilisant le code de prétraitement et les paramètres appris, nous pouvons nous assurer que les mêmes transformations (telles que la normalisation et l’encodage des fonctionnalités) qui ont été appliquées aux données d’entrée pendant l’entraînement sont également appliquées lors de l’inférence. Le modèle utilisé pour l’inférence effectue des prédictions sur les données tabulaires du jeu de données UCI sur les maladies cardiaques.
Voici une visualisation du pipeline :
L’exemple de cet article est basé sur des extraits de code contenus dans le référentiel azureml-examples. Pour exécuter les commandes localement sans avoir à copier ou à coller des fichiers YAML et autres, utilisez les commandes suivantes pour cloner le référentiel et accéder au dossier de votre langage de programmation :
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli
Les fichiers de cet exemple se situent dans :
cd endpoints/batch/deploy-pipelines/batch-scoring-with-preprocessing
Suivre avec les notebooks Jupyter
Vous pouvez suivre la version du Kit de développement logiciel (SDK) Python de cet exemple en ouvrant le notebook sdk-deploy-and-test.ipynb dans le référentiel cloné.
Prérequis
Un abonnement Azure. Si vous n’avez pas d’abonnement Azure, créez un compte gratuit avant de commencer.
Un espace de travail Azure Machine Learning. Pour créer un espace de travail, consultez Gérer les espaces de travail Azure Machine Learning.
Autorisations suivantes dans l’espace de travail Azure Machine Learning :
- Pour la création ou la gestion des déploiements et des points de terminaison de lot : utilisez un rôle Propriétaire, Contributeur, ou un rôle personnalisé auquel les autorisations
Microsoft.MachineLearningServices/workspaces/batchEndpoints/*
ont été accordées. - Pour la création de déploiements Azure Resource Manager dans le groupe de ressources de l’espace de travail : utilisez un rôle Propriétaire, Contributeur, ou un rôle personnalisé auquel l’autorisation
Microsoft.Resources/deployments/write
a été accordée dans le groupe de ressources où l’espace de travail est déployé.
- Pour la création ou la gestion des déploiements et des points de terminaison de lot : utilisez un rôle Propriétaire, Contributeur, ou un rôle personnalisé auquel les autorisations
L’interface CLI Azure Machine Learning ou le SDK Azure Machine Learning pour Python :
Exécutez la commande suivante pour installer l’interface de ligne de commande Azure et l’extension pour Azure Machine Learning
ml
:az extension add -n ml
Les déploiements de composants de pipeline pour les points de terminaison de lot sont introduits dans la version 2.7 de l’extension
ml
pour Azure CLI. Utilisez la commandeaz extension update --name ml
pour obtenir la dernière version.
Se connecter à un espace de travail
L’espace de travail est la ressource de niveau supérieur du service Azure Machine Learning. Il fournit un emplacement centralisé dans lequel utiliser tous les artefacts que vous créez quand vous utilisez Azure Machine Learning. Dans cette section, vous vous connectez à l’espace de travail dans lequel vous effectuez vos tâches de déploiement.
Dans la commande suivante, entrez votre ID d’abonnement, le nom de l’espace de travail, le nom du groupe de ressources et l’emplacement :
az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
Créer le pipeline d’inférence
Dans cette section, nous allons créer toutes les ressources requises pour notre pipeline d’inférence. Nous allons commencer par créer un environnement qui inclut les bibliothèques nécessaires pour les composants du pipeline. Ensuite, nous allons créer un cluster de calcul sur lequel le déploiement par lots s’exécutera. Après cela, nous allons inscrire les composants, les modèles et les transformations dont nous avons besoin pour générer notre pipeline d’inférence. Enfin, nous allons générer et tester le pipeline.
Créer l’environnement
Les composants de cet exemple utilisent un environnement avec les bibliothèques XGBoost
et scikit-learn
. Le fichier environment/conda.yml
contient la configuration de l’environnement :
environment/conda.yml
channels:
- conda-forge
dependencies:
- python=3.8.5
- pip
- pip:
- mlflow
- azureml-mlflow
- datasets
- jobtools
- cloudpickle==1.6.0
- dask==2023.2.0
- scikit-learn==1.1.2
- xgboost==1.3.3
name: mlflow-env
Créez l’environnement ainsi :
Définissez l’environnement :
environment/xgboost-sklearn-py38.yml
$schema: https://azuremlschemas.azureedge.net/latest/environment.schema.json name: xgboost-sklearn-py38 image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest conda_file: conda.yml description: An environment for models built with XGBoost and Scikit-learn.
Créez l’environnement :
Créer un cluster de calcul
Les points de terminaison et les déploiements par lots s’exécutent sur des clusters de calcul. Ils peuvent s’exécuter sur n’importe quel cluster de calcul Azure Machine Learning qui existe déjà dans l’espace de travail. Par conséquent, plusieurs déploiements par lots peuvent partager la même infrastructure de calcul. Dans cet exemple, nous allons travailler sur un cluster de calcul Azure Machine Learning appelé batch-cluster
. Nous allons vérifier que le calcul existe sur l’espace de travail ou le créer dans le cas contraire.
az ml compute create -n batch-cluster --type amlcompute --min-instances 0 --max-instances 5
Inscrire des composants et des modèles
Nous allons inscrire les composants, les modèles et les transformations dont nous avons besoin pour générer notre pipeline d’inférence. Nous pouvons réutiliser certaines de ces ressources pour les routines d’entraînement.
Conseil
Dans ce didacticiel, nous allons réutiliser le modèle et le composant de prétraitement d’un pipeline d’entraînement antérieur. Vous pouvez voir comment ils ont été créés en suivant l’exemple Comment déployer un pipeline d’entraînement avec des points de terminaison par lots.
Inscrivez le modèle à utiliser pour la prédiction :
Le modèle inscrit n’a pas été entraîné directement sur les données d’entrée. Au lieu de cela, les données d’entrée ont été prétraitées (ou transformées) avant l’entraînement, à l’aide d’un composant de préparation. Nous devrons également inscrire ce composant. Inscrivez le composant de préparation :
Conseil
Après avoir inscrit le composant de préparation, vous pouvez le référencer à partir de l’espace de travail. Par exemple,
azureml:uci_heart_prepare@latest
obtient la dernière version du composant de préparation.Dans le cadre des transformations de données dans le composant de préparation, les données d’entrée ont été normalisées pour centrer les prédicteurs et limiter leurs valeurs dans la plage de [-1, 1]. Les paramètres de transformation ont été capturés dans une transformation scikit-learn que nous pouvons également inscrire pour l’appliquer ultérieurement lorsque nous avons de nouvelles données. Inscrivez la transformation ainsi :
Nous allons effectuer l’inférence pour le modèle inscrit, à l’aide d’un autre composant nommé
score
qui calcule les prédictions pour un modèle donné. Nous allons référencer le composant directement à partir de sa définition.Conseil
Il est recommandé d’inscrire le composant et de le référencer à partir du pipeline. Toutefois, dans cet exemple, nous allons référencer le composant directement à partir de sa définition pour vous aider à voir quels composants sont réutilisés à partir du pipeline d’entraînement et lesquels sont nouveaux.
Générer le pipeline
Il est maintenant temps de relier tous les éléments ensemble. Le pipeline d’inférence que nous allons déployer comporte deux composants (ou étapes) :
preprocess_job
: cette étape lit les données d’entrée et retourne les données préparées et les transformations appliquées. L’étape reçoit deux entrées :data
: dossier contenant les données d’entrée à notertransformations
: (facultatif) chemin des transformations qui seront appliquées, le cas échéant. Lorsqu’elles sont fournies, les transformations sont lues à partir du modèle indiqué au niveau du chemin d’accès. Cependant, si le chemin d’accès n’est pas fourni, les transformations seront apprises à partir des données d’entrée. Toutefois, pour l’inférence, vous ne pouvez pas apprendre les paramètres de transformation (dans cet exemple, les coefficients de normalisation) depuis des données d’entrée, car vous devez utiliser les mêmes valeurs de paramètre que celles apprises pendant l’entraînement. Étant donné que cette entrée est facultative, le composantpreprocess_job
peut être utilisé pendant l’entraînement et l’évaluation.
score_job
: cette étape effectue l’inférence sur les données transformées à l’aide du modèle d’entrée. Notez que le composant utilise un modèle MLflow pour effectuer l’inférence. Enfin, les scores sont réécrits dans le même format que lors de leur lecture.
La configuration du pipeline est définie dans le fichier pipeline.yml
:
pipeline.yml
$schema: https://azuremlschemas.azureedge.net/latest/pipelineComponent.schema.json
type: pipeline
name: batch_scoring_uci_heart
display_name: Batch Scoring for UCI heart
description: This pipeline demonstrates how to make batch inference using a model from the Heart Disease Data Set problem, where pre and post processing is required as steps. The pre and post processing steps can be components reusable from the training pipeline.
inputs:
input_data:
type: uri_folder
score_mode:
type: string
default: append
outputs:
scores:
type: uri_folder
mode: upload
jobs:
preprocess_job:
type: command
component: azureml:uci_heart_prepare@latest
inputs:
data: ${{parent.inputs.input_data}}
transformations:
path: azureml:heart-classifier-transforms@latest
type: custom_model
outputs:
prepared_data:
score_job:
type: command
component: components/score/score.yml
inputs:
data: ${{parent.jobs.preprocess_job.outputs.prepared_data}}
model:
path: azureml:heart-classifier@latest
type: mlflow_model
score_mode: ${{parent.inputs.score_mode}}
outputs:
scores:
mode: upload
path: ${{parent.outputs.scores}}
Voici une visualisation du pipeline :
Tester le pipeline
Testons le pipeline avec des exemples de données. Pour ce faire, nous allons créer un travail à l’aide du pipeline et du cluster de calcul batch-cluster
créés précédemment.
Le fichier pipeline-job.yml
suivant contient la configuration du travail de pipeline :
pipeline-job.yml
$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json
type: pipeline
display_name: uci-classifier-score-job
description: |-
This pipeline demonstrate how to make batch inference using a model from the Heart \
Disease Data Set problem, where pre and post processing is required as steps. The \
pre and post processing steps can be components reused from the training pipeline.
compute: batch-cluster
component: pipeline.yml
inputs:
input_data:
type: uri_folder
score_mode: append
outputs:
scores:
mode: upload
Créez le travail de test :
Créer un point de terminaison de traitement de lots
Entrez un nom pour le point de terminaison. Le nom d’un point de terminaison de lot doit être unique dans chaque région, car le nom est utilisé pour construire l’URI d’appel. Pour garantir son originalité, ajoutez des caractères de fin au nom spécifié dans le code suivant.
Configurer le point de terminaison :
Le fichier
endpoint.yml
contient la configuration du point de terminaison.endpoint.yml
$schema: https://azuremlschemas.azureedge.net/latest/batchEndpoint.schema.json name: uci-classifier-score description: Batch scoring endpoint of the Heart Disease Data Set prediction task. auth_mode: aad_token
Créez le point de terminaison :
Interrogez l’URI du point de terminaison :
Déployer le composant de pipeline
Pour déployer le composant de pipeline, nous devons créer un déploiement par lots. Un déploiement est un ensemble de ressources nécessaires à l’hébergement de la ressource qui effectue le travail réel.
Configurer le déploiement
Le fichier
deployment.yml
contient la configuration du déploiement. Pour obtenir des propriétés supplémentaires, vous pouvez vérifier le schéma YAML du point de terminaison de lot complet.deployment.yml
$schema: https://azuremlschemas.azureedge.net/latest/pipelineComponentBatchDeployment.schema.json name: uci-classifier-prepros-xgb endpoint_name: uci-classifier-batch type: pipeline component: pipeline.yml settings: continue_on_step_failure: false default_compute: batch-cluster
Créer le déploiement
Exécutez le code suivant pour créer un déploiement par lots sous le point de terminaison de traitement par lots et le définir comme déploiement par défaut.
az ml batch-deployment create --endpoint $ENDPOINT_NAME -f deployment.yml --set-default
Conseil
Notez l’utilisation de l’indicateur
--set-default
pour indiquer que ce nouveau déploiement est désormais la valeur par défaut.Votre déploiement est prêt à être utilisé.
test du déploiement
Une fois le déploiement créé, il est prêt à recevoir des travaux. Suivez ces étapes pour le tester :
Notre déploiement demande à ce que nous indiquions une entrée de données et une entrée littérale.
Le fichier
inputs.yml
contient la définition de la ressource de données d’entrée :inputs.yml
inputs: input_data: type: uri_folder path: data/unlabeled score_mode: type: string default: append outputs: scores: type: uri_folder mode: upload
Conseil
Pour en savoir plus sur la façon d’indiquer des entrées, consultez Créer des travaux et des données d’entrée pour les points de terminaison par lots.
Vous pouvez appeler le déploiement par défaut ainsi :
Vous pouvez surveiller la progression de l’affichage et diffuser les journaux en continu à l’aide de :
Accéder à la sortie du travail
Une fois le travail terminé, nous pouvons accéder à sa sortie. Ce travail ne contient qu’une seule sortie nommée scores
:
Vous pouvez télécharger les résultats associés à l’aide de az ml job download
.
az ml job download --name $JOB_NAME --output-name scores
Lisez les données notées :
import pandas as pd
import glob
output_files = glob.glob("named-outputs/scores/*.csv")
score = pd.concat((pd.read_csv(f) for f in output_files))
score
La sortie se présente comme suit :
age | sexe | ... | thal | prediction |
---|---|---|---|---|
0.9338 | 1 | ... | 2 | 0 |
1.3782 | 1 | ... | 3 | 1 |
1.3782 | 1 | ... | 4 | 0 |
-1.954 | 1 | ... | 3 | 0 |
La sortie contient les prédictions ainsi que les données fournies au composant de score, qui a été prétraité. Par exemple, la colonne age
a été normalisée et la colonne thal
contient des valeurs d’encodage d’origine. Dans la pratique, vous souhaiterez probablement générer uniquement la prédiction, puis la concaténer avec les valeurs d’origine. Ce travail a été laissé au lecteur.
Nettoyer les ressources
Une fois que vous avez terminé, supprimez les ressources associées de l’espace de travail :
Exécutez le code suivant pour supprimer le point de terminaison de lot et ses déploiements sous-jacents. Utilisez --yes
pour confirmer la suppression.
az ml batch-endpoint delete -n $ENDPOINT_NAME --yes
(Facultatif) Supprimez le calcul, sauf si vous comptez réutiliser votre cluster de calcul dans des déploiements ultérieurs.