Partager via


Déployer des modèles pour le scoring dans des points de terminaison de lot

APPLIES TO :Extension Azure ML CLI v2 (actuelle)Kit de développement logiciel (SDK) Python azure-ai-ml v2 (préversion)

Les points de terminaison Batch vous permettent de déployer des modèles qui exécutent l’inférence sur de grands volumes de données. Ces points de terminaison simplifient l’hébergement de modèles pour le scoring par lots. Vous pouvez donc vous concentrer sur le Machine Learning au lieu de l’infrastructure.

Utilisez des points de terminaison par lot pour déployer des modèles lorsque :

  • Vous utilisez des modèles coûteux qui prennent plus de temps pour exécuter l’inférence.
  • Vous effectuez une inférence sur de grandes quantités de données distribuées dans plusieurs fichiers.
  • Vous n’avez pas besoin d’une faible latence.
  • Vous tirez parti de la parallélisation.

Cet article montre comment utiliser un point de terminaison de traitement par lots pour déployer un modèle Machine Learning qui résout le problème classique de reconnaissance numérique MNIST (Modified National Institute of Standards and Technology). Le modèle déployé effectue une inférence par lots sur de grandes quantités de données, telles que des fichiers image. Le processus commence par la création d’un déploiement par lots d’un modèle créé à l’aide de Torch. Ce déploiement devient la valeur par défaut dans le point de terminaison. Ensuite, créez un deuxième déploiement d’un modèle créé avec TensorFlow (Keras), testez le deuxième déploiement et définissez-le comme déploiement par défaut du point de terminaison.

Prérequis

Pour pouvoir suivre les étapes décrites dans cet article, vérifiez que vous disposez des prérequis suivants :

Cloner le référentiel d’exemples

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/coller le fichier YAML et d’autres fichiers, clonez d’abord le référentiel, puis modifiez les répertoires dans le dossier :

git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli/endpoints/batch/deploy-models/mnist-classifier

Préparer votre système

Se connecter à un espace de travail

Connectez-vous d'abord à l'espace de travail Azure Machine Learning dans lequel vous allez travailler.

Si vous n’avez pas encore défini les paramètres par défaut pour l’interface CLI Azure, enregistrez vos paramètres par défaut. Pour éviter d’entrer les valeurs de votre abonnement, espace de travail, groupe de ressources et emplacement plusieurs fois, exécutez ce code :

az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>

Créer une capacité de calcul

Les points de terminaison de traitement par lots s’exécutent sur des clusters de calcul, et prennent en charge à la fois les clusters de calcul Azure Machine Learning (AmlCompute) et les clusters Kubernetes. Les clusters sont une ressource partagée. Un même cluster peut donc héberger un ou plusieurs déploiements par lots (avec d’autres charges de travail, le cas échéant).

Créez un calcul nommé batch-cluster, comme indiqué dans le code suivant. Ajustez si nécessaire et consultez votre calcul à l’aide de azureml:<your-compute-name>.

az ml compute create -n batch-cluster --type amlcompute --min-instances 0 --max-instances 5

Remarque

Le calcul ne vous est pas facturé à ce stade, car le cluster reste à 0 nœud jusqu’à ce qu’un point de terminaison de traitement par lots soit appelé, et qu’un travail de scoring par lots soit envoyé. Pour plus d’informations sur les coûts de calcul, consultez Gérer et optimiser les coûts pour AmlCompute.

Créer un point de terminaison de traitement de lots

