아파치 스파크용 엔비디아 액셀러레이터 RAPIDS 사용 - 아마존 EMR

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

아파치 스파크용 엔비디아 액셀러레이터 RAPIDS 사용

Amazon EMR 릴리스 6.2.0 이상에서는 Nvidia의 Apache Spark RAPIDS 가속기 플러그인을 사용하여 EC2 그래픽 처리 장치 () 인스턴스 유형을 사용하여 Spark를 가속화할 수 있습니다. GPU RAPIDS액셀러레이터는 코드 변경 없이 Apache Spark 3.0 데이터 사이언스 파이프라인을 GPU 가속화하고 데이터 처리 및 모델 교육 속도를 높이는 동시에 인프라 비용을 크게 절감합니다.

다음 섹션에서는 Spark- Plugin for Spark를 사용하도록 EMR 클러스터를 구성하는 방법을 안내합니다. RAPIDS

인스턴스 유형 선택

Spark용 Nvidia Spark- RAPIDS 플러그인을 사용하려면 코어 및 작업 인스턴스 그룹이 Spark-의 하드웨어 요구 사항을 충족하는 EC2 GPU 인스턴스 유형을 사용해야 합니다. RAPIDS Amazon에서 EMR 지원하는 GPU 인스턴스 유형의 전체 목록을 보려면 Amazon EMR 관리 안내서의 지원되는 인스턴스 유형을 참조하십시오. 기본 인스턴스 그룹의 인스턴스 유형은 두 유형 중 하나 GPU 또는 비 GPU 유형일 수 있지만 ARM 인스턴스 유형은 지원되지 않습니다.

클러스터의 애플리케이션 구성 설정

1: Amazon이 새 클러스터에 플러그인을 EMR 설치하도록 활성화합니다.

플러그인을 설치하려면 클러스터를 생성할 때 다음 구성을 제공합니다.

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

2. YARN사용하도록 구성 GPU

GPUon YARN 사용 방법에 대한 자세한 내용은 Apache Hadoop YARN 설명서의 GPUon 사용을 참조하십시오. 다음 예는 Amazon EMR 6.x 및 7.x 릴리스의 샘플 YARN 구성을 보여줍니다.

Amazon EMR 7.x

Amazon YARN 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

Amazon YARN 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. Spark를 사용하도록 설정하세요. RAPIDS

Spark에서 플러그인을 사용할 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" } }

XGBoost4JXGBoost-설명서의 Spark 라이브러리는 클러스터에서 Spark RAPIDS 플러그인이 활성화된 경우에도 사용할 수 있습니다. 다음 구성을 사용하여 Spark XGBoost 작업과 통합할 수 있습니다.

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

GPU가속화된 EMR 클러스터를 튜닝하는 데 사용할 수 있는 추가 Spark 구성에 대해서는 Nvidia.GitHub.io 설명서의 Apache Spark용 Rapids Accelerator 조정 가이드를 참조하십시오.

4. YARN용량 스케줄러 구성

DominantResourceCalculatorGPU스케줄링 및 격리가 가능하도록 구성해야 합니다. 자세한 내용은 Apache Hadoop YARN 설명서에서 GPUon 사용을 참조하십시오.

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

5. 구성을 포함하도록 JSON 파일을 만드세요.

Spark 클러스터용 RAPIDS 플러그인을 사용하기 위한 구성이 포함된 JSON 파일을 생성할 수 있습니다. 나중에 클러스터를 시작할 때 파일을 제공합니다.

파일을 로컬 또는 S3에 저장할 수 있습니다. 클러스터에 애플리케이션 구성을 제공하는 방법에 대한 자세한 내용은 애플리케이션 구성 섹션을 참조하세요.

다음 샘플 파일을 템플릿으로 사용하고 고유한 구성을 만드세요.

Amazon EMR 7.x

아마존 my-configurations.json 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

아마존 my-configurations.json 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" } } ]

클러스터에 대한 부트스트랩 작업 추가

클러스터를 생성할 때 부트스트랩 작업 스크립트를 제공하는 방법에 대한 자세한 내용은 Amazon EMR Management Guide의 Bootstrap 작업 기본 사항을 참조하십시오.

다음 예제 스크립트는 Amazon EMR 6.x 및 7.x용 부트스트랩 작업 파일을 만드는 방법을 보여줍니다.

Amazon EMR 7.x

아마존 my-bootstrap-action.sh EMR 7.x용 예제 파일

Amazon EMR 7.x 릴리스에서 GPU 리소스를 관리하는 YARN 데 사용하려면 CGroup v1 클러스터에 수동으로 마운트해야 합니다. 이 예제처럼 부트스트랩 작업 스크립트를 이용하여 이 작업을 할 수 있습니다.

#!/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

아마존 my-bootstrap-action.sh EMR 6.x용 예제 파일

Amazon EMR 6.x 릴리스의 경우 YARN 클러스터에서 CGroup 권한을 열어야 합니다. 이 예제처럼 부트스트랩 작업 스크립트를 이용하여 이 작업을 할 수 있습니다.

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

클러스터 시작

마지막 단계는 위에서 언급한 클러스터 구성으로 클러스터를 시작하는 것입니다. Amazon에서 클러스터를 시작하는 예제 명령은 EMR CLI 다음과 같습니다.

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