Uso de Nvidia RAPIDS Accelerator de Nvidia para Spark - Amazon EMR

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Uso de Nvidia RAPIDS Accelerator de Nvidia para Spark

Con la versión 6.2.0 y posteriores de Amazon EMR, puede utilizar el complemento RAPIDS Accelerator para Apache Spark para acelerar Spark mediante tipos de instancias de unidades de procesamiento gráfico (GPU) de EC2. RAPIDS Accelerator acelerará mediante GPU sus canalizaciones de ciencia de datos de Apache Spark 3.0 sin cambios de código y acelerará el procesamiento de datos y el entrenamiento de modelos, a la vez que reducirá considerablemente los costos de infraestructura.

En las siguientes secciones lo guiaremos a través de la configuración de su clúster de EMR para usar el complemento Spark-RAPIDS para Spark.

Elección de tipos de instancias

Para usar el complemento Spark-RAPIDS de Nvidia para Spark, los grupos de instancias principales y de tareas deben usar tipos de instancias de GPU de EC2 que cumplan con los requisitos de hardware de Spark-RAPIDS. Para ver una lista completa de los tipos de instancias de GPU compatibles con Amazon EMR, consulte Tipos de instancias admitidos en la Guía de administración de Amazon EMR. El tipo de instancia del grupo de instancias principal puede ser de tipo GPU o no, pero no se admiten los tipos de instancias de ARM.

Definición de las configuraciones de aplicaciones para un clúster

1. Permitir que Amazon EMR instale los complementos en su nuevo clúster

Para instalar los complementos, proporcione la siguiente configuración al crear el clúster:

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

2. Configurar YARN para usar GPU

Para obtener más información sobre cómo usar GPU en YARN, consulte Using GPU on YARN en la documentación de Apache Hadoop. En los siguientes ejemplos, se muestran ejemplos de configuraciones de YARN para las versiones 6.x y 7.x de Amazon EMR:

Amazon EMR 7.x

Ejemplo de configuración de YARN para Amazon EMR 7.x

{ "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":"/spark-rapids-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":"/spark-rapids-cgroup", "yarn-hierarchy":"yarn" } } ] }
Amazon EMR 6.x

Ejemplo de configuración de YARN para Amazon EMR 6.x

{ "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. Configurar Spark para usar RAPIDS

Estas son las configuraciones necesarias para que Spark pueda usar el complemento 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" } }

La biblioteca XGBoost4J-Spark de la documentación de XGBoost también está disponible cuando el complemento Spark RAPIDS está habilitado en el clúster. Puede usar la siguiente configuración para integrar XGBoost con su trabajo de Spark:

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

Para obtener más configuraciones de Spark que pueda usar para ajustar un clúster de EMR acelerado mediante GPU, consulte Rapids Accelerator for Apache Spark tuning guide en la documentación de Nvidia.github.io.

4. Configurar el programador de capacidad de YARN

DominantResourceCalculator debe configurarse para habilitar la programación y el aislamiento de GPU. Para obtener más información, consulte Using GPU on YARN en la documentación de Apache Hadoop.

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

5. Crear un archivo JSON para incluir todas las configuraciones

Puede crear un archivo JSON que contenga la configuración para usar el complemento RAPIDS para su clúster de Spark. Proporcione el archivo más adelante, al lanzar el clúster.

Puede almacenar el archivo de forma local o en &S3. Para obtener más información sobre cómo proporcionar configuraciones de aplicaciones para sus clústeres, consulte Configuración de aplicaciones.

Utilice los siguientes archivos de ejemplo como plantillas para crear sus propias configuraciones.

Amazon EMR 7.x

Archivo my-configurations.json de ejemplo para Amazon EMR 7.x

[ { "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":"/spark-rapids-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":"/spark-rapids-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" } } ]
Amazon EMR 6.x

Archivo my-configurations.json de ejemplo para Amazon EMR 6.x

[ { "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" } } ]

Adición de una acción de arranque para el clúster

Para obtener más información sobre cómo proporcionar scripts de acciones de arranque al crear el clúster, consulte Conceptos básicos de las acciones de arranque en la Guía de administración de Amazon EMR.

En los siguientes scripts de ejemplo, se muestra cómo crear un archivo de acciones de arranque para Amazon EMR 6.x y 7.x:

Amazon EMR 7.x

Archivo my-bootstrap-action.sh de ejemplo para Amazon EMR 7.x

Para utilizar YARN con el fin de administrar los recursos de GPU con las versiones 7.x de Amazon EMR, debe realizar el montaje de forma manual de CGroup v1 en el clúster. Puede hacerlo con un script de acción de arranque, como se muestra en este ejemplo.

#!/bin/bash set -ex sudo mkdir -p /spark-rapids-cgroup/devices sudo mount -t cgroup -o devices cgroupv1-devices /spark-rapids-cgroup/devices sudo chmod a+rwx -R /spark-rapids-cgroup
Amazon EMR 6.x

Archivo my-bootstrap-action.sh de ejemplo para Amazon EMR 6.x

Para las versiones 6.x de Amazon EMR, debe abrir los permisos de CGroup para YARN en el clúster. Puede hacerlo con un script de acciones de arranque, como se muestra en este ejemplo.

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

Lanzamiento del clúster

El último paso consiste en lanzar el clúster con las configuraciones de clúster mencionadas anteriormente. A continuación, se muestra un comando de ejemplo para lanzar un clúster desde la CLI de Amazon EMR:

aws emr create-cluster \ --release-label emr-7.1.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