Soumettre des travaux Spark dans Azure Machine Learning

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

Azure Machine Learning prend en charge la soumission de tâches d’apprentissage automatique autonomes et la création de pipelines d’apprentissage automatique, qui impliquent plusieurs étapes de flux de travail d’apprentissage automatique. Azure Machine Learning gère à la fois la création de tâches Spark autonomes et la création de composants Spark réutilisables que les pipelines Azure Machine Learning peuvent utiliser. Cet article vous apprend à soumettre des tâches Spark avec :

  • L’interface utilisateur Azure Machine Learning studio
  • Interface CLI Azure Machine Learning
  • Kit de développement logiciel (SDK) Azure Machine Learning

Pour plus d’informations sur les concepts d’Apache Spark dans Azure Machine Learning, consultez cette ressource.

Prérequis

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

Remarque

  • Pour en savoir plus sur l’accès aux ressources lors de l’utilisation du calcul Spark serverless Azure Machine Learning et du pool Synapse Spark attaché, consultez Garantir l’accès aux ressources pour les travaux Spark.
  • Azure Machine Learning fournit un pool de quotas partagé à partir duquel tous les utilisateurs peuvent accéder au quota de calcul pour effectuer des tests pendant une période limitée. Lorsque vous utilisez le calcul Spark serverless, Azure Machine Learning vous permet d’accéder à ce quota partagé pendant une courte période.

Attacher une identité managée affectée par l’utilisateur à l’aide de l’interface CLI v2

  1. Créez un fichier YAML définissant l’identité managée affectée par l’utilisateur, qui doit être attachée à l’espace de travail :
    identity:
      type: system_assigned,user_assigned
      tenant_id: <TENANT_ID>
      user_assigned_identities:
        '/subscriptions/<SUBSCRIPTION_ID/resourceGroups/<RESOURCE_GROUP>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<AML_USER_MANAGED_ID>':
          {}
    
  2. Avec le paramètre --file, utilisez le fichier YAML dans la commande az ml workspace update pour joindre l’identité managée affectée par l’utilisateur :
    az ml workspace update --subscription <SUBSCRIPTION_ID> --resource-group <RESOURCE_GROUP> --name <AML_WORKSPACE_NAME> --file <YAML_FILE_NAME>.yaml
    

Attacher une identité managée affectée par l’utilisateur à l’aide de ARMClient

  1. Installez ARMClient, un simple outil de ligne de commande qui permet d’appeler l’API Azure Resource Manager.
  2. Créez un fichier JSON définissant l’identité managée affectée par l’utilisateur, qui doit être attachée à l’espace de travail :
    {
        "properties":{
        },
        "location": "<AZURE_REGION>",
        "identity":{
            "type":"SystemAssigned,UserAssigned",
            "userAssignedIdentities":{
                "/subscriptions/<SUBSCRIPTION_ID/resourceGroups/<RESOURCE_GROUP>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<AML_USER_MANAGED_ID>": { }
            }
        }
    }
    
  3. Exécutez la commande suivante dans l’invite PowerShell ou l’invite de commandes pour attacher l’identité managée affectée par l’utilisateur à l’espace de travail.
    armclient PATCH https://management.azure.com/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/providers/Microsoft.MachineLearningServices/workspaces/<AML_WORKSPACE_NAME>?api-version=2022-05-01 '@<JSON_FILE_NAME>.json'
    

Remarque

Soumettez un travail Spark autonome

Un script Python développé par data wrangling interactif peut être utilisé pour soumettre une tâche par lots afin de traiter un plus grand volume de données, après avoir apporté les modifications nécessaires au paramétrage du script Python. Un traitement par lots simple basé sur le data wrangling peut être soumis comme travail Spark autonome.

Un travail Spark nécessite un script Python prenant des arguments que vous pouvez développer en modifiant le code Python développé à partir du data wrangling interactif. Un exemple de script Python est présenté ici.

# titanic.py
import argparse
from operator import add
import pyspark.pandas as pd
from pyspark.ml.feature import Imputer

parser = argparse.ArgumentParser()
parser.add_argument("--titanic_data")
parser.add_argument("--wrangled_data")

args = parser.parse_args()
print(args.wrangled_data)
print(args.titanic_data)

df = pd.read_csv(args.titanic_data, index_col="PassengerId")
imputer = Imputer(inputCols=["Age"], outputCol="Age").setStrategy(
    "mean"
)  # Replace missing values in Age column with the mean value
df.fillna(
    value={"Cabin": "None"}, inplace=True
)  # Fill Cabin column with value "None" if missing
df.dropna(inplace=True)  # Drop the rows which still have any missing value
df.to_csv(args.wrangled_data, index_col="PassengerId")

