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
Os aceleradores de GPU estão disponíveis com o nível de preços premium.
Pode anexar GPUs NVIDIA A100 ou NVIDIA L4 a Google Cloud cargas de trabalho em lote sem servidor para o Apache Spark. Os aceleradores A100 e L4 estão sujeitos à disponibilidade regional da GPU do Compute Engine.
A biblioteca XGBoost só é fornecida a cargas de trabalho aceleradas por GPU do Serverless para Apache Spark quando usa o Serverless para Apache Spark versão 1.x do tempo de execução do Spark.
O Serverless para Apache Spark com lotes acelerados por GPU com XGBoost usa quotas do Compute Engine aumentadas. Por exemplo, para executar uma carga de trabalho em lote sem servidor que usa uma GPU NVIDIA L4, tem de atribuir a quota de GPUs NVIDIA_L4.
Os trabalhos ativados pelo acelerador não são compatíveis com a política da organização
constraints/compute.requireShieldedVm
. Se a sua organização aplicar esta política, as tarefas com acelerador ativado não são executadas com êxito.Tem de definir o conjunto de carateres predefinido como UTF-8 quando usar a aceleração de GPU RAPIDS com tempos de execução sem servidor suportados para o Apache Spark anteriores à versão
2.2
. Consulte o artigo Crie uma carga de trabalho em lote sem servidor com aceleradores de GPU para mais informaçõ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:
- 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.
-
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 theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
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 theserviceusage.services.enable
permission. Learn how to grant roles. -
Install the Google Cloud CLI.
-
Se estiver a usar um fornecedor de identidade (IdP) externo, tem primeiro de iniciar sessão na CLI gcloud com a sua identidade federada.
-
Para inicializar a CLI gcloud, execute o seguinte comando:
gcloud init
-
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 theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
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 theserviceusage.services.enable
permission. Learn how to grant roles. -
Install the Google Cloud CLI.
-
Se estiver a usar um fornecedor de identidade (IdP) externo, tem primeiro de iniciar sessão na CLI gcloud com a sua identidade federada.
-
Para inicializar a CLI gcloud, execute o seguinte comando:
gcloud init
- In the Google Cloud console, go to the Cloud Storage Buckets page.
- Click Create.
- On the Create a bucket page, enter your bucket information. To go to the next
step, click Continue.
-
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_box
Add label, and specify a
key
and avalue
for your label.
-
In the Choose where to store your data section, do the following:
- Select a Location type.
- Choose a location where your bucket's data is permanently stored from the Location type drop-down menu.
- If you select the dual-region location type, you can also choose to enable turbo replication by using the relevant checkbox.
- To set up cross-bucket replication, select
Add cross-bucket replication via Storage Transfer Service and
follow these steps:
Set up cross-bucket replication
- In the Bucket menu, select a bucket.
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.
-
In the Choose how to store your data section, do the following:
- Select a default storage class for the bucket or Autoclass for automatic storage class management of your bucket's data.
- To enable hierarchical namespace, in the Optimize storage for data-intensive workloads section, select Enable hierarchical namespace on this bucket.
- 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.
-
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 (Data encryption method. ), and select a
- Select any of the options under Data protection that you
want to set for your bucket.
-
In the Get started section, do the following:
- Click Create.
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() )
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
- 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
espark.executorEnv.LANG=C.UTF-8
(obrigatório com versões de tempo de execução anteriores a2.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ão4
, o valor predefinido, ou8
,12
,16
,24
,48
ou96
. O único valor válido e predefinido para GPUs A100 é12
. As configurações com GPUs L4 e24
,48
ou96
núcleos têm2
,4
ou8
GPUs anexadas a cada executor. Todas as outras configurações têm uma GPU1
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 com24
,48
ou96
núcleos, que têm, respetivamente,750
,1,500
ou3,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) espark.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.SQLPluginspark.executor.resource.gpu.amount
=1spark.task.resource.gpu.amount
=1/$spark_executor_coresspark.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, definaspark.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.
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:
Notas: