Utilizzare l'Nvidia Spark-RAPIDS Accelerator per Spark - Amazon EMR

Utilizzare l'Nvidia Spark-RAPIDS Accelerator per Spark

Con Amazon EMR rilascio 6.2.0 e successivi, puoi utilizzare il plug-in dell'acceleratore RAPIDS di Nvidia per Apache Spark per accelerare Spark utilizzando tipi di istanza Graphics Processing Unit (GPU) di EC2. L'Accelerator Rapids esegue l'accelerazione via GPU delle pipeline Data Science di Apache Spark 3.0 senza applicare modifiche al codice e velocizza l'elaborazione dei dati e l'addestramento dei modelli, riducendo notevolmente i costi dell'infrastruttura.

Le sezioni seguenti guidano l'utente nella configurazione del cluster EMR per l'utilizzo del plug-in SPARK-Rapids per Spark.

Scelta dei tipi di istanza

Per utilizzare il plugin Nvidia Spark-RAPIDS per Spark, i gruppi di istanze principali e attività devono utilizzare i tipi di istanza GPU EC2 che soddisfano i Requisiti hardware di Spark-RAPIDS. Per visualizzare un elenco completo dei tipi di istanza GPU supportati da EMR, consulta i Tipi di istanze supportati nella Guida alla gestione di Amazon EMR. Il tipo di istanza per il gruppo di istanze primarie può essere GPU o non GPU, ma i tipi di istanza ARM non sono supportati.

Impostazione delle configurazioni delle applicazioni per il cluster

1. Abilitare Amazon EMR per installare i plug-in nel nuovo cluster

Per installare i plug-in, è necessaria la seguente configurazione durante la creazione del cluster:

{ "Classification":"spark", "Properties":{ "enableSparkRapids":"true" } }

2. Configurazione di YARN per utilizzare la GPU

Per ulteriori informazioni sull'utilizzo della GPU su YARN, consulta Using GPU on YARN (Utilizzo della GPU su YARN) nella documentazione di Apache Hadoop. Segue una configurazione di esempio:

{ "Classification":"yarn-site", "Properties":{ "yarn.nodemanager.resource-plugins":"yarn.io/gpu", "yarn.resource-types":"yarn.io/gpu", "yarn.nodemanager.resource-plugins.gpu.allowed-gpu-devices":"auto", "yarn.nodemanager.resource-plugins.gpu.path-to-discovery-executables":"/usr/bin", "yarn.nodemanager.linux-container-executor.cgroups.mount":"true", "yarn.nodemanager.linux-container-executor.cgroups.mount-path":"/sys/fs/cgroup", "yarn.nodemanager.linux-container-executor.cgroups.hierarchy":"yarn", "yarn.nodemanager.container-executor.class":"org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor" } }, { "Classification":"container-executor", "Properties":{ }, "Configurations":[ { "Classification":"gpu", "Properties":{ "module.enabled":"true" } }, { "Classification":"cgroups", "Properties":{ "root":"/sys/fs/cgroup", "yarn-hierarchy":"yarn" } } ] }

3. Configurazione di Spark per utilizzare RAPIDS

Seguono le configurazioni necessarie per consentire a Spark di utilizzare il plug-in RAPIDS:

{ "Classification":"spark-defaults", "Properties":{ "spark.plugins":"com.nvidia.spark.SQLPlugin", "spark.executor.resource.gpu.discoveryScript":"/usr/lib/spark/scripts/gpu/getGpusResources.sh", "spark.executor.extraLibraryPath":"/usr/local/cuda/targets/x86_64-linux/lib:/usr/local/cuda/extras/CUPTI/lib64:/usr/local/cuda/compat/lib:/usr/local/cuda/lib:/usr/local/cuda/lib64:/usr/lib/hadoop/lib/native:/usr/lib/hadoop-lzo/lib/native:/docker/usr/lib/hadoop/lib/native:/docker/usr/lib/hadoop-lzo/lib/native" } }

XGBoost4J-Spark library nella documentazione di XGBoost è disponibile anche quando il plug-in Spark RAPIDS è abilitato sul cluster. Puoi utilizzare la seguente configurazione per integrare XGBoost con il tuo processo Spark:

{ "Classification":"spark-defaults", "Properties":{ "spark.submit.pyFiles":"/usr/lib/spark/jars/xgboost4j-spark_3.0-1.4.2-0.3.0.jar" } }

