Partager via


Comment utiliser un travail parallèle dans le pipeline (V2)

S’APPLIQUE À :Extension Azure CLI v2 (actuelle)Kit de développement logiciel (SDK) Python azure-ai-ml v2 (version actuelle)

Le travail parallèle permet aux utilisateurs d’accélérer l’exécution de leur travail en distribuant des tâches répétées sur de puissants clusters de calcul à plusieurs nœuds. Par exemple, prenez le scénario dans lequel vous exécutez un modèle de détection d’objet sur un grand ensemble d’images. Avec le travail parallèle Azure Machine Learning, vous pouvez facilement distribuer vos images pour exécuter du code personnalisé en parallèle sur un cluster de calcul spécifique. La parallélisation peut réduire considérablement le coût dans la durée. En outre, en utilisant un travail parallèle Azure Machine Learning, vous pouvez simplifier et automatiser votre processus pour le rendre plus efficace.

Prérequis

Le travail parallèle Azure Machine Learning ne peut être utilisé qu’en tant qu’une des étapes d’un travail de pipeline. Il est donc important d’être familiarisé avec l’utilisation de pipelines. Pour en savoir plus sur Azure Machine Learning, consultez les articles suivants.

Pourquoi les travaux parallèles sont-ils nécessaires ?

Dans le monde réel, les ingénieurs ML ont toujours des exigences de mise à l’échelle sur leurs tâches d’entraînement ou d’inférence. Par exemple, lorsqu’un scientifique des données fournit un script unique pour entraîner un modèle de prédiction des ventes, les ingénieurs ML doivent appliquer cette tâche de formation à chaque magasin individuel. Pendant ce processus de scale-out, certains défis sont les suivants :

  • Pression différée causée par un temps d’exécution long.
  • Intervention manuelle pour gérer les problèmes inattendus afin de maintenir la tâche en cours.

La valeur principale du travail parallèle Azure Machine Learning consiste à fractionner une seule tâche série en mini-lots et à distribuer ces mini-lots à plusieurs calculs pour qu’ils soient exécutés en parallèle. En utilisant des travaux parallèles, nous pouvons :

  • Réduire considérablement le temps d’exécution de bout en bout.
  • Utiliser les paramètres de gestion automatique des erreurs du travail parallèle Azure Machine Learnin.

Vous devez envisager d’utiliser le travail parallèle Azure Machine Learning si :

  • Vous envisagez d’entraîner de nombreux modèles en plus de vos données partitionnés.
  • Vous souhaitez accélérer votre tâche d’inférence de lot à grande échelle.

Préparer un travail parallèle

Contrairement à d’autres types de travaux, un travail parallèle nécessite une préparation. Suivez les sections suivantes pour préparer la création de votre travail parallèle.

Déclarer les entrées à distribuer et le paramétrage de la division des données

Le travail parallèle nécessite qu’une seule donnée d’entrée majeure soit fractionnée et traitée avec parallèle. Les données d’entrée principales peuvent être des données tabulaires ou un ensemble de fichiers. Différents types d’entrée peuvent avoir une méthode de division des données

Le tableau suivant illustre la relation entre les données d’entrée et la méthode de division des données :

Format de données Type d’entrée Azure Machine Learning Mode d’entrée Azure Machine Learning Méthode de division des données
Liste de fichiers mltable ou
uri_folder
ro_mount ou
télécharger
Par taille (nombre de fichiers)
Par partition
Données tabulaires mltable directes Par taille (taille physique estimée)
Par partition

Vous pouvez déclarer vos données d’entrée principales avec l’attribut input_data dans le Kit de développement logiciel (SDK) YAML ou Python du travail parallèle. Et vous pouvez le lier à l’une de vos inputs définies de votre travail parallèle en utilisant ${{inputs.<input name>}}. Ensuite, vous devez définir la méthode de division des données pour votre entrée principale en renseignant un attribut différent :

Méthode de division des données Nom de l’attribut Type d'attribut Exemple de travail
Par taille mini_batch_size string Prédiction par lots Iris
Par partition partition_keys Liste de chaînes Prédiction des ventes de jus d’orange

S’APPLIQUE À :Extension Azure ML CLI v2 (actuelle)

batch_prediction:
  type: parallel
  compute: azureml:cpu-cluster
  inputs:
    input_data: 
      type: mltable
      path: ./neural-iris-mltable
      mode: direct
    score_model: 
      type: uri_folder
      path: ./iris-model
      mode: download
  outputs:
    job_output_file:
      type: uri_file
      mode: rw_mount

  input_data: ${{inputs.input_data}}
  mini_batch_size: "10kb"
  resources:
      instance_count: 2
  max_concurrency_per_instance: 2

  logging_level: "DEBUG"
  mini_batch_error_threshold: 5
  retry_settings:
    max_retries: 2
    timeout: 60

Une fois que vous avez défini le paramètre de division des données, vous pouvez configurer le nombre de ressources pour votre parallélisation en indiquant les deux attributs ci-dessous :

Nom de l’attribut Type Description Valeur par défaut
instance_count entier Nombre de nœuds à dédier au travail. 1
max_concurrency_per_instance entier Nombre de processeurs sur chaque nœud. Pour un calcul GPU, la valeur par défaut est 1.
Pour un calcul CPU, la valeur par défaut est le nombre de cœurs.

Ces deux attributs fonctionnent avec votre cluster de calcul spécifié.

Diagramme montrant le fonctionnement des données distribuées dans un travail parallèle.

Exemple de code pour définir deux attributs :

S’APPLIQUE À :Extension Azure ML CLI v2 (actuelle)

batch_prediction:
  type: parallel
  compute: azureml:cpu-cluster
  inputs:
    input_data: 
      type: mltable
      path: ./neural-iris-mltable
      mode: direct
    score_model: 
      type: uri_folder
      path: ./iris-model
      mode: download
  outputs:
    job_output_file:
      type: uri_file
      mode: rw_mount

  input_data: ${{inputs.input_data}}
  mini_batch_size: "10kb"
  resources:
      instance_count: 2
  max_concurrency_per_instance: 2

  logging_level: "DEBUG"
  mini_batch_error_threshold: 5
  retry_settings:
    max_retries: 2
    timeout: 60

Notes

Si vous utilisez tabulaire mltable comme données d’entrée principales, vous devez disposer du fichier de spécification MLTABLE avec la section transformations - read_delimited remplie sous votre chemin d’accès spécifique. Pour plus d’exemples, consultez Créer une ressource de données mltable

Implémenter des fonctions prédéfinies dans le script d’entrée

Le script d’entrée est un fichier Python unique dans lequel l’utilisateur doit implémenter trois fonctions prédéfinies avec du code personnalisé. Le travail parallèle Azure Machine Learning suit le diagramme ci-dessous pour les exécuter dans chaque processeur.

Diagramme montrant le fonctionnement du script d’entrée dans un travail parallèle.

Nom de la fonction Obligatoire Description Entrée Renvoie
Init() O Utilisez cette fonction pour la préparation courante avant de commencer à exécuter des mini-lots. Par exemple, utilisez-la pour charger le modèle dans un objet global. -- --
Run(mini_batch) O Implémentez la logique d’exécution principale pour mini_batches. mini_batch :
Trame de données Pandas si les données d’entrée sont des données tabulaires.
Liste du chemin d’accès au fichier si les données d’entrée sont un répertoire.
Trame de données, liste ou tuple.
Shutdown() N Fonction facultative pour effectuer un nettoyage personnalisé avant de retourner le calcul au pool. -- --

Consultez les exemples de script d’entrée suivants pour obtenir plus de détails :

Une fois que le script d’entrée est prêt, vous pouvez définir les deux attributs suivants pour l’utiliser dans votre travail parallèle :

Nom de l’attribut Type Description Valeur par défaut
code string Chemin d’accès local au répertoire du code source à télécharger et à utiliser pour le travail.
entry_script string Fichier Python qui contient l’implémentation de fonctions parallèles prédéfinies.

Exemple de code pour définir deux attributs :

S’APPLIQUE À :Extension Azure ML CLI v2 (actuelle)

batch_prediction:
  type: parallel
  compute: azureml:cpu-cluster
  inputs:
    input_data: 
      type: mltable
      path: ./neural-iris-mltable
      mode: direct
    score_model: 
      type: uri_folder
      path: ./iris-model
      mode: download
  outputs:
    job_output_file:
      type: uri_file
      mode: rw_mount

  input_data: ${{inputs.input_data}}
  mini_batch_size: "10kb"
  resources:
      instance_count: 2
  max_concurrency_per_instance: 2

  logging_level: "DEBUG"
  mini_batch_error_threshold: 5
  retry_settings:
    max_retries: 2
    timeout: 60

  task:
    type: run_function
    code: "./script"
    entry_script: iris_prediction.py
    environment:
      name: "prs-env"
      version: 1
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04
      conda_file: ./environment/environment_parallel.yml
    program_arguments: >-
      --model ${{inputs.score_model}}
      --error_threshold 5
      --allowed_failed_percent 30
      --task_overhead_timeout 1200
      --progress_update_timeout 600
      --first_task_creation_timeout 600
      --copy_logs_to_parent True
      --resource_monitor_interva 20
    append_row_to: ${{outputs.job_output_file}}

Important

La fonction Run(mini_batch) nécessite un retour d’un élément de trame de données, de liste ou de tuple. Le travail parallèle utilise le nombre de ce retour pour mesurer les éléments de réussite sous ce mini-lot. Idéalement, le nombre de mini-lots doit être égal au nombre de listes de retour si tous les éléments ont été bien traités dans ce mini-lot.

Important

Si vous souhaitez analyser des arguments dans Init() ou Run(mini_batch), utilisez « parse_known_args » au lieu de « parse_args » pour éviter les exceptions. Consultez l’exemple iris_score pour le script d’entrée avec l’analyseur d’arguments.

Important

Si vous utilisez mltable comme données d’entrée principales, vous devez installer la bibliothèque « mltable » dans votre environnement. Consultez la ligne 9 de cet exemple de fichier conda.

Prendre en compte les paramètres d’automatisation

Le travail parallèle Azure Machine Learning expose de nombreux paramètres pour contrôler automatiquement le travail sans intervention manuelle. Pour plus de détails, consultez le tableau suivant.

Clé Type Description Valeurs autorisées Valeur par défaut Définir dans l’attribut Définir dans les arguments du programme
seuil d’erreur du mini-lot entier Définissez le nombre de mini-lots ayant échoué qui peuvent être ignorés dans ce travail parallèle. Si le nombre de mini-lots ayant échoué est supérieur à ce seuil, le travail parallèle est marqué comme ayant échoué.

Le mini-lot est marqué comme ayant échoué si :
- le nombre de retours de run() est inférieur au nombre d’entrées par mini-lot.
- des exceptions ont été interceptées dans le code run() personnalisé.

« -1 » est le nombre par défaut, ce qui signifie ignorer tous les mini-lots ayant échoué pendant le travail parallèle.
[-1, int.max] -1 mini_batch_error_threshold N/A
nouvelles tentatives max. de mini-lots entier Définissez le nombre de nouvelles tentatives lors de l’échec ou du délai d’expiration du mini-lot. Si toutes les nouvelles tentatives ont échoué, le mini-lot est marqué comme ayant échoué par calcul mini_batch_error_threshold. [0, int.max] 2 retry_settings.max_retries N/A
délai d’expiration du mini-lot entier Définissez le délai d’expiration en secondes pour l’exécution de la fonction run() personnalisée. Si le temps d’exécution est supérieur à ce seuil, le mini-lot est abandonné et marqué comme un mini-lot ayant échoué pour déclencher une nouvelle tentative. (0, 259200] 60 retry_settings.timeout N/A
seuil d'erreur de l’élément entier Le seuil des éléments ayant échoué. Les éléments ayant échoué sont comptabilisés par l’écart de nombre entre les entrées et les retours de chaque mini-lot. Si le nombre de mini-lots ayant échoué est supérieur à ce seuil, le travail parallèle est marqué comme ayant échoué.

Remarque : « -1 » est le nombre par défaut, ce qui signifie ignorer tous les mini-lots ayant échoué pendant le travail parallèle.
[-1, int.max] -1 N/A --error_threshold
pourcentage d’échec autorisé entier Similaire à mini_batch_error_threshold mais utilise le pourcentage de mini-lots ayant échoué au lieu du nombre. [0, 100] 100 N/A --allowed_failed_percent
expiration du délai d’attente entier Délai d’expiration en seconde pour l’initialisation de chaque mini-lot. Par exemple, chargez des données mini-batch et transmettez-la à la fonction run(). (0, 259200] 600 N/A --task_overhead_timeout
délai d’expiration de la mise à jour de progression entier Délai d’expiration en seconde pour surveiller la progression de l’exécution de mini-lots. Si aucune mise à jour de progression n’est reçue dans ce paramètre de délai d’expiration, le travail parallèle est marqué comme ayant échoué. (0, 259200] Calculé dynamiquement par d’autres paramètres. N/A --progress_update_timeout
dépassement du délai de création de la première tâche entier Le délai en secondes pour contrôler le temps entre le début du travail et l'exécution du premier mini-lot. (0, 259200] 600 N/A --first_task_creation_timeout
niveau de journalisation string Définissez quel niveau de journaux sera sauvegardé vers les fichiers journaux utilisateur. INFORMATIONS, AVERTISSEMENT ou DÉBOGAGE INFO Niveau de journalisation N/A
ajouter une ligne à string Agrégez tous les retours de chaque exécution de mini-lot et sortez-le dans ce fichier. Peut faire référence à l’une des sorties du travail parallèle à l’aide de l’expression ${{outputs.<>output_name}} task.append_row_to N/A
copier des journaux d’activité vers le parent string Option booléenne permettant de copier la progression, la vue d’ensemble et les journaux du travail vers le pipeline parent. True ou False Faux N/A --copy_logs_to_parent
intervalle du moniteur de ressources entier Intervalle de temps en secondes pour sauvegarder l’utilisation des ressources de nœud (par exemple, processeur, mémoire) dans le dossier journal sous le chemin « logs/sys/perf ».

