GPUs mit Google Cloud Serverless for Apache Spark verwenden

Sie können GPU-Beschleuniger an Ihre Google Cloud Serverless for Apache Spark-Batcharbeitslasten anhängen, um die folgenden Ergebnisse zu erzielen:

  • Verarbeitung von Arbeitslasten zur Datenanalyse im großen Maßstab beschleunigen

  • Modelltraining mit großen Datasets mithilfe von GPU-Bibliotheken für maschinelles Lernen beschleunigen

  • Erweiterte Datenanalysen durchführen, z. B. Video- oder Natural Language Processing.

Bei allen unterstützten Serverless for Apache Spark-Spark-Laufzeiten wird die RAPIDS-Bibliothek für Spark jedem Arbeitslastknoten hinzugefügt. Mit der Spark-Laufzeit Version 1.1 für Serverless for Apache Spark wird den Arbeitslastknoten auch die XGBoost-Bibliothek hinzugefügt. Diese Bibliotheken bieten leistungsstarke Tools für die Datentransformation und das maschinelle Lernen, die Sie in Ihren GPU-beschleunigten Arbeitslasten verwenden können.

Vorteile von GPUs

Hier sind einige Vorteile, wenn Sie GPUs mit Ihren Serverless for Apache Spark-Arbeitslasten verwenden:

  • Leistungssteigerung:Die GPU-Beschleunigung kann die Leistung von Spark-Arbeitslasten erheblich steigern, insbesondere bei rechenintensiven Aufgaben wie maschinellem Lernen und Deep Learning, der Verarbeitung von Diagrammen und komplexen Analysen.

  • Schnelleres Modelltraining:Bei Aufgaben im Bereich maschinelles Lernen kann das Anhängen von GPUs die zum Trainieren von Modellen erforderliche Zeit erheblich verkürzen. Data Scientists und Entwickler können so schnell iterieren und experimentieren.

  • Skalierbarkeit:Kunden können Knoten weitere GPUs oder leistungsstärkere GPUs hinzufügen, um immer komplexere Verarbeitungsanforderungen zu erfüllen.

  • Kosteneffizienz:GPUs erfordern zwar eine anfängliche Investition, aber Sie können im Laufe der Zeit Kosten sparen, da die Verarbeitungszeiten kürzer und die Ressourcennutzung effizienter ist.

  • Erweiterte Datenanalyse:Durch die GPU-Beschleunigung können Sie erweiterte Analysen wie Bild- und Videoanalyse sowie Verarbeitung natürlicher Sprache für große Datasets durchführen.

  • Verbesserte Produkte:Durch die schnellere Verarbeitung können Entscheidungen schneller getroffen werden und Anwendungen reagieren schneller.

Einschränkungen und Überlegungen

Preise

Informationen zu den Beschleunigerpreisen finden Sie unter Serverless für Apache Spark-Preise.

Hinweise

Bevor Sie eine serverlose Batcharbeitslast mit angehängten GPU-Beschleunigern erstellen, führen Sie die folgenden Schritte aus:

  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. Wenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.

  7. Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    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. Wenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.

  13. Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    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. Serverlose Batch-Arbeitslast mit GPU-Beschleunigern erstellen

    Senden Sie eine Serverless for Apache Spark-Batcharbeitslast, in der NVIDIA L4-GPUs verwendet werden, um eine parallelisierte PySpark-Aufgabe auszuführen. Führen Sie die folgenden Schritte mit der gcloud CLI aus:

    1. Klicken Sie auf Expand me (Einblenden), erstellen Sie den aufgeführten PySpark-Code und speichern Sie ihn mit einem Text- oder Code-Editor in einer test-py-spark-gpu.py-Datei auf Ihrem lokalen Computer.

      #!/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. Verwenden Sie die gcloud CLI auf Ihrem lokalen Computer, um den serverlosen Batchjob für Serverless for Apache Spark mit fünf Worker-Knoten zu senden, wobei jeder Worker-Knoten mit L4-GPUs beschleunigt wird:

      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
      

    Hinweise:

    • PROJECT_ID: Ihre Google Cloud -Projekt-ID
    • REGION: Eine verfügbare Compute Engine-Region, in der die Arbeitslast ausgeführt werden soll.
    • BUCKET_NAME: Der Name Ihres Cloud Storage-Buckets Spark lädt Arbeitslastabhängigkeiten in einen /dependencies-Ordner in diesem Bucket hoch, bevor die Batcharbeitslast ausgeführt wird.
    • --version::Bei allen unterstützten Google Cloud Serverless for Apache Spark-Laufzeiten wird die RAPIDS-Bibliothek jedem Knoten einer GPU-beschleunigten Arbeitslast hinzugefügt. Nur in der Laufzeitversion 1.1 wird die XGBoost-Bibliothek jedem Knoten einer GPU-beschleunigten Arbeitslast hinzugefügt.
    • --properties (siehe Spark-Attribute für die Ressourcenzuweisung) :

      • spark.dataproc.driverEnv.LANG=C.UTF-8 und spark.executorEnv.LANG=C.UTF-8 (bei Laufzeitversionen vor 2.2 erforderlich): Mit diesen Attributen wird der Standardzeichensatz auf C.UTF-8 festgelegt.
      • spark.dataproc.executor.compute.tier=premium (erforderlich): GPU-beschleunigte Arbeitslasten werden mit Premium-DCUs (Data Compute Units) abgerechnet. Weitere Informationen finden Sie unter Beschleunigerpreise.

      • spark.dataproc.executor.disk.tier=premium (erforderlich): Für Knoten mit A100-40-, A100-80- oder L4-Beschleunigern muss die Premium-Festplattenstufe verwendet werden.

      • spark.dataproc.executor.resource.accelerator.type=l4 (erforderlich): Es muss nur ein GPU-Typ angegeben werden. Im Beispieljob wird die L4-GPU ausgewählt. Die folgenden Beschleunigertypen können mit den folgenden Argumentnamen angegeben werden:

        GPU-Typ Name des Arguments
        A100 40GB a100-40
        A100 80GB a100-80

      • spark.executor.instances=5 (erforderlich): Muss mindestens zwei sein. Legen Sie für dieses Beispiel den Wert 5 fest.

      • spark.executor.cores (optional): Mit dieser Eigenschaft können Sie die Anzahl der Core-vCPUs angeben. Gültige Werte für L4-GPUs sind 4 (Standard), 8, 12, 16, 24, 48 oder 96. Der einzige gültige und Standardwert für A100-GPUs ist 12. Konfigurationen mit L4-GPUs und 24-, 48- oder 96-Kernen haben 2, 4 oder 8 GPUs, die an jeden Executor angehängt sind. Alle anderen Konfigurationen haben 1 GPU.

      • spark.dataproc.executor.disk.size (erforderlich): L4-GPUs haben eine feste Festplattengröße von 375 GB, mit Ausnahme von Konfigurationen mit 24-, 48- oder 96-Kernen, die 750, 1,500 bzw. 3,000 GB haben. Wenn Sie diese Eigenschaft beim Einreichen einer L4-beschleunigten Arbeitslast auf einen anderen Wert festlegen, tritt ein Fehler auf. Wenn Sie eine A100 40- oder A100 80-GPU auswählen, sind die gültigen Größen 375 g, 750 g, 1.500 g, 3.000 g, 6.000 g und 9.000 g.

      • spark.executor.memory (optional) und spark.executor.memoryOverhead (optional): Sie können eine dieser Eigenschaften festlegen, aber nicht beide. Die Menge des verfügbaren Arbeitsspeichers, die nicht von der festgelegten Property belegt wird, wird auf die nicht festgelegte Property angewendet. Standardmäßig ist spark.executor.memoryOverhead auf 40% des verfügbaren Arbeitsspeichers für PySpark-Batcharbeitslasten und auf 10% für andere Arbeitslasten festgelegt (siehe Spark-Eigenschaften für die Ressourcenzuordnung).

        In der folgenden Tabelle sehen Sie die maximale Arbeitsspeichermenge, die für verschiedene A100- und L4-GPU-Konfigurationen festgelegt werden kann. Der Mindestwert für beide Attribute ist 1024 MB.

        A100 (40 GB) A100 (80 GB) L4 (4 Kerne) L4 (8 Kerne) L4 (12 Kerne) L4 (16 Kerne) L4 (24 Kerne) L4 (48 Kerne) L4 (96 Kerne)
        Maximaler Gesamtspeicher (MB) 78040 165080 13384 26768 40152 53536 113072 160608 321216
      • Spark RAPIDS-Attribute (optional): Standardmäßig werden in Serverless for Apache Spark die folgenden Spark RAPIDS-Attributwerte festgelegt:

        • spark.plugins=com.nvidia.spark.SQLPlugin
        • spark.executor.resource.gpu.amount=1
        • spark.task.resource.gpu.amount=1/$spark_executor_cores
        • spark.shuffle.manager=''. Standardmäßig ist dieses Attribut nicht festgelegt. NVIDIA empfiehlt, den RAPIDS Shuffle Manager zu aktivieren, wenn Sie GPUs verwenden, um die Leistung zu verbessern. Dazu legen Sie spark.shuffle.manager=com.nvidia.spark.rapids.RapidsShuffleManager fest, wenn Sie eine Arbeitslast senden.
        • spark.rapids.sql.concurrentGpuTasks= Minimum von (gpuMemoryinMB / 8, 4)
        • spark.rapids.shuffle.multiThreaded.writer.threads= Minimum von (CPU-Kerne in der VM / GPU-Anzahl pro VM, 32)
        • spark.rapids.shuffle.multiThreaded.reader.threads= Minimum von (CPU-Kerne in der VM / GPU-Anzahl pro VM, 32)

        Informationen zum Festlegen von Spark RAPIDS-Attributen finden Sie unter RAPIDS Accelerator for Apache Spark Configuration und zum Festlegen von erweiterten Spark-Attributen unter RAPIDS Accelerator for Apache Spark Advanced Configuration.