Déployer un modèle personnalisé sur un point de terminaison de traitement par lots

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 déjà créé un point de terminaison. 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 inclure deux fonctions :

  • init(): appelée une fois au début du processus, utilisez donc pour toute préparation coûteuse 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/liste.

Un script de scoring peut se présenter comme suit :

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

Il existe quelques points à noter à partir de 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 du mini_batch est définie dans la configuration du déploiement. Si les fichiers du mini-lot sont trop volumineux pour être traités, vous devez fractionner les fichiers en fichiers plus petits.
  • Par défaut, les prédictions sont écrites dans un seul fichier.

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 nécessite 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 avec des dépendances Conda ou avec un fichier Dockerfile.

Vous devez également ajouter la bibliothèque azureml-core car elle est nécessaire pour que les déploiements par lots fonctionnent.

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)