Uso dell'acceleratore RAPIDS per Apache Spark con Amazon EMR su EKS - Amazon EMR

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Uso dell'acceleratore RAPIDS per Apache Spark con Amazon EMR su EKS

Con Amazon EMR su EKS, puoi eseguire processi per l'acceleratore RAPIDS di Nvidia per Apache Spark. Questo tutorial spiega come eseguire i processi Spark utilizzando RAPIDS sui tipi di istanze Graphics Processing Unit (GPU) di EC2. Il tutorial utilizza le seguenti versioni:

  • Amazon EMR su EKS versione di rilascio 6.9.0 e successive

  • Apache Spark 3.x

Puoi accelerare Spark con i tipi di istanze GPU di Amazon EC2 utilizzando il plug-in dell'acceleratore RAPIDS per Apache Spark di Nvidia. Quando si utilizzano queste tecnologie insieme, si accelerano le pipeline di data science senza dover apportare modifiche al codice. Ciò riduce il tempo di esecuzione necessario per l'elaborazione dei dati e l'addestramento dei modelli. Facendo di più in meno tempo, si riducono i costi di infrastruttura.

Prima di iniziare, assicurati di disporre delle seguenti risorse.

  • Cluster virtuale Amazon EMR su EKS

  • Cluster Amazon EKS con un gruppo di nodi abilitato alla GPU

Un cluster virtuale Amazon EKS è un handle registrato per lo spazio dei nomi Kubernetes su un cluster Amazon EKS ed è gestito da Amazon EMR su EKS. L'handle consente ad Amazon EMR di utilizzare lo spazio dei nomi Kubernetes come destinazione per l'esecuzione di processi. Per ulteriori informazioni su come configurare un cluster virtuale, consulta la sezione Configurazione di Amazon EMR su EKS in questa guida.

È necessario configurare il cluster virtuale Amazon EKS con un gruppo di nodi con istanze GPU. È necessario configurare i nodi con un plug-in per dispositivi Nvidia. Per ulteriori informazioni, consulta la sezione Managed node groups (Gruppi di nodi gestiti).

Per configurare il cluster Amazon EKS per aggiungere gruppi di nodi compatibili con GPU, completa la seguente procedura:

Aggiunta di gruppi di nodi abilitati per GPU
  1. Crea un gruppo di nodi abilitati per GPU con il comando create-nodegroup. Assicurati di sostituire i parametri corretti per il tuo cluster Amazon EKS. Utilizza un tipo di istanza che supporti Spark RAPIDS, ad esempio P4, P3, G5 o G4dn.

    aws eks create-nodegroup \ --cluster-name EKS_CLUSTER_NAME \ --nodegroup-name NODEGROUP_NAME \ --scaling-config minSize=0,maxSize=5,desiredSize=2 CHOOSE_APPROPRIATELY \ --ami-type AL2_x86_64_GPU \ --node-role NODE_ROLE \ --subnets SUBNETS_SPACE_DELIMITED \ --remote-access ec2SshKey= SSH_KEY \ --instance-types GPU_INSTANCE_TYPE \ --disk-size DISK_SIZE \ --region AWS_REGION
  2. Installa il plug-in per dispositivi Nvidia nel cluster per emettere il numero di GPU su ogni nodo del cluster e per eseguire container compatibili con GPU nel cluster. Esegui il comando seguente per installare il plug-in:

    kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.9.0/nvidia-device-plugin.yml
  3. Per convalidare quante GPU sono disponibili in ogni nodo del cluster, esegui il comando seguente:

    kubectl get nodes "-o=custom-columns=NAME:.metadata.name,GPU:.status.allocatable.nvidia\.com/gpu"