Remarque

Cet exemple de code Python utilise pyspark.pandas. Seul le runtime Spark version 3.2 ou ultérieure le prend en charge.

Le script ci-dessus prend deux arguments (--titanic_data et --wrangled_data) qui transfèrent le chemin des données d’entrée et du dossier de sortie, respectivement.

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

Pour créer une tâche, un travail Spark autonome peut être défini sous la forme d’un fichier de spécification YAML, qui peut être utilisé dans la commande az ml job create avec le paramètre --file. Définissez ces propriétés dans le fichier YAML :

Propriétés YAML dans la spécification du travail Spark

  • type : à définir sur spark.

  • code : définit l’emplacement du dossier qui contient les scripts et le code source pour ce travail.

  • entry : définit le point d’entrée du travail ; doit couvrir l’une des propriétés suivantes :

    • file : définit le nom du script Python qui sert de point d’entrée pour le travail.
  • py_files : définit une liste de fichiers .zip, .eggou .py à placer dans PYTHONPATH pour réussir l’exécution du travail. Cette propriété est facultative.

  • jars : définit une liste de fichiers .jar à inclure dans le pilote Spark et l’exécuteur CLASSPATH pour réussir l’exécution du travail. Cette propriété est facultative.

  • files : définit une liste de fichiers à copier dans le répertoire de travail de chaque exécuteur pour réussir l’exécution du travail. Cette propriété est facultative.

  • archives : définit une liste d’archives à extraire dans le répertoire de travail de chaque exécuteur pour réussir l’exécution du travail. Cette propriété est facultative.

  • conf : définit les propriétés de pilote et d’exécuteur Spark suivantes :

    • spark.driver.cores : nombre de cœurs pour le pilote Spark.
    • spark.driver.memory : mémoire allouée au pilote Spark, en Go (gigaoctets).
    • spark.executor.cores : nombre de cœurs pour l’exécuteur Spark.
    • spark.executor.memory : allocation de mémoire pour l’exécuteur Spark, en Go (gigaoctets).
    • spark.dynamicAllocation.enabled : valeur True ou False indiquant si les exécuteurs doivent être alloués dynamiquement ou non.
    • Si l’allocation dynamique des exécuteurs est activée, définissez ces propriétés :
      • spark.dynamicAllocation.minExecutors : nombre minimal d’instances d’exécuteurs Spark pour l’allocation dynamique.
      • spark.dynamicAllocation.maxExecutors : nombre maximal d’instances d’exécuteurs Spark pour l’allocation dynamique.
    • Si l’allocation dynamique d’exécuteurs est désactivée, définissez cette propriété :
      • spark.executor.instances : nombre d’instances d’exécuteur Spark.
  • environment : environnement Azure Machine Learning pour l’exécution du travail.

  • args : arguments de ligne de commande à passer au script Python du point d’entrée du travail. Pour obtenir un exemple, consultez le fichier de spécification YAML fourni ici.

  • resources : cette propriété définit les ressources que doit utiliser un calcul Spark serverless Azure Machine Learning. Elle utilise les propriétés suivantes :

    • instance_type : type d’instance de calcul à utiliser pour le pool Spark. Actuellement, les types d’instance suivants sont pris en charge :
      • standard_e4s_v3
      • standard_e8s_v3
      • standard_e16s_v3
      • standard_e32s_v3
      • standard_e64s_v3
    • runtime_version : définit la version du runtime Spark. Actuellement, les versions de runtime Spark suivantes sont prises en charge :
      • 3.2
      • 3.3

        Important

        Azure Synapse Runtime pour Apache Spark : annonces

        • Runtime Azure Synapse pour Apache Spark 3.2 :
          • Date d'annonce EOLA : 8 juillet 2023
          • Date de fin de support : 8 juillet 2024. Après cette date, le runtime sera désactivé.
        • Pour une assistance continue et des performances optimales, nous vous conseillons de migrer vers Apache Spark 3.3.

    Voici un exemple :

    resources:
      instance_type: standard_e8s_v3
      runtime_version: "3.3"
    
  • compute : cette propriété définit le nom d’un pool Spark Synapse attaché comme illustré dans cet exemple :

    compute: mysparkpool
    
  • inputs : cette propriété définit les entrées pour le travail Spark. Les entrées pour un travail Spark peuvent être une valeur littérale ou des données stockées dans un fichier ou un dossier.

    • Une valeur littérale peut être un nombre, une valeur booléenne ou une chaîne. En voici quelques exemples :
      inputs:
        sampling_rate: 0.02 # a number
        hello_number: 42 # an integer
        hello_string: "Hello world" # a string
        hello_boolean: True # a boolean value
      
    • Les données stockées dans un fichier ou un dossier doivent être définies avec les propriétés suivantes :
      • type : propriété à définir sur uri_file ou uri_folder pour les données d’entrée contenues dans un fichier ou dans un dossier, respectivement.
      • path : URI des données d’entrée, par exemple azureml://, abfss://ou wasbs://.
      • mode : propriété à définir sur direct. Cet exemple montre la définition d’une entrée de travail, qui peut être désignée $${inputs.titanic_data}} :
        inputs:
          titanic_data:
            type: uri_file
            path: azureml://datastores/workspaceblobstore/paths/data/titanic.csv
            mode: direct
        
  • outputs : cette propriété définit les sorties du travail Spark. Les sorties d’un travail Spark peuvent être écrites dans un fichier ou un emplacement de dossier, défini à l’aide des trois propriétés suivantes :

    • type : cette propriété peut être définie sur uri_file ou uri_folder pour écrire les données de sortie dans un fichier ou un dossier, respectivement.
    • path : cette propriété définit l’URI de l’emplacement de sortie, par exemple azureml://, abfss://ou wasbs://.
    • mode : propriété à définir sur direct. Cet exemple montre la définition d’une sortie de travail, qui peut être désignée ${{outputs.wrangled_data}} :
      outputs:
        wrangled_data:
          type: uri_folder
          path: azureml://datastores/workspaceblobstore/paths/data/wrangled/
          mode: direct
      
  • identity : cette propriété facultative définit l’identité utilisée pour la soumission de ce travail. Elle peut avoir les valeurs user_identity et managed. Si la spécification YAML ne définit pas d’identité, le travail Spark utilise l’identité par défaut.

Travail Spark autonome

Cet exemple de spécification YAML montre un travail Spark autonome. Il utilise du calcul Spark serverless pour Azure Machine Learning :

$schema: http://azureml/sdk-2-0/SparkJob.json
type: spark

code: ./ 
entry:
  file: titanic.py

conf:
  spark.driver.cores: 1
  spark.driver.memory: 2g
  spark.executor.cores: 2
  spark.executor.memory: 2g
  spark.executor.instances: 2

inputs:
  titanic_data:
    type: uri_file
    path: azureml://datastores/workspaceblobstore/paths/data/titanic.csv
    mode: direct

outputs:
  wrangled_data:
    type: uri_folder
    path: azureml://datastores/workspaceblobstore/paths/data/wrangled/
    mode: direct

args: >-
  --titanic_data ${{inputs.titanic_data}}
  --wrangled_data ${{outputs.wrangled_data}}

identity:
  type: user_identity

resources:
  instance_type: standard_e4s_v3
  runtime_version: "3.3"

Remarque

Pour utiliser un pool Synapse Spark attaché, définissez la propriété compute dans l’exemple de fichier de spécification YAML illustré précédemment, au lieu de la propriété resources.

Les fichiers YAML précédents peuvent être utilisés dans la commande az ml job create avec le paramètre --file pour créer un travail Spark autonome comme indiqué ici :

az ml job create --file <YAML_SPECIFICATION_FILE_NAME>.yaml --subscription <SUBSCRIPTION_ID> --resource-group <RESOURCE_GROUP> --workspace-name <AML_WORKSPACE_NAME>

Vous pouvez exécuter la commande ci-dessus à partir de :

Composant Spark dans un travail de pipeline

Un composant Spark offre la possibilité d’utiliser le même composant dans plusieurs pipelines Azure Machine Learning en tant qu’étape de pipeline.

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

La syntaxe YAML d’un composant Spark ressemble essentiellement à la syntaxe YAML pour la spécification d’un travail Spark. Les propriétés suivantes sont définies différemment dans la spécification YAML du composant Spark :

  • name : nom du composant Spark.

  • version : version du composant Spark.

  • display_name : nom du composant Spark à afficher dans l’interface utilisateur et ailleurs.

  • description : description du composant Spark.

  • inputs : propriété similaire à la propriété inputs décrite dans la section sur la syntaxe YAML pour une spécification de travail Spark, si ce n’est qu’elle ne définit pas la propriété path. Cet extrait de code montre un exemple de propriété inputs de composant Spark :

    inputs:
      titanic_data:
        type: uri_file
        mode: direct
    
  • outputs : propriété similaire à la propriété outputs décrite dans la section sur la syntaxe YAML pour une spécification de travail Spark, si ce n’est qu’elle ne définit pas la propriété path. Cet extrait de code montre un exemple de propriété outputs de composant Spark :

    outputs:
      wrangled_data:
        type: uri_folder
        mode: direct
    

Notes

Un composant Spark ne définit pas les propriétés identity, compute et resources. Le fichier de spécification YAML du pipeline définit ces propriétés.

Ce fichier de spécification YAML fournit un exemple de composant Spark :

$schema: http://azureml/sdk-2-0/SparkComponent.json
name: titanic_spark_component
type: spark
version: 1
display_name: Titanic-Spark-Component
description: Spark component for Titanic data

code: ./src
entry:
  file: titanic.py

inputs:
  titanic_data:
    type: uri_file
    mode: direct

outputs:
  wrangled_data:
    type: uri_folder
    mode: direct

args: >-
  --titanic_data ${{inputs.titanic_data}}
  --wrangled_data ${{outputs.wrangled_data}}

conf:
  spark.driver.cores: 1
  spark.driver.memory: 2g
  spark.executor.cores: 2
  spark.executor.memory: 2g
  spark.dynamicAllocation.enabled: True
  spark.dynamicAllocation.minExecutors: 1
  spark.dynamicAllocation.maxExecutors: 4

Le composant Spark défini dans le fichier de spécification YAML ci-dessus peut être utilisé dans un travail de pipeline Azure Machine Learning. Consultez Schéma YAML du travail de pipeline pour en savoir plus sur la syntaxe YAML qui définit un travail de pipeline. Cet exemple montre un fichier de spécification YAML pour un travail de pipeline, avec un composant Spark et un calcul Spark serverless Azure Machine Learning :

$schema: http://azureml/sdk-2-0/PipelineJob.json
type: pipeline
display_name: Titanic-Spark-CLI-Pipeline
description: Spark component for Titanic data in Pipeline

jobs:
  spark_job:
    type: spark
    component: ./spark-job-component.yaml
    inputs:
      titanic_data: 
        type: uri_file
        path: azureml://datastores/workspaceblobstore/paths/data/titanic.csv
        mode: direct

    outputs:
      wrangled_data:
        type: uri_folder
        path: azureml://datastores/workspaceblobstore/paths/data/wrangled/
        mode: direct

    identity:
      type: managed

    resources:
      instance_type: standard_e8s_v3
      runtime_version: "3.3"

Notes

Pour utiliser un pool Synapse Spark attaché, définissez la propriété compute dans l’exemple de fichier de spécification YAML illustré ci-dessus au lieu de la propriété resources.

Le fichier de spécification YAML ci-dessus peut être utilisé dans la commande az ml job create avec le paramètre --file pour la création d’un travail de pipeline comme indiqué ici :

az ml job create --file <YAML_SPECIFICATION_FILE_NAME>.yaml --subscription <SUBSCRIPTION_ID> --resource-group <RESOURCE_GROUP> --workspace-name <AML_WORKSPACE_NAME>

Vous pouvez exécuter la commande ci-dessus à partir de :

Résolution des problèmes liés aux travaux Spark

Pour résoudre les problèmes d’un travail Spark, vous pouvez accéder aux journaux générés pour ce travail dans Azure Machine Learning studio. Pour afficher les journaux d’un travail Spark :

  1. Accédez à Travaux dans le volet gauche de l’interface utilisateur Azure Machine Learning studio
  2. Sélectionnez l’onglet Tous les travaux
  3. Sélectionnez la valeur Nom d’affichage pour le travail
  4. Dans la page des détails du travail, sélectionnez l’onglet Sortie + journaux
  5. Dans l’Explorateur de fichiers, développez le dossier logs, puis le dossier azureml
  6. Accéder aux journaux des travaux Spark dans les dossiers du gestionnaire de pilotes et de bibliothèques

Notes

Pour résoudre les problèmes liés aux travaux Spark créés lors du wrangling de données interactif dans une session de notebook, sélectionnez Détails du travail en haut à droite de l’interface utilisateur du notebook. Un travail Spark à partir d’une session interactive de notebook est créé sous le nom d’expérience notebook-runs.

Étapes suivantes