Use GPUs com o Google Cloud Serverless para Apache Spark

Pode anexar aceleradores de GPU às suas cargas de trabalho em lote do Google Cloud Serverless para Apache Spark para alcançar os seguintes resultados:

  • Acelerar o processamento de cargas de trabalho de estatísticas de dados em grande escala.

  • Acelere a preparação de modelos em grandes conjuntos de dados através de bibliotecas de aprendizagem automática de GPU.

  • Realizar análises de dados avançadas, como processamento de vídeo ou linguagem natural.

Todos os tempos de execução do Apache Spark sem servidor suportados adicionam a biblioteca Spark RAPIDS a cada nó de carga de trabalho. A versão 1.1 do tempo de execução do Apache Spark do Serverless para Apache Spark também adiciona a biblioteca XGBoost aos nós de carga de trabalho. Estas bibliotecas oferecem ferramentas de aprendizagem automática e de transformação de dados eficazes que pode usar nas suas cargas de trabalho aceleradas pela GPU.

Vantagens da GPU

Seguem-se algumas das vantagens da utilização de GPUs com as cargas de trabalho do Serverless para Apache Spark:

  • Melhoria do desempenho: a aceleração da GPU pode aumentar significativamente o desempenho das cargas de trabalho do Spark, particularmente para tarefas com utilização intensiva de computação, como a aprendizagem automática e avançada, o processamento de gráficos e a análise complexa.

  • Preparação de modelos mais rápida: para tarefas de aprendizagem automática, a associação de GPUs pode reduzir drasticamente o tempo necessário para preparar modelos, permitindo que os cientistas de dados e os engenheiros iterem e experimentem rapidamente.

  • Escalabilidade: os clientes podem adicionar mais nós de GPUs ou GPUs mais potentes aos nós para processar necessidades cada vez mais complexas.

  • Rentabilidade: embora as GPUs exijam um investimento inicial, pode alcançar economias de custos ao longo do tempo devido à redução dos tempos de processamento e à utilização mais eficiente dos recursos.

  • Análise de dados melhorada: a aceleração da GPU permite-lhe realizar análises avançadas, como análise de imagens e vídeos e processamento de linguagem natural, em grandes conjuntos de dados.

  • Produtos melhorados: o processamento mais rápido permite uma tomada de decisões mais rápida e aplicações mais responsivas.

Limitações e considerações

Preços

Os aceleradores de GPU estão disponíveis com o nível de preços premium. Consulte os preços do Serverless para Apache Spark para ver informações sobre os preços dos aceleradores.

Antes de começar

Antes de criar uma carga de trabalho em lote sem servidor com aceleradores de GPU anexados, faça o seguinte:

  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.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    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.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  5. Install the Google Cloud CLI.

  6. Se estiver a usar um fornecedor de identidade (IdP) externo, tem primeiro de iniciar sessão na CLI gcloud com a sua identidade federada.

  7. Para inicializar a CLI gcloud, execute o seguinte comando:

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

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    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.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  11. Install the Google Cloud CLI.

  12. Se estiver a usar um fornecedor de identidade (IdP) externo, tem primeiro de iniciar sessão na CLI gcloud com a sua identidade federada.

  13. Para inicializar a CLI gcloud, execute o seguinte comando:

    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. Crie uma carga de trabalho em lote sem servidor com aceleradores de GPU

    Envie uma carga de trabalho em lote do Serverless para Apache Spark que use GPUs NVIDIA L4 para executar uma tarefa PySpark paralelizada. Siga estes passos através da CLI gcloud:

    1. Clique em Expandir e, de seguida, crie e guarde o código PySpark apresentado num ficheiro test-py-spark-gpu.py no seu computador local através de um editor de texto ou de código.

      #!/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. Use a CLI gcloud na sua máquina local para enviar a tarefa em lote sem servidor do Serverless for Apache Spark com cinco trabalhadores, com cada trabalhador acelerado com GPUs 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
      

    Notas:

    • PROJECT_ID: o ID do seu Google Cloud projeto.
    • REGION: Uma região do Compute Engine disponível para executar a carga de trabalho.
    • BUCKET_NAME: o nome do seu contentor do Cloud Storage. O Spark carrega as dependências da carga de trabalho para uma pasta /dependencies neste contentor antes de executar a carga de trabalho em lote.
    • --version: todos os tempos de execução sem servidor para Apache Spark suportados adicionam a biblioteca RAPIDS a cada nó de uma carga de trabalho acelerada pela GPU. Google Cloud Apenas a versão 1.1 do tempo de execução adiciona a biblioteca XGBoost a cada nó de uma carga de trabalho acelerada pela GPU.
    • --properties (consulte as propriedades de atribuição de recursos do Spark) :

      • spark.dataproc.driverEnv.LANG=C.UTF-8 e spark.executorEnv.LANG=C.UTF-8 (obrigatório com versões de tempo de execução anteriores a 2.2): estas propriedades definem o conjunto de carateres predefinido como C.UTF-8.
      • spark.dataproc.executor.compute.tier=premium (obrigatório): As cargas de trabalho aceleradas por GPU são faturadas através de unidades de computação de dados premium (DCUs). Consulte os preços dos aceleradores do Serverless para Apache Spark.

      • spark.dataproc.executor.disk.tier=premium (obrigatório): os nós com aceleradores A100-40, A100-80 ou L4 têm de usar o nível de disco premium.

      • spark.dataproc.executor.resource.accelerator.type=l4 (obrigatório): só tem de especificar um tipo de GPU. O trabalho de exemplo seleciona a GPU L4. Os seguintes tipos de aceleradores podem ser especificados com os seguintes nomes de argumentos:

        Tipo de GPU Nome do argumento
        A100 40GB a100-40
        A100 80GB a100-80

      • spark.executor.instances=5 (obrigatório): tem de ter, pelo menos, dois. Definido como cinco para este exemplo.

      • spark.executor.cores (opcional): pode definir esta propriedade para especificar o número de vCPUs principais. Os valores válidos para GPUs L4 são 4, o valor predefinido, ou 8, 12, 16, 24, 48 ou 96. O único valor válido e predefinido para GPUs A100 é 12. As configurações com GPUs L4 e 24, 48 ou 96 núcleos têm 2, 4 ou 8 GPUs anexadas a cada executor. Todas as outras configurações têm uma GPU 1 associada.

      • spark.dataproc.executor.disk.size (obrigatório): as GPUs L4 têm um tamanho de disco fixo de 375 GB, exceto para configurações com 24, 48 ou 96 núcleos, que têm, respetivamente, 750, 1,500 ou 3,000 GB. Se definir esta propriedade para um valor diferente quando enviar uma carga de trabalho acelerada por L4, ocorre um erro. Se selecionar uma GPU A100 40 ou A100 80, os tamanhos válidos são 375 g, 750 g, 1500 g, 3000 g, 6000 g e 9000 g.

      • spark.executor.memory (opcional) e spark.executor.memoryOverhead (restrito): pode definir a memória, mas não memoryOverhead. A quantidade de memória disponível não consumida pela propriedade definida é aplicada à propriedade não definida. spark.executor.memoryOverhead está definido como 40% da memória disponível para cargas de trabalho em lote do PySpark e 10% para outras cargas de trabalho (consulte as propriedades de atribuição de recursos do Spark).

        A tabela seguinte mostra a quantidade máxima de memória que pode ser definida para diferentes configurações de GPU A100 e L4. O valor mínimo de qualquer uma das propriedades é 1024 MB.

        A100 (40 GB) A100 (80 GB) L4 (4 núcleos) L4 (8 núcleos) L4 (12 cores) L4 (16 núcleos) L4 (24 núcleos) L4 (48 núcleos) L4 (96 núcleos)
        Memória total máxima (MB) 78040 165080 13384 26768 40152 53536 113072 160608 321216
      • Propriedades do Spark RAPIDS (opcional): por predefinição, o Serverless para Apache Spark define os seguintes valores de propriedades do Spark RAPIDS:

        • spark.plugins=com.nvidia.spark.SQLPlugin
        • spark.executor.resource.gpu.amount=1
        • spark.task.resource.gpu.amount=1/$spark_executor_cores
        • spark.shuffle.manager=''. Por predefinição, esta propriedade não está definida. A NVIDIA recomenda ativar o RAPIDS shuffle manager quando usar GPUs para melhorar o desempenho. Para o fazer, defina spark.shuffle.manager=com.nvidia.spark.rapids.RapidsShuffleManager quando enviar uma carga de trabalho.
        • spark.rapids.sql.concurrentGpuTasks= mínimo de (gpuMemoryinMB / 8, 4)
        • spark.rapids.shuffle.multiThreaded.writer.threads= mínimo de (núcleos da CPU na VM / quantidade de GPUs por VM, 32)
        • spark.rapids.shuffle.multiThreaded.reader.threads= mínimo de (núcleos da CPU na VM / quantidade de GPUs por VM, 32)

        Consulte o artigo RAPIDS Accelerator for Apache Spark Configuration para definir as propriedades do Spark RAPIDS e o artigo RAPIDS Accelerator for Apache Spark Advanced Configuration para definir as propriedades avançadas do Spark.