Esecuzione di un processo Spark RAPIDS
  1. Invia un processo Spark RAPIDS al cluster Amazon EMR su EKS. Il codice seguente mostra un esempio di comando per avviare il processo. La prima volta che esegui il processo, potrebbero essere necessari alcuni minuti per scaricare l'immagine e memorizzarla nella cache sul nodo.

    aws emr-containers start-job-run \ --virtual-cluster-id VIRTUAL_CLUSTER_ID \ --execution-role-arn JOB_EXECUTION_ROLE \ --release-label emr-6.9.0-spark-rapids-latest \ --job-driver '{"sparkSubmitJobDriver": {"entryPoint": "local:///usr/lib/spark/examples/jars/spark-examples.jar","entryPointArguments": ["10000"], "sparkSubmitParameters":"--class org.apache.spark.examples.SparkPi "}}' \ ---configuration-overrides '{"applicationConfiguration": [{"classification": "spark-defaults","properties": {"spark.executor.instances": "2","spark.executor.memory": "2G"}}],"monitoringConfiguration": {"cloudWatchMonitoringConfiguration": {"logGroupName": "LOG_GROUP _NAME"},"s3MonitoringConfiguration": {"logUri": "LOG_GROUP_STREAM"}}}'
  2. Per verificare che l'acceleratore RAPIDS per Spark sia abilitato, controlla i log dei driver Spark. Questi log vengono archiviati in CloudWatch o nella posizione S3 specificata quando si esegue il comando start-job-run. L'esempio seguente mostra l'aspetto generale delle righe del log:

    22/11/15 00:12:44 INFO RapidsPluginUtils: RAPIDS Accelerator build: {version=22.08.0-amzn-0, user=release, url=, date=2022-11-03T03:32:45Z, revision=, cudf_version=22.08.0, branch=}
    22/11/15 00:12:44 INFO RapidsPluginUtils: RAPIDS Accelerator JNI build: {version=22.08.0, user=, url=https://github.com/NVIDIA/spark-rapids-jni.git, date=2022-08-18T04:14:34Z, revision=a1b23cd_sample, branch=HEAD}
    22/11/15 00:12:44 INFO RapidsPluginUtils: cudf build: {version=22.08.0, user=, url=https://github.com/rapidsai/cudf.git, date=2022-08-18T04:14:34Z, revision=a1b23ce_sample, branch=HEAD}
    22/11/15 00:12:44 WARN RapidsPluginUtils: RAPIDS Accelerator 22.08.0-amzn-0 using cudf 22.08.0.
    22/11/15 00:12:44 WARN RapidsPluginUtils: spark.rapids.sql.multiThreadedRead.numThreads is set to 20.
    22/11/15 00:12:44 WARN RapidsPluginUtils: RAPIDS Accelerator is enabled, to disable GPU support set `spark.rapids.sql.enabled` to false.
    22/11/15 00:12:44 WARN RapidsPluginUtils: spark.rapids.sql.explain is set to `NOT_ON_GPU`. Set it to 'NONE' to suppress the diagnostics logging about the query placement on the GPU.
  3. Per visualizzare le operazioni che verranno eseguite su una GPU, completa la seguente procedura per abilitare la registrazione aggiuntiva. Prendi nota della configurazione "spark.rapids.sql.explain : ALL".

    aws emr-containers start-job-run \ --virtual-cluster-id VIRTUAL_CLUSTER_ID \ --execution-role-arn JOB_EXECUTION_ROLE \ --release-label emr-6.9.0-spark-rapids-latest \ --job-driver '{"sparkSubmitJobDriver": {"entryPoint": "local:///usr/lib/spark/examples/jars/spark-examples.jar","entryPointArguments": ["10000"], "sparkSubmitParameters":"--class org.apache.spark.examples.SparkPi "}}' \ ---configuration-overrides '{"applicationConfiguration": [{"classification": "spark-defaults","properties": {"spark.rapids.sql.explain":"ALL","spark.executor.instances": "2","spark.executor.memory": "2G"}}],"monitoringConfiguration": {"cloudWatchMonitoringConfiguration": {"logGroupName": "LOG_GROUP_NAME"},"s3MonitoringConfiguration": {"logUri": "LOG_GROUP_STREAM"}}}'

    Il comando precedente è un esempio di un processo che utilizza la GPU. L'output dovrebbe assomigliare all'esempio seguente. Per comprendere l'output, fai riferimento a questa legenda:

    • *: contrassegna un'operazione che può essere eseguita su una GPU

    • !: contrassegna un'operazione che non può essere eseguita su una GPU

    • @: contrassegna un'operazione che può essere eseguita su una GPU ma che non verrà eseguita perché rientra in un piano che non può essere eseguito su una GPU

     22/11/15 01:22:58 INFO GpuOverrides: Plan conversion to the GPU took 118.64 ms
     22/11/15 01:22:58 INFO GpuOverrides: Plan conversion to the GPU took 4.20 ms
     22/11/15 01:22:58 INFO GpuOverrides: GPU plan transition optimization took 8.37 ms
     22/11/15 01:22:59 WARN GpuOverrides:
        *Exec <ProjectExec> will run on GPU
          *Expression <Alias> substring(cast(date#149 as string), 0, 7) AS month#310 will run on GPU
            *Expression <Substring> substring(cast(date#149 as string), 0, 7) will run on GPU
              *Expression <Cast> cast(date#149 as string) will run on GPU
          *Exec <SortExec> will run on GPU
            *Expression <SortOrder> date#149 ASC NULLS FIRST will run on GPU
            *Exec <ShuffleExchangeExec> will run on GPU
              *Partitioning <RangePartitioning> will run on GPU
                *Expression <SortOrder> date#149 ASC NULLS FIRST will run on GPU
              *Exec <UnionExec> will run on GPU
                !Exec <ProjectExec> cannot run on GPU because not all expressions can be replaced
                  @Expression <AttributeReference> customerID#0 could run on GPU
                  @Expression <Alias> Charge AS kind#126 could run on GPU
                    @Expression <Literal> Charge could run on GPU
                  @Expression <AttributeReference> value#129 could run on GPU
                  @Expression <Alias> add_months(2022-11-15, cast(-(cast(_we0#142 as bigint) + last_month#128L) as int)) AS date#149 could run on GPU
                    ! <AddMonths> add_months(2022-11-15, cast(-(cast(_we0#142 as bigint) + last_month#128L) as int)) cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.AddMonths
                      @Expression <Literal> 2022-11-15 could run on GPU
                      @Expression <Cast> cast(-(cast(_we0#142 as bigint) + last_month#128L) as int) could run on GPU
                        @Expression <UnaryMinus> -(cast(_we0#142 as bigint) + last_month#128L) could run on GPU
                          @Expression <Add> (cast(_we0#142 as bigint) + last_month#128L) could run on GPU
                            @Expression <Cast> cast(_we0#142 as bigint) could run on GPU
                              @Expression <AttributeReference> _we0#142 could run on GPU
                            @Expression <AttributeReference> last_month#128L could run on GPU