Un point d'accès par lots est un point de terminaison HTTPS que les clients appellent pour déclencher une tâche d'évaluation par lots. Un processus de scoring par lots évalue plusieurs entrées. Un déploiement par lots est un ensemble de ressources de calcul hébergeant le modèle qui effectue le scoring par lots (ou l'inférence par lots). Un point de terminaison de traitement de lots peut avoir plusieurs déploiements de lot. Pour plus d’informations sur les points de terminaison de traitement par lots, consultez Qu’est-ce que les points de terminaison batch ?.

Conseil

L’un des déploiements par lots sert de déploiement par défaut pour le point de terminaison. Lorsque le point de terminaison est appelé, le déploiement par défaut effectue une évaluation par lots. Pour plus d’informations sur les points de terminaison et les déploiements par lots, consultez les points de terminaison de lot et le déploiement par lots.

  1. Nommez le point de terminaison. Le nom du point de terminaison doit être unique dans une région Azure , car le nom est inclus dans l’URI du point de terminaison. Par exemple, il ne peut y avoir qu’un seul point de terminaison de traitement par lots avec le nom mybatchendpoint dans westus2.

    Placez le nom du point de terminaison dans une variable pour la référencer facilement ultérieurement.

    ENDPOINT_NAME="mnist-batch"
    
  2. Configurer le point de terminaison de traitement par lots

    Le fichier YAML suivant définit un point de terminaison de lot. Utilisez ce fichier avec la commande CLI pour la création du point de terminaison batch.

    endpoint.yml

    $schema: https://azuremlschemas.azureedge.net/latest/batchEndpoint.schema.json
    name: mnist-batch
    description: A batch endpoint for scoring images from the MNIST dataset.
    tags:
      type: deep-learning
    

    Le tableau suivant décrit les propriétés de clé du point de terminaison. Pour le schéma YAML du point de terminaison de lot complet, consultez la page Schéma YAML du point de terminaison de lot CLI (v2).

    Clé Descriptif
    name Nom du point de terminaison de lot. Doit être unique au niveau de la région Azure.
    description Description du point de terminaison de traitement par lots. Cette propriété est facultative.
    tags Balises à inclure dans le point de terminaison. Cette propriété est facultative.
  3. Créez le point de terminaison :

    Exécutez ce code pour créer un point de terminaison de traitement par lots.

    az ml batch-endpoint create --file endpoint.yml  --name $ENDPOINT_NAME
    

Créer un déploiement par lots

Un déploiement de modèle est un ensemble de ressources nécessaires pour héberger le modèle qui effectue l’inférence réelle. Pour créer un déploiement de modèle par lots, vous avez besoin des éléments suivants :

  • Un modèle inscrit dans l’espace de travail
  • Le code permettant d’effectuer un scoring du modèle
  • Un environnement dans lequel les dépendances du modèle sont installées
  • Le calcul créé au préalable et les paramètres de ressource
  1. Commencez par inscrire le modèle à déployer : un modèle Torch pour le célèbre problème de reconnaissance de chiffres (MNIST). Les déploiements par lots peuvent uniquement déployer des modèles inscrits dans l’espace de travail. Vous pouvez ignorer cette étape si le modèle à déployer est déjà inscrit.

    Conseil

    Les modèles sont associés au déploiement plutôt qu’au point de terminaison. Cela signifie qu’un même point de terminaison peut mettre à disposition différents modèles (ou différentes versions de modèle), à condition que les différents modèles (ou différentes versions de modèle) soient déployés dans des déploiements distincts.

    MODEL_NAME='mnist-classifier-torch'
    az ml model create --name $MODEL_NAME --type "custom_model" --path "deployment-torch/model"
    
  2. Il est temps de créer un script de scoring. Les déploiements par lots nécessitent un script de scoring qui indique comment un modèle donné doit être exécuté et comment les données d’entrée doivent être traitées. Les points de terminaison de traitement par lots prennent en charge les scripts créés en Python. Dans le cas présent, vous déployez un modèle qui lit des fichiers image représentant des chiffres, et génère le chiffre correspondant. Le script de scoring se présente comme suit :

    Remarque

    Pour les modèles MLflow, Azure Machine Learning génère automatiquement le script de scoring : vous n’êtes donc pas obligé d’en fournir un. Si votre modèle est un modèle MLflow, vous pouvez ignorer cette étape. Pour plus d’informations sur le fonctionnement des points de terminaison de traitement par lots avec les modèles MLflow, consultez l’article Utilisation de modèles MLflow dans les déploiements par lots.

    Avertissement

    Si vous déployez un modèle AutoML (Machine Learning automatisé) sous un point de terminaison de traitement par lots, notez que le script de scoring fourni par AutoML fonctionne uniquement pour les points de terminaison en ligne, et qu’il n’est pas conçu pour l’exécution par lots. Pour plus d’informations sur la création d’un script de scoring pour votre déploiement par lots, consultez Créer des scripts de scoring pour les déploiements par lots.

    deployment-torch/code/batch_driver.py

    import os
    import pandas as pd
    import torch
    import torchvision
    import glob
    from os.path import basename
    from mnist_classifier import MnistClassifier
    from typing import List
    
    
    def init():
        global model
        global device
    
        # AZUREML_MODEL_DIR is an environment variable created during deployment
        # It is the path to the model folder
        model_path = os.environ["AZUREML_MODEL_DIR"]
        model_file = glob.glob(f"{model_path}/*/*.pt")[-1]
    
        model = MnistClassifier()
        model.load_state_dict(torch.load(model_file))
        model.eval()
    
        device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
    
    
    def run(mini_batch: List[str]) -> pd.DataFrame:
        print(f"Executing run method over batch of {len(mini_batch)} files.")
    
        results = []
        with torch.no_grad():
            for image_path in mini_batch:
                image_data = torchvision.io.read_image(image_path).float()
                batch_data = image_data.expand(1, -1, -1, -1)
                input = batch_data.to(device)
    
                # perform inference
                predict_logits = model(input)
    
                # Compute probabilities, classes and labels
                predictions = torch.nn.Softmax(dim=-1)(predict_logits)
                predicted_prob, predicted_class = torch.max(predictions, axis=-1)
    
                results.append(
                    {
                        "file": basename(image_path),
                        "class": predicted_class.numpy()[0],
                        "probability": predicted_prob.numpy()[0],
                    }
                )
    
        return pd.DataFrame(results)
    
  3. Créez un environnement dans lequel votre déploiement par lots s’exécute. L’environnement doit inclure les packages azureml-core et azureml-dataset-runtime[fuse], nécessaires aux points de terminaison de traitement par lots ainsi que les dépendances nécessaires à l’exécution de votre code. Dans le cas présent, les dépendances ont été capturées dans un fichier conda.yaml :

    deployment-torch/environment/conda.yaml

    name: mnist-env
    channels:
      - conda-forge
    dependencies:
      - python=3.8.5
      - pip<22.0
      - pip:
        - torch==1.13.0
        - torchvision==0.14.0
        - pytorch-lightning
        - pandas
        - azureml-core
        - azureml-dataset-runtime[fuse]
    

    Important

    Les packages azureml-core et azureml-dataset-runtime[fuse] sont requis par les déploiements par lots et doivent être inclus dans les dépendances d’environnement.

    Spécifiez l’environnement de la façon suivante :

    La définition d’environnement est incluse dans la définition de déploiement elle-même en tant qu’environnement anonyme. Vous voyez les lignes suivantes dans le déploiement :

    environment:
      name: batch-torch-py38
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu22.04:latest
      conda_file: environment/conda.yaml
    
  4. Accédez à l’onglet Environnements dans le menu latéral.

  5. Sélectionnez Environnements> personnalisésCréer.

    1. Entrez le nom de l’environnement, en l’occurrence torch-batch-env.

    2. Pour Sélectionner une source d’environnement, sélectionnez Utiliser une image Docker existante avec un fichier Conda facultatif.

    3. Pour Chemin de l’image de registre de conteneurs, entrez mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04.

    4. Sélectionnez Suivant pour accéder à la section « Personnaliser ».

    5. Copiez le contenu du fichier deployment-torch/environment/conda.yaml du dépôt GitHub vers le portail.

  6. Sélectionnez Suivant jusqu’à atteindre la page « Révision ».

  7. Sélectionnez Créer et attendre que l’environnement soit prêt.


    Avertissement

    Les environnements organisés ne sont pas pris en charge dans les déploiements par lots. Vous devez spécifier votre propre environnement. Vous pouvez toujours utiliser l’image de base d’un environnement organisé comme la vôtre pour simplifier le processus.

  8. Créer une nouvelle définition de déploiement

    deployment-torch/deployment.yml

    $schema: https://azuremlschemas.azureedge.net/latest/modelBatchDeployment.schema.json
    name: mnist-torch-dpl
    description: A deployment using Torch to solve the MNIST classification dataset.
    endpoint_name: mnist-batch
    type: model
    model:
      name: mnist-classifier-torch
      path: model
    code_configuration:
      code: code
      scoring_script: batch_driver.py
    environment:
      name: batch-torch-py38
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu22.04:latest
      conda_file: environment/conda.yaml
    compute: azureml:batch-cluster
    resources:
      instance_count: 1
    settings:
      max_concurrency_per_instance: 2
      mini_batch_size: 10
      output_action: append_row
      output_file_name: predictions.csv
      retry_settings:
        max_retries: 3
        timeout: 30
      error_threshold: -1
      logging_level: info
    

    Le tableau suivant décrit les propriétés clés du déploiement par lots. Pour le schéma YAML complet du déploiement par lots, consultez la page Schéma YAML de déploiement par lots CLI (v2).

    Clé Descriptif
    name Le nom du déploiement.
    endpoint_name Nom du point de terminaison sous lequel créer le déploiement.
    model Modèle à utiliser pour le scoring par lots. L’exemple définit un modèle inclus à l’aide de path. Cette définition permet de charger et d’inscrire automatiquement les fichiers de modèles avec un nom et une version générés automatiquement. Pour plus d’options, consultez le Schéma de modèle. En guise de bonne pratique pour les scénarios de production, vous devez créer le modèle séparément et le référencer ici. Pour référencer un modèle existant, utilisez la syntaxe azureml:<model-name>:<model-version>.
    code_configuration.code Répertoire local qui contient tout le code source Python de scoring du modèle.
    code_configuration.scoring_script Fichier Python dans le répertoire code_configuration.code. Ce fichier doit avoir une fonction init() et une fonction run(). Utilisez la fonction init() pour toute préparation coûteuse ou courante (par exemple charger le modèle en mémoire). init() n’est appelé qu’une seule fois au début du processus. Utilisez run(mini_batch) pour effectuer le scoring de chaque entrée. La valeur de mini_batch est une liste de chemins de fichiers. La fonction run() doit retourner un dataframe pandas ou un tableau. Chaque élément retourné indique une exécution réussie d’un élément d’entrée dans le mini_batch. Pour plus d’informations sur la création d’un script de scoring, consultez Compréhension du script de scoring.
    environment L’environnement pour évaluer le modèle. L’exemple définit un environnement inline à l’aide de conda_file et image. Les dépendances conda_file sont installées au-dessus du image. L’environnement est automatiquement inscrit avec un nom et une version générés automatiquement. Pour plus d’options, consultez le Schéma d’environnement. En guise de bonne pratique pour les scénarios de production, vous devez créer l’environnement séparément et le référencer ici. Pour référencer un environnement existant, utilisez la syntaxe azureml:<environment-name>:<environment-version>.
    compute Le calcul pour exécuter le scoring par lots. L’exemple utilise le batch-cluster créé au début, et le référence à l’aide de la syntaxeazureml:<compute-name>.
    resources.instance_count Nombre d’instances à utiliser pour chaque travail de scoring par lots.
    settings.max_concurrency_per_instance Nombre maximal d’exécutions scoring_script parallèles par instance.
    settings.mini_batch_size Nombre de fichiers qu’un scoring_script peut traiter en un appel run().
    settings.output_action Mode d’organisation de la sortie dans le fichier de sortie. append_row fusionne tous les résultats de sortie run() retournés dans un seul fichier nommé output_file_name. summary_only ne fusionne pas les résultats de sortie, et calcule uniquement error_threshold.
    settings.output_file_name Nom du fichier de sortie de scoring par lots pour append_rowoutput_action.
    settings.retry_settings.max_retries Nombre maximal de tentatives pour un échec d’un scoring_scriptrun().
    settings.retry_settings.timeout Délai d’attente, en secondes, pour un scoring_scriptrun() pour le scoring d’un mini-lot.
    settings.error_threshold Nombre d’échecs de scoring de fichier d’entrée qui doivent être ignorés. Si le nombre d’erreurs pour la totalité de l’entrée dépasse cette valeur, le travail de scoring par lots est interrompu. L’exemple utilise -1, qui indique que tout nombre d’échecs est autorisé sans terminer le travail de scoring par lots.
    settings.logging_level Verbosité du journal. Les valeurs permettant d’augmenter le niveau de détail sont : WARNING, INFO et DEBUG.
    settings.environment_variables Dictionnaire de paires nom-valeur de variable d’environnement à définir pour chaque travail de scoring par lots.
  9. Accédez à l’onglet Points de terminaison dans le menu latéral.

    1. Sélectionnez l’onglet Points de terminaison de traitement par lots>Créer.

    2. Donnez un nom au point de terminaison, en l’occurrence mnist-batch. Vous pouvez configurer le reste des champs ou les laisser vides.

    3. Sélectionnez Suivant pour accéder à la section « Modèle ».

    4. Sélectionnez le modèle mnist-classifier-torch.

    5. Sélectionnez Suivant pour accéder à la page « Déploiement ».

    6. Donnez un nom au déploiement.

  10. Pour l'action de sortie, vérifiez que Ajouter la ligne est sélectionné.

    1. Pour Nom du fichier de sortie, vérifiez que le fichier de sortie de scoring par lots est celui dont vous avez besoin. La valeur par défaut est predictions.csv.

    2. Pour Taille minimale de lot, ajustez la taille des fichiers à inclure dans chaque mini-lot. Cette taille contrôle la quantité de données que votre script de scoring reçoit par lot.

    3. Pour Délai d’expiration du scoring (en secondes), vérifiez que vous laissez suffisamment de temps à votre déploiement pour effectuer le scoring d’un lot de fichiers donné. Si vous augmentez le nombre de fichiers, vous devez généralement augmenter la valeur du délai d’expiration. Les modèles plus coûteux (comme ceux basés sur le Deep Learning) peuvent nécessiter des valeurs élevées dans ce champ.

    4. Pour Concurrence maximale par instance, configurez le nombre d’exécuteurs à avoir pour chaque instance de calcul que vous obtenez dans le déploiement. Un nombre plus élevé garantit un degré de parallélisation plus élevé, mais il augmente également la sollicitation de la mémoire sur l’instance de calcul. Ajustez cette valeur conjointement avec Taille minimale de lot.

    5. Une fois l’opération effectuée, sélectionnez Suivant pour accéder à la page « Code + environnement ».

    6. Pour « Sélectionner un script de scoring pour l’inférence », recherchez et sélectionnez le fichier de script de scoring deployment-torch/code/batch_driver.py.

    7. Dans la section « Sélectionner un environnement », sélectionnez l’environnement que vous avez créé torch-batch-env.

    8. Sélectionnez Suivant pour passer à la page « Calcul ».

    9. Sélectionnez le cluster de calcul que vous avez créé à une étape précédente.

      Avertissement

      Les clusters Azure Kubernetes sont pris en charge dans les déploiements par lots, mais uniquement quand ils sont créés avec Azure Machine Learning CLI ou le SDK Python.

    10. Pour Nombre d’instances, entrez le nombre d’instances de calcul souhaitées pour le déploiement. Dans le cas présent, utilisez 2.

    11. Sélectionnez Suivant.

  11. Créez 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 en tant que déploiement par défaut.

    az ml batch-deployment create --file deployment-torch/deployment.yml --endpoint-name $ENDPOINT_NAME --set-default
    

    Conseil

    Le paramètre --set-default définit le déploiement nouvellement créé comme déploiement par défaut du point de terminaison. C’est un moyen pratique de créer un nouveau déploiement de point de terminaison par défaut, en particulier pour la première création d’un déploiement. Conformément aux meilleures pratiques dans les scénarios de production, vous pouvez être amené à créer un déploiement sans le définir en tant que déploiement par défaut. Vérifiez que le déploiement fonctionne comme prévu, puis mettez-le à jour plus tard en tant que déploiement par défaut. Pour plus d’informations sur l’implémentation de ce processus, consultez la section Déployer un nouveau modèle.

  12. Vérifiez les détails du point de terminaison de traitement par lots et du déploiement.

    Utilisez show pour vérifier les détails relatifs au point de terminaison et au déploiement. Pour vérifier un déploiement par lots, exécutez le code suivant :

    DEPLOYMENT_NAME="mnist-torch-dpl"
    az ml batch-deployment show --name $DEPLOYMENT_NAME --endpoint-name $ENDPOINT_NAME
    
  13. Sélectionnez l’onglet Points de terminaison Batch .

    1. Sélectionnez le point de terminaison de traitement par lots à visualiser.

    2. La page Détails du point de terminaison affiche les détails du point de terminaison ainsi que tous les déploiements disponibles dans le point de terminaison.

      Capture d’écran montrant la vérification des détails des points de terminaison de traitement par lots et du déploiement.

Exécuter des points de terminaison de lot et accéder aux résultats

Vue d’ensemble des flux de données

Avant d’exécuter votre point de terminaison batch, comprenez comment les données transitent par le système :

Entrées : données à traiter (score). Cela inclut les éléments suivants :

  • Fichiers stockés dans stockage Azure (stockage d’objets blob, data lake)
  • Dossiers avec plusieurs fichiers
  • Jeux de données enregistrés dans Azure Machine Learning

Traitement : le modèle déployé traite les données d’entrée dans les lots (mini-lots) et génère des prédictions.

Sorties : résultats du modèle, stockés en tant que fichiers dans Stockage Azure. Par défaut, les sorties sont enregistrées dans le stockage dobjets blob par défaut de l’espace de travail, mais il est possible de spécifier un emplacement différent.

Appeler un point de terminaison de traitement par lots

L’appel d’un point de terminaison de lot déclenche un travail de scoring par lots. Le job name est retourné dans la réponse d'invocation et suit la progression du scoring par lots. Spécifiez le chemin des données d’entrée afin que les points de terminaison puissent localiser les données à noter. L’exemple suivant montre comment démarrer un nouveau travail sur un exemple de données du jeu de données MNIST stocké dans un compte de stockage Azure.

Vous pouvez exécuter et appeler un point de terminaison de traitement par lots à l’aide d’Azure CLI, du KIT de développement logiciel (SDK) Azure Machine Learning ou de points de terminaison REST. Pour plus d’informations sur ces options, consultez Créer des travaux et des données d’entrée pour les points de terminaison de lot.

Remarque

Comment fonctionne la parallélisation ?

Les déploiements batch distribuent le travail au niveau du fichier. Par exemple, un dossier contenant 100 fichiers et mini-lots de 10 fichiers génère 10 lots de 10 fichiers chacun. Cela se produit indépendamment de la taille du fichier. Si les fichiers sont trop volumineux pour le traitement par mini-lots, fractionnez-les en fichiers plus petits pour augmenter le parallélisme ou réduire le nombre de fichiers par mini-lot. Actuellement, les déploiements batch ne comptent pas pour les asymétries dans la distribution de taille de fichier.

JOB_NAME=$(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input $SAMPLE_INPUT_URI --input-type uri_folder --query name -o tsv)

Les points de terminaison de traitement par lots prennent en charge la lecture de fichiers ou de dossiers situés à différents emplacements. Pour en savoir plus sur les types pris en charge et sur la façon de les spécifier, consultez Accès aux données à partir de travaux de points de terminaison de traitement par lots.

Monitorer la progression de l’exécution du travail par lots

Les processus de scoring par lots prennent du temps à traiter toutes les entrées.

Le code suivant vérifie l’état du travail et génère un lien vers Azure Machine Learning Studio pour plus d’informations.

az ml job show -n $JOB_NAME --web

Vérifier les résultats du scoring par lots

Les sorties du travail sont stockées dans le stockage cloud, soit dans l’instance par défaut du service Stockage Blob de l’espace de travail, soit dans le stockage que vous avez spécifié. Pour savoir comment changer les valeurs par défaut, consultez Configurer l’emplacement de sortie. Les étapes suivantes vous permettent de voir les résultats du scoring dans l’Explorateur Stockage Azure, une fois le travail effectué :

  1. Exécutez le code suivant pour ouvrir le travail de scoring par lots dans Azure Machine Learning studio. Le lien Studio du travail est également inclus dans la réponse de invoke, en tant que valeur de interactionEndpoints.Studio.endpoint.

    az ml job show -n $JOB_NAME --web
    
  2. Dans le graphique du travail, sélectionnez l’étape batchscoring.

  3. Sélectionnez l’onglet Sorties + journaux, puis sélectionnez Afficher les sorties de données.

  4. À partir des Sorties de données, sélectionnez l’icône pour ouvrir l’Explorateur Stockage.

    Capture d’écran de Studio montrant l’emplacement d’affichage des sorties de données.

    Les résultats du scoring dans l’Explorateur Stockage sont similaires à l’exemple de page suivant :

    Capture d’écran de la sortie de scoring.

Configurer l’emplacement de sortie

Par défaut, les résultats de scoring par lots sont stockés dans le magasin d’objets blob par défaut de l’espace de travail, dans un dossier nommé en fonction du nom de travail (GUID généré par le système). Configurez l’emplacement de sortie lors de l’appel du point de terminaison batch.

Utilisez output-path pour configurer n’importe quel dossier dans un magasin de données Azure Machine Learning inscrit. La syntaxe de --output-path est identique à celle de --input quand vous spécifiez un dossier, c’est-à-dire azureml://datastores/<datastore-name>/paths/<path-on-datastore>/. Utilisez --set output_file_name=<your-file-name> pour configurer un nouveau nom de fichier de sortie.

OUTPUT_FILE_NAME=predictions_`echo $RANDOM`.csv
OUTPUT_PATH="azureml://datastores/workspaceblobstore/paths/$ENDPOINT_NAME"

JOB_NAME=$(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input $SAMPLE_INPUT_URI --output-path $OUTPUT_PATH --set output_file_name=$OUTPUT_FILE_NAME --query name -o tsv)

Avertissement

Vous devez utiliser un emplacement de sortie unique. Si le fichier de sortie existe, le travail de scoring par lots échoue.

Important

Contrairement aux entrées, les sorties peuvent être stockées uniquement dans les magasins de données Azure Machine Learning qui s’exécutent sur des comptes Stockage Blob.

Remplacer la configuration de déploiement pour chaque travail

Lorsque vous appelez un point de terminaison de traitement par lots, vous pouvez remplacer certains paramètres pour optimiser l’utilisation des ressources de calcul et améliorer les performances. Cette fonctionnalité est utile lorsque vous avez besoin de différents paramètres pour différents travaux sans modifier définitivement le déploiement.

Quels paramètres peuvent être substitués ?

Vous pouvez configurer les paramètres suivants par travail :

Réglage Quand utiliser Exemple de scénario
Nombre d’instances Lorsque vous avez des volumes de données variables Utilisez d’autres instances pour les jeux de données plus volumineux (10 instances pour 1 million de fichiers et 2 instances pour 100 000 fichiers).
Taille lini-batch Quand vous devez équilibrer le débit et l’utilisation de la mémoire Utilisez des lots plus petits (10 à 50 fichiers) pour les images volumineuses et les lots plus volumineux (100 à 500 fichiers) pour les petits fichiers texte.
Nombre total de tentatives Lorsque la qualité des données varie Nouvelles tentatives plus élevées (5 à 10) pour les données bruyantes ; nouvelles tentatives inférieures (1 à 3) pour les données propres
Délai d'expiration Lorsque le temps de traitement varie selon le type de données Délai d’expiration plus long (300s) pour les modèles complexes ; Délai d’expiration plus court (30s) pour les modèles simples
Seuil d’erreur Quand vous avez besoin de différents niveaux de tolérance de défaillance Seuil strict (-1) pour les travaux critiques ; seuil indulgent (10%) pour les travaux expérimentaux

Comment remplacer les paramètres

JOB_NAME=$(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input https://azuremlexampledata.blob.core.windows.net/data/mnist/sample --mini-batch-size 20 --instance-count 5 --query name -o tsv)

Ajouter des déploiements à un point de terminaison

Une fois que vous avez un point de terminaison de traitement par lots avec un déploiement, vous pouvez continuer à affiner votre modèle et ajouter de nouveaux déploiements. Les points de terminaison de traitement par lots continuent de servir le déploiement par défaut pendant que vous développez et déployez de nouveaux modèles sous le même point de terminaison. Les déploiements ne s’affectent pas les uns les autres.

Dans cet exemple, vous ajoutez un deuxième déploiement qui utilise un modèle créé avec Keras et TensorFlow pour résoudre le même problème MNIST.

Ajouter un deuxième déploiement

  1. Créez un environnement pour votre déploiement par lots. Incluez toutes les dépendances que votre code doit exécuter. Ajoutez la bibliothèque azureml-core, car elle est requise pour les déploiements par lots. La définition d’environnement suivante inclut les bibliothèques requises pour exécuter un modèle avec TensorFlow.

    La définition d’environnement est incluse dans la définition de déploiement elle-même en tant qu’environnement anonyme.

    environment:
      name: batch-tensorflow-py38
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu22.04:latest
      conda_file: environment/conda.yaml
    
  2. Copiez le contenu du fichier deployment-keras/environment/conda.yaml du dépôt GitHub vers le portail.

    1. Sélectionnez Suivant jusqu’à ce que vous arriviez à la « page Vérifier ».

    2. Sélectionnez Créer, puis attendez que l’environnement soit prêt à être utilisé.


    Le fichier conda utilisé se présente comme suit :

    deployment-keras/environment/conda.yaml

    name: tensorflow-env
    channels:
      - conda-forge
    dependencies:
      - python=3.8.5
      - pip
      - pip:
        - pandas
        - tensorflow
        - pillow
        - azureml-core
        - azureml-dataset-runtime[fuse]
    
  3. Créez un script de scoring pour le modèle :

    deployment-keras/code/batch_driver.py

    import os
    import numpy as np
    import pandas as pd
    import tensorflow as tf
    from typing import List
    from os.path import basename
    from PIL import Image
    from tensorflow.keras.models import load_model
    
    
    def init():
        global model
    
        # AZUREML_MODEL_DIR is an environment variable created during deployment
        model_path = os.path.join(os.environ["AZUREML_MODEL_DIR"], "model")
    
        # load the model
        model = load_model(model_path)
    
    
    def run(mini_batch: List[str]) -> pd.DataFrame:
        print(f"Executing run method over batch of {len(mini_batch)} files.")
    
        results = []
        for image_path in mini_batch:
            data = Image.open(image_path)
            data = np.array(data)
            data_batch = tf.expand_dims(data, axis=0)
    
            # perform inference
            pred = model.predict(data_batch)
    
            # Compute probabilities, classes and labels
            pred_prob = tf.math.reduce_max(tf.math.softmax(pred, axis=-1)).numpy()
            pred_class = tf.math.argmax(pred, axis=-1).numpy()
    
            results.append(
                {
                    "file": basename(image_path),
                    "class": pred_class[0],
                    "probability": pred_prob,
                }
            )
    
        return pd.DataFrame(results)
    
  4. Créer une nouvelle définition de déploiement

    deployment-keras/deployment.yml

    $schema: https://azuremlschemas.azureedge.net/latest/modelBatchDeployment.schema.json
    name: mnist-keras-dpl
    description: A deployment using Keras with TensorFlow to solve the MNIST classification dataset.
    endpoint_name: mnist-batch
    type: model
    model: 
      name: mnist-classifier-keras
      path: model
    code_configuration:
      code: code
      scoring_script: batch_driver.py
    environment:
      name: batch-tensorflow-py38
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu22.04:latest
      conda_file: environment/conda.yaml
    compute: azureml:batch-cluster
    resources:
      instance_count: 1
    settings:
      max_concurrency_per_instance: 2
      mini_batch_size: 10
      output_action: append_row
      output_file_name: predictions.csv
    
  5. Sélectionnez Suivant pour passer à la page « Code + environnement ».

    1. Pour Sélectionner un script de scoring pour l’inférence, recherchez et sélectionnez le fichier de script de scoring deployment-keras/code/batch_driver.py.

    2. Pour Sélectionner un environnement, sélectionnez l’environnement que vous avez créé à une étape précédente.

    3. Sélectionnez Suivant.

    4. Dans la page Calcul, sélectionnez le cluster de calcul que vous avez créé à une étape précédente.

    5. Pour Nombre d’instances, entrez le nombre d’instances de calcul souhaitées pour le déploiement. Dans le cas présent, utilisez 2.

    6. Sélectionnez Suivant.

  6. Créez 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 --file deployment-keras/deployment.yml --endpoint-name $ENDPOINT_NAME
    

    Conseil

    Le paramètre --set-default est manquant dans ce cas. Conformément aux meilleures pratiques dans les scénarios de production, créez un déploiement sans le définir en tant que déploiement par défaut. Vérifiez-le ensuite, puis mettez-le à jour plus tard en tant que déploiement par défaut.

Tester un déploiement par lots autre que celui par défaut

Pour tester le nouveau déploiement non défini par défaut, vous devez connaître le nom du déploiement à exécuter.

DEPLOYMENT_NAME="mnist-keras-dpl"
JOB_NAME=$(az ml batch-endpoint invoke --name $ENDPOINT_NAME --deployment-name $DEPLOYMENT_NAME --input $SAMPLE_INPUT_URI --input-type uri_folder --query name -o tsv)

Notez que --deployment-name est utilisé pour spécifier le déploiement à exécuter. Avec ce paramètre, vous pouvez invoke un déploiement non défini par défaut sans mettre à jour le déploiement par défaut du point de terminaison de traitement par lots.

Mettre à jour le déploiement par lots par défaut

Bien que vous puissiez appeler un déploiement spécifique dans un point de terminaison, vous appelez généralement le point de terminaison lui-même, et le laissez décider du déploiement à utiliser, à savoir le déploiement par défaut. Vous pouvez changer le déploiement par défaut (et, ainsi, changer le modèle prenant en charge le déploiement) sans changer votre contrat avec l’utilisateur qui appelle le point de terminaison. Utilisez le code suivant pour mettre à jour le déploiement par défaut :

az ml batch-endpoint update --name $ENDPOINT_NAME --set defaults.deployment_name=$DEPLOYMENT_NAME

Supprimer le point de terminaison de lot et le déploiement

Si vous n’avez pas besoin de l’ancien déploiement de lots, supprimez-le en exécutant le code suivant. L’indicateur --yes confirme la suppression.

az ml batch-deployment delete --name mnist-torch-dpl --endpoint-name $ENDPOINT_NAME --yes

Exécutez le code suivant pour supprimer le point de terminaison de traitement par lots et ses déploiements sous-jacents. Les travaux de scoring par lots ne sont pas supprimés.

az ml batch-endpoint delete --name $ENDPOINT_NAME --yes