Per ulteriori configurazioni Spark che è possibile utilizzare per regolare un cluster EMR accelerato da GPU, fai riferimento alla Rapids Accelerator for Apache Spark tuning guide (Guida alla regolazione dell'Accelerator Rapids per Apache Spark) nella documentazione di Nvidia.github.io.

4. Configurazione del pianificatore di capacità YARN

DominantResourceCalculator deve essere configurato per abilitare la pianificazione e l'isolamento della GPU. Per ulteriori informazioni, consulta Using GPU on YARN (Utilizzo della GPU su YARN) nella documentazione di Apache Hadoop.

{ "Classification":"capacity-scheduler", "Properties":{ "yarn.scheduler.capacity.resource-calculator":"org.apache.hadoop.yarn.util.resource.DominantResourceCalculator" } }

5. Creazione di un file JSON per includere tutte le configurazioni

È possibile creare un file JSON che contiene la configurazione per l'utilizzo del plug-in RAPIDS per il cluster Spark. È possibile fornire il file in un secondo momento all'avvio del cluster.

Il file può essere memorizzato localmente o su S3. Per ulteriori informazioni su come fornire le configurazioni delle applicazioni per i cluster, consulta Configurazione delle applicazioni.

Di seguito è riportato un esempio di file denominato my-configurations.json. Puoi utilizzarlo come modello per iniziare a creare le tue configurazioni.

[ { "Classification":"spark", "Properties":{ "enableSparkRapids":"true" } }, { "Classification":"yarn-site", "Properties":{ "yarn.nodemanager.resource-plugins":"yarn.io/gpu", "yarn.resource-types":"yarn.io/gpu", "yarn.nodemanager.resource-plugins.gpu.allowed-gpu-devices":"auto", "yarn.nodemanager.resource-plugins.gpu.path-to-discovery-executables":"/usr/bin", "yarn.nodemanager.linux-container-executor.cgroups.mount":"true", "yarn.nodemanager.linux-container-executor.cgroups.mount-path":"/sys/fs/cgroup", "yarn.nodemanager.linux-container-executor.cgroups.hierarchy":"yarn", "yarn.nodemanager.container-executor.class":"org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor" } }, { "Classification":"container-executor", "Properties":{ }, "Configurations":[ { "Classification":"gpu", "Properties":{ "module.enabled":"true" } }, { "Classification":"cgroups", "Properties":{ "root":"/sys/fs/cgroup", "yarn-hierarchy":"yarn" } } ] }, { "Classification":"spark-defaults", "Properties":{ "spark.plugins":"com.nvidia.spark.SQLPlugin", "spark.executor.resource.gpu.discoveryScript":"/usr/lib/spark/scripts/gpu/getGpusResources.sh", "spark.executor.extraLibraryPath":"/usr/local/cuda/targets/x86_64-linux/lib:/usr/local/cuda/extras/CUPTI/lib64:/usr/local/cuda/compat/lib:/usr/local/cuda/lib:/usr/local/cuda/lib64:/usr/lib/hadoop/lib/native:/usr/lib/hadoop-lzo/lib/native:/docker/usr/lib/hadoop/lib/native:/docker/usr/lib/hadoop-lzo/lib/native", "spark.submit.pyFiles":"/usr/lib/spark/jars/xgboost4j-spark_3.0-1.4.2-0.3.0.jar", "spark.rapids.sql.concurrentGpuTasks":"1", "spark.executor.resource.gpu.amount":"1", "spark.executor.cores":"2", "spark.task.cpus":"1", "spark.task.resource.gpu.amount":"0.5", "spark.rapids.memory.pinnedPool.size":"0", "spark.executor.memoryOverhead":"2G", "spark.locality.wait":"0s", "spark.sql.shuffle.partitions":"200", "spark.sql.files.maxPartitionBytes":"512m" } }, { "Classification":"capacity-scheduler", "Properties":{ "yarn.scheduler.capacity.resource-calculator":"org.apache.hadoop.yarn.util.resource.DominantResourceCalculator" } } ]

Aggiunta di un'operazione di bootstrap per il cluster

Per utilizzare YARN sulla GPU, è necessario aprire le autorizzazioni cgroups a YARN sul cluster, operazione che può essere eseguita utilizzando uno script di operazione di bootstrap EMR.

Per ulteriori informazioni su come fornire script dell'operazione di bootstrap durante la creazione del cluster, consulta Nozioni di base sulle operazioni di bootstrap nella Guida alla gestione di Amazon EMR.

Segue uno script di esempio denominato my-bootstap-action.sh:

#!/bin/bash set -ex sudo chmod a+rwx -R /sys/fs/cgroup/cpu,cpuacct sudo chmod a+rwx -R /sys/fs/cgroup/devices

Avvio del cluster

L'ultimo passaggio consiste nell'avviare il cluster con le configurazioni del cluster menzionate sopra. Segue un esempio del comando per avviare un cluster tramite la CLI EMR:

aws emr create-cluster \ --release-label emr-6.2.0 \ --applications Name=Hadoop Name=Spark \ --service-role EMR_DefaultRole_V2 \ --ec2-attributes KeyName=my-key-pair,InstanceProfile=EMR_EC2_DefaultRole \ --instance-groups InstanceGroupType=MASTER,InstanceCount=1,InstanceType=m4.4xlarge \ InstanceGroupType=CORE,InstanceCount=1,InstanceType=g4dn.2xlarge \ InstanceGroupType=TASK,InstanceCount=1,InstanceType=g4dn.2xlarge \ --configurations file:///my-configurations.json \ --bootstrap-actions Name='My Spark Rapids Bootstrap action',Path=s3://my-bucket/my-bootstrap-action.sh