Remarque : les journaux de ressources de sauvegarde fréquents ralentiront légèrement la vitesse d’exécution de votre mini-lot. Définissez cette valeur sur « 0 » pour arrêter la sauvegarde de l’utilisation des ressources.
[0, int.max] 600 N/A --resource_monitor_interval

Exemple de code pour mettre à jour ces paramètres :

S’APPLIQUE À :Extension Azure ML CLI v2 (actuelle)

batch_prediction:
  type: parallel
  compute: azureml:cpu-cluster
  inputs:
    input_data: 
      type: mltable
      path: ./neural-iris-mltable
      mode: direct
    score_model: 
      type: uri_folder
      path: ./iris-model
      mode: download
  outputs:
    job_output_file:
      type: uri_file
      mode: rw_mount

  input_data: ${{inputs.input_data}}
  mini_batch_size: "10kb"
  resources:
      instance_count: 2
  max_concurrency_per_instance: 2

  logging_level: "DEBUG"
  mini_batch_error_threshold: 5
  retry_settings:
    max_retries: 2
    timeout: 60

  task:
    type: run_function
    code: "./script"
    entry_script: iris_prediction.py
    environment:
      name: "prs-env"
      version: 1
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04
      conda_file: ./environment/environment_parallel.yml
    program_arguments: >-
      --model ${{inputs.score_model}}
      --error_threshold 5
      --allowed_failed_percent 30
      --task_overhead_timeout 1200
      --progress_update_timeout 600
      --first_task_creation_timeout 600
      --copy_logs_to_parent True
      --resource_monitor_interva 20
    append_row_to: ${{outputs.job_output_file}}

Créer un travail parallèle dans le pipeline

S’APPLIQUE À :Extension Azure ML CLI v2 (actuelle)

Vous pouvez créer votre travail parallèle en ligne avec votre travail de pipeline :

$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json
type: pipeline

display_name: iris-batch-prediction-using-parallel
description: The hello world pipeline job with inline parallel job
tags:
  tag: tagvalue
  owner: sdkteam

settings:
  default_compute: azureml:cpu-cluster

jobs:
  batch_prediction:
    type: parallel
    compute: azureml:cpu-cluster
    inputs:
      input_data: 
        type: mltable
        path: ./neural-iris-mltable
        mode: direct
      score_model: 
        type: uri_folder
        path: ./iris-model
        mode: download
    outputs:
      job_output_file:
        type: uri_file
        mode: rw_mount

    input_data: ${{inputs.input_data}}
    mini_batch_size: "10kb"
    resources:
        instance_count: 2
    max_concurrency_per_instance: 2

    logging_level: "DEBUG"
    mini_batch_error_threshold: 5
    retry_settings:
      max_retries: 2
      timeout: 60

    task:
      type: run_function
      code: "./script"
      entry_script: iris_prediction.py
      environment:
        name: "prs-env"
        version: 1
        image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04
        conda_file: ./environment/environment_parallel.yml
      program_arguments: >-
        --model ${{inputs.score_model}}
        --error_threshold 5
        --allowed_failed_percent 30
        --task_overhead_timeout 1200
        --progress_update_timeout 600
        --first_task_creation_timeout 600
        --copy_logs_to_parent True
        --resource_monitor_interva 20
      append_row_to: ${{outputs.job_output_file}}

Envoyer un travail de pipeline et vérifier l’étape parallèle dans l’interface utilisateur de Studio

S’APPLIQUE À :Extension Azure ML CLI v2 (actuelle)

Vous pouvez soumettre votre travail de pipeline à l’aide de la commande CLI :

az ml job create --file pipeline.yml

Une fois que vous avez envoyé votre travail de pipeline, le widget SDK ou CLI vous donnera un lien URL web vers l’interface utilisateur de Studio. Le lien vous guidera vers l’affichage graphique de pipeline par défaut. Double-sélectionnez l’étape parallèle pour ouvrir le volet droit de votre travail parallèle.

Pour vérifier les paramètres de votre travail parallèle, accédez à l’onglet Paramètres, développez Paramètres d’exécution et vérifiez la section Parallèle :

Capture d’écran d’Azure Machine Learning Studio sous l’onglet Travaux montrant les paramètres de travail parallèles.

Pour déboguer l’échec de votre travail parallèle, accédez à l’onglet Sorties + Journaux, développez le dossier des journaux à partir des répertoires de sortie à gauche et vérifiez job_result.txt pour comprendre pourquoi le travail parallèle a échoué. Pour plus d’informations sur la structure de journalisation du travail parallèle, consultez le readme.txt sous le même dossier.

Capture d’écran d’Azure Machine Learning Studio sous l’onglet Travaux montrant les résultats de travail parallèle.

Travail parallèle dans des exemples de pipeline

Étapes suivantes