Déployer un modèle personnalisé sur un point de terminaison de lot

Effectué

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.