Déployer un modèle personnalisé sur un point de terminaison de lot
Si vous souhaitez déployer un modèle sur un point de terminaison de lot sans utiliser le format de modèle MLflow, vous devez créer l’environnement et le script de scoring.
Pour déployer un modèle, vous devez avoir créé un point de terminaison auparavant. Vous pouvez ensuite déployer le modèle sur le point de terminaison.
Créer le script de scoring
Le script de scoring est un fichier qui lit les nouvelles données, charge le modèle et effectue le scoring.
Le script de scoring doit comporter deux fonctions :
init()
: appelé une fois au début du processus. À utiliser pour toute préparation onéreuse ou courante comme le chargement du modèle.run()
: appelé pour effectuer le scoring de chaque mini-lot.
La méthode run()
doit retourner un dataframe pandas ou un tableau/une liste.
Voici à quoi le script de scoring peut ressembler :
import os
import mlflow
import pandas as pd
def init():
global model
# get the path to the registered model file and load it
model_path = os.path.join(os.environ["AZUREML_MODEL_DIR"], "model")
model = mlflow.pyfunc.load(model_path)
def run(mini_batch):
print(f"run method start: {__file__}, run({len(mini_batch)} files)")
resultList = []
for file_path in mini_batch:
data = pd.read_csv(file_path)
pred = model.predict(data)
df = pd.DataFrame(pred, columns=["predictions"])
df["file"] = os.path.basename(file_path)
resultList.extend(df.values)
return resultList
Voici quelques points à noter dans l’exemple de script :
AZUREML_MODEL_DIR
est une variable d’environnement que vous pouvez utiliser pour localiser les fichiers associés au modèle.- Utilisez la variable
global
pour que toutes les ressources nécessaires soient disponibles en vue de déterminer le score des nouvelles données, comme le modèle chargé. - La taille de
mini_batch
est définie dans la configuration du déploiement. Si les fichiers contenus dans le mini-lot sont trop volumineux pour être traités, vous devez les fractionner en fichiers plus petits. - Par défaut, les prédictions sont écrites dans un fichier unique.
Conseil
En savoir plus sur la procédure pour créer des scripts de scoring pour les déploiements par lots.
Créer un environnement
Votre déploiement a besoin d’un environnement d’exécution dans lequel exécuter le script de scoring. Toute dépendance requise par votre code doit être incluse dans l’environnement.
Vous pouvez créer un environnement avec une image Docker assortie de dépendances Conda ou avec un Dockerfile.
Vous devez également ajouter la bibliothèque azureml-core
, car elle est nécessaire pour le bon fonctionnement des déploiements par lots.
Pour créer un environnement à l’aide d’une image Docker de base, vous pouvez définir les dépendances Conda dans un fichier conda.yaml
:
name: basic-env-cpu
channels:
- conda-forge
dependencies:
- python=3.8
- pandas
- pip
- pip:
- azureml-core
- mlflow
Ensuite, pour créer l’environnement, exécutez le code suivant :
from azure.ai.ml.entities import Environment
env = Environment(
image="mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04",
conda_file="./src/conda-env.yml",
name="deployment-environment",
description="Environment created from a Docker image plus Conda environment.",
)
ml_client.environments.create_or_update(env)
Configurer et créer le déploiement
Enfin, vous pouvez configurer et créer le déploiement avec la classe BatchDeployment
.
from azure.ai.ml.entities import BatchDeployment, BatchRetrySettings
from azure.ai.ml.constants import BatchDeploymentOutputAction
deployment = BatchDeployment(
name="forecast-mlflow",
description="A sales forecaster",
endpoint_name=endpoint.name,
model=model,
compute="aml-cluster",
code_path="./code",
scoring_script="score.py",
environment=env,
instance_count=2,
max_concurrency_per_instance=2,
mini_batch_size=2,
output_action=BatchDeploymentOutputAction.APPEND_ROW,
output_file_name="predictions.csv",
retry_settings=BatchRetrySettings(max_retries=3, timeout=300),
logging_level="info",
)
ml_client.batch_deployments.begin_create_or_update(deployment)
Conseil
Découvrez la documentation de référence pour créer un déploiement par lot avec le kit SDK Python v2.