Utiliser des GPU avec Google Cloud Serverless pour Apache Spark

Vous pouvez associer des accélérateurs GPU à vos charges de travail par lot Google Cloud Serverless pour Apache Spark pour obtenir les résultats suivants :

  • Accélérez le traitement des charges de travail d'analyse de données à grande échelle.

  • Accélérez l'entraînement de modèles sur de grands ensembles de données à l'aide de bibliothèques de machine learning GPU.

  • Effectuez des analyses de données avancées, comme le traitement vidéo ou du langage naturel.

Tous les environnements d'exécution Spark compatibles avec Serverless pour Apache Spark ajoutent la bibliothèque Spark RAPIDS à chaque nœud de charge de travail. La version 1.1 du runtime Spark Serverless pour Apache Spark ajoute également la bibliothèque XGBoost aux nœuds de charge de travail. Ces bibliothèques fournissent de puissants outils de transformation des données et de machine learning que vous pouvez utiliser dans vos charges de travail accélérées par GPU.

Avantages des GPU

Voici quelques-uns des avantages que vous pouvez obtenir en utilisant des GPU avec vos charges de travail Spark Serverless pour Apache Spark :

  • Amélioration des performances : l'accélération GPU peut améliorer considérablement les performances des charges de travail Spark, en particulier pour les tâches gourmandes en ressources de calcul, telles que le machine learning et le deep learning, le traitement de graphiques et les analyses complexes.

  • Entraînement de modèles plus rapide : pour les tâches de machine learning, l'association de GPU peut réduire considérablement le temps nécessaire à l'entraînement des modèles, ce qui permet aux data scientists et aux ingénieurs d'itérer et d'expérimenter rapidement.

  • Scalabilité : les clients peuvent ajouter des nœuds GPU ou des GPU plus puissants aux nœuds pour répondre à des besoins de traitement de plus en plus complexes.

  • Rentabilité : bien que les GPU nécessitent un investissement initial, vous pouvez réaliser des économies au fil du temps grâce à la réduction des temps de traitement et à une utilisation plus efficace des ressources.

  • Analyse de données améliorée : l'accélération GPU vous permet d'effectuer des analyses avancées, telles que l'analyse d'images et de vidéos, ainsi que le traitement du langage naturel, sur de grands ensembles de données.

  • Produits améliorés : un traitement plus rapide permet de prendre des décisions plus rapidement et d'obtenir des applications plus réactives.

Limites et points à noter

Tarifs

Pour en savoir plus sur la tarification des accélérateurs, consultez la page Tarifs de Serverless pour Apache Spark.

Avant de commencer

Avant de créer une charge de travail par lot sans serveur avec des accélérateurs GPU associés, procédez comme suit :

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Dataproc, Compute Engine, and Cloud Storage APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.

  6. Si vous utilisez un fournisseur d'identité (IdP) externe, vous devez d'abord vous connecter à la gcloud CLI avec votre identité fédérée.

  7. Pour initialiser la gcloud CLI, exécutez la commande suivante :

    gcloud init
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

  10. Enable the Dataproc, Compute Engine, and Cloud Storage APIs.

    Enable the APIs

  11. Install the Google Cloud CLI.

  12. Si vous utilisez un fournisseur d'identité (IdP) externe, vous devez d'abord vous connecter à la gcloud CLI avec votre identité fédérée.

  13. Pour initialiser la gcloud CLI, exécutez la commande suivante :

    gcloud init
  14. In the Google Cloud console, go to the Cloud Storage Buckets page.

    Go to Buckets

  15. Click Create.
  16. On the Create a bucket page, enter your bucket information. To go to the next step, click Continue.
    1. In the Get started section, do the following:
      • Enter a globally unique name that meets the bucket naming requirements.
      • To add a bucket label, expand the Labels section (), click Add label, and specify a key and a value for your label.
    2. In the Choose where to store your data section, do the following:
      1. Select a Location type.
      2. Choose a location where your bucket's data is permanently stored from the Location type drop-down menu.
      3. To set up cross-bucket replication, select Add cross-bucket replication via Storage Transfer Service and follow these steps:

        Set up cross-bucket replication

        1. In the Bucket menu, select a bucket.
        2. In the Replication settings section, click Configure to configure settings for the replication job.

          The Configure cross-bucket replication pane appears.

          • To filter objects to replicate by object name prefix, enter a prefix that you want to include or exclude objects from, then click Add a prefix.
          • To set a storage class for the replicated objects, select a storage class from the Storage class menu. If you skip this step, the replicated objects will use the destination bucket's storage class by default.
          • Click Done.
    3. In the Choose how to store your data section, do the following:
      1. Select a default storage class for the bucket or Autoclass for automatic storage class management of your bucket's data.
      2. To enable hierarchical namespace, in the Optimize storage for data-intensive workloads section, select Enable hierarchical namespace on this bucket.
    4. In the Choose how to control access to objects section, select whether or not your bucket enforces public access prevention, and select an access control method for your bucket's objects.
    5. In the Choose how to protect object data section, do the following:
      • Select any of the options under Data protection that you want to set for your bucket.
        • To enable soft delete, click the Soft delete policy (For data recovery) checkbox, and specify the number of days you want to retain objects after deletion.
        • To set Object Versioning, click the Object versioning (For version control) checkbox, and specify the maximum number of versions per object and the number of days after which the noncurrent versions expire.
        • To enable the retention policy on objects and buckets, click the Retention (For compliance) checkbox, and then do the following:
          • To enable Object Retention Lock, click the Enable object retention checkbox.
          • To enable Bucket Lock, click the Set bucket retention policy checkbox, and choose a unit of time and a length of time for your retention period.
      • To choose how your object data will be encrypted, expand the Data encryption section (), and select a Data encryption method.
  17. Click Create.
  18. Créer une charge de travail par lot sans serveur avec des accélérateurs de GPU

    Envoyez une charge de travail par lot Serverless pour Apache Spark qui utilise des GPU NVIDIA L4 pour exécuter une tâche PySpark parallélisée. Suivez ces étapes à l'aide de la gcloud CLI :

    1. Cliquez sur Développez-moi, puis créez et enregistrez le code PySpark listé dans un fichier test-py-spark-gpu.py sur votre ordinateur local à l'aide d'un éditeur de texte ou de code.

      #!/usr/bin/env python
      
      """S8s Accelerators Example."""
      
      import subprocess
      from typing import Any
      from pyspark.sql import SparkSession
      from pyspark.sql.functions import col
      from pyspark.sql.types import IntegerType
      from pyspark.sql.types import StructField
      from pyspark.sql.types import StructType
      
      spark = SparkSession.builder.appName("joindemo").getOrCreate()
      
      
      def get_num_gpus(_: Any) -> int:
        """Returns the number of GPUs."""
        p_nvidia_smi = subprocess.Popen(
            ["nvidia-smi", "-L"], stdin=None, stdout=subprocess.PIPE
        )
        p_wc = subprocess.Popen(
            ["wc", "-l"],
            stdin=p_nvidia_smi.stdout,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            universal_newlines=True,
        )
        [out, _] = p_wc.communicate()
        return int(out)
      
      
      num_workers = 5
      result = (
          spark.sparkContext.range(0, num_workers, 1, num_workers)
          .map(get_num_gpus)
          .collect()
      )
      num_gpus = sum(result)
      print(f"Total accelerators: {num_gpus}")
      
      # Run the join example
      schema = StructType([StructField("value", IntegerType(), True)])
      df = (
          spark.sparkContext.parallelize(range(1, 10000001), 6)
          .map(lambda x: (x,))
          .toDF(schema)
      )
      df2 = (
          spark.sparkContext.parallelize(range(1, 10000001), 6)
          .map(lambda x: (x,))
          .toDF(schema)
      )
      joined_df = (
          df.select(col("value").alias("a"))
          .join(df2.select(col("value").alias("b")), col("a") == col("b"))
          .explain()
      )
    2. Utilisez gcloud CLI sur votre machine locale pour envoyer le job par lot sans serveur Serverless pour Apache Spark avec cinq nœuds de calcul, chacun accéléré avec des GPU L4 :

      gcloud dataproc batches submit pyspark test-py-spark-gpu.py \
          --project=PROJECT_ID \
          --region=REGION \
          --deps-bucket=BUCKET_NAME \
          --version=1.1 \
          --properties=spark.dataproc.executor.compute.tier=premium,spark.dataproc.executor.disk.tier=premium,spark.dataproc.executor.resource.accelerator.type=l4,spark.executor.instances=5,spark.dataproc.driverEnv.LANG=C.UTF-8,spark.executorEnv.LANG=C.UTF-8,spark.shuffle.manager=com.nvidia.spark.rapids.RapidsShuffleManager
      

    Remarques :

    • PROJECT_ID : ID de votre projet Google Cloud .
    • REGION : Région Compute Engine disponible pour exécuter la charge de travail.
    • BUCKET_NAME : nom du bucket Cloud Storage. Spark importe les dépendances de la charge de travail dans un dossier /dependencies de ce bucket avant d'exécuter la charge de travail par lot.
    • --version: : tous les environnements d'exécution Serverless pour Apache Spark compatibles Google Cloud ajoutent la bibliothèque RAPIDS à chaque nœud d'une charge de travail accélérée par GPU. Seule la version d'exécution 1.1 ajoute la bibliothèque XGBoost à chaque nœud d'une charge de travail accélérée par GPU.
    • --properties (voir Propriétés d'allocation des ressources Spark) :

      • spark.dataproc.driverEnv.LANG=C.UTF-8 et spark.executorEnv.LANG=C.UTF-8 (obligatoire avec les versions d'exécution antérieures à 2.2) : ces propriétés définissent le jeu de caractères par défaut sur C.UTF-8.
      • spark.dataproc.executor.compute.tier=premium (obligatoire) : les charges de travail accélérées par GPU sont facturées à l'aide d'unités de calcul des données (DCU) Premium. Consultez les tarifs des accélérateurs pour Serverless pour Apache Spark.

      • spark.dataproc.executor.disk.tier=premium (obligatoire) : les nœuds avec des accélérateurs A100-40, A100-80 ou L4 doivent utiliser le niveau de disque Premium.

      • spark.dataproc.executor.resource.accelerator.type=l4 (obligatoire) : un seul type de GPU doit être spécifié. L'exemple de job sélectionne le GPU L4. Les types d'accélérateurs suivants peuvent être spécifiés avec les noms d'arguments suivants :

        Type de GPU Nom de l'argument
        A100 40 Go a100-40
        A100 80 Go a100-80

      • spark.executor.instances=5 (obligatoire) : la valeur doit être au minimum "deux". Définissez-le sur cinq pour cet exemple.

      • spark.executor.cores (facultatif) : vous pouvez définir cette propriété pour spécifier le nombre de vCPU de cœur. Les valeurs valides pour les GPU L4 sont 4 (par défaut), 8, 12, 16, 24, 48 ou 96. La seule valeur valide (et par défaut) pour les GPU A100 est 12. Les configurations avec des GPU L4 et 24, 48 ou 96 cœurs ont 2, 4 ou 8 GPU associés à chaque exécuteur. Toutes les autres configurations sont associées à un GPU 1.

      • spark.dataproc.executor.disk.size (obligatoire) : les GPU L4 ont une taille de disque fixe de 375 Go, sauf pour les configurations avec 24, 48 ou 96 cœurs, qui ont respectivement 750, 1,500 ou 3,000 Go. Si vous définissez cette propriété sur une autre valeur lorsque vous envoyez une charge de travail accélérée par L4, une erreur se produit. Si vous sélectionnez un GPU A100 40 ou A100 80, les tailles valides sont 375 g, 750 g, 1 500 g, 3 000 g, 6 000 g et 9 000 g.

      • spark.executor.memory (facultatif) et spark.executor.memoryOverhead (facultatif) : vous pouvez définir l'une de ces propriétés, mais pas les deux. La quantité de mémoire disponible non consommée par la propriété "set" est appliquée à la propriété "unset". Par défaut, spark.executor.memoryOverhead est défini sur 40 % de la mémoire disponible pour les charges de travail par lot PySpark et sur 10 % pour les autres charges de travail (voir Propriétés d'allocation des ressources Spark).

        Le tableau suivant indique la quantité maximale de mémoire pouvant être définie pour différentes configurations de GPU A100 et L4. La valeur minimale pour chaque propriété est de 1024 Mo.

        A100 (40 Go) A100 (80 Go) L4 (4 cœurs) L4 (8 cœurs) L4 (12 cœurs) L4 (16 cœurs) L4 (24 cœurs) L4 (48 cœurs) L4 (96 cœurs)
        Mémoire totale maximale (Mo) 78040 165080 13384 26768 40152 53536 113072 160608 321216
      • Propriétés Spark RAPIDS (facultatif) : par défaut, Serverless pour Apache Spark définit les valeurs de propriété Spark RAPIDS suivantes :

        • spark.plugins=com.nvidia.spark.SQLPlugin
        • spark.executor.resource.gpu.amount=1
        • spark.task.resource.gpu.amount=1/$spark_executor_cores
        • spark.shuffle.manager=''. Par défaut, cette propriété n'est pas définie. NVIDIA recommande d'activer le gestionnaire de shuffle RAPIDS lorsque vous utilisez des GPU pour améliorer les performances. Pour ce faire, définissez spark.shuffle.manager=com.nvidia.spark.rapids.RapidsShuffleManager lorsque vous envoyez une charge de travail.
        • spark.rapids.sql.concurrentGpuTasks= minimum de (gpuMemoryinMB / 8, 4)
        • spark.rapids.shuffle.multiThreaded.writer.threads= minimum de (nombre de cœurs de processeur dans la VM / nombre de GPU par VM, 32)
        • spark.rapids.shuffle.multiThreaded.reader.threads= minimum de (nombre de cœurs de processeur dans la VM / nombre de GPU par VM, 32)

        Consultez Configuration de RAPIDS Accelerator pour Apache Spark pour définir les propriétés Spark RAPIDS et Configuration avancée de RAPIDS Accelerator pour Apache Spark pour définir les propriétés Spark avancées.