Apache Spark 用の Nvidia RAPIDS アクセラレータの使用 - Amazon EMR

Apache Spark 用の Nvidia RAPIDS アクセラレータの使用

Amazon EMR リリース 6.2.0 以降では、Nvidia による Apache Spark プラグイン用 RAPIDS アクセラレーターを使用し、EC2 グラフィックス処理ユニット (GPU) インスタンスタイプを使用して Spark を加速できます。RAPIDS Accelerator は、コードを変更せずに Apache Spark 3.0 データサイエンスパイプラインの GPU を加速させ、データ処理とモデルのトレーニングをスピードアップしつつ、インフラストラクチャコストを大幅に低減します。

以下のセクションでは、Spark 用 Spark-RAPIDS プラグインを使用するように EMR クラスターを構成する方法について説明します。

インスタンスタイプの選択

Spark 用の Nvidia Spark-RAPIDS プラグインを使用するには、コアインスタンスグループとタスクインスタンスグループが、Spark-RAPIDS のハードウェア要件を満たす EC2 GPU インスタンスタイプを使用する必要があります。Amazon EMR でサポートされる GPU インスタンスタイプの完全なリストについては、「Amazon EMR 管理ガイド」の「サポートされるインスタンスタイプ」を参照してください。プライマリインスタンスグループのインスタンスタイプは GPU タイプまたは非 GPU タイプのいずれかになりますが、ARM インスタンスタイプはサポートされていません。

クラスターのアプリケーション設定のセットアップ

1. Amazon EMR が新しいクラスターにプラグインをインストールできるようにする

プラグインをインストールするには、クラスターの作成時に次の設定を指定します。

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

2. GPU を使用するように YARN を設定する

YARN での GPU の使用法の詳細については、Apache Hadoop ドキュメントの「YARN で GPU を使用する」を参照してください。以下の例は、Amazon EMR 6.x および 7.x リリースの YARN 設定のサンプルを示しています。

Amazon EMR 7.x

Amazon EMR 7.x の YARN 設定の例

{ "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 EMR 6.x の YARN 設定の例

{ "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. RAPIDS を使用するように Spark を設定する

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" } }

XGBoost ドキュメントの XGBoost4J-Spark ライブラリは、クラスターで Spark RAPIDS プラグインが有効になっている場合も使用できます。次の設定を使用して、XGBoost を Spark ジョブと統合できます。

{ "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 ドキュメントの「Rapids Accelerator for Apache Spark tuning guide」を参照してください。

4. YARN キャパシティスケジューラを設定する

DominantResourceCalculator は、GPU のスケジューリングと分離が有効になるように設定する必要があります。詳細については、Apache Hadoop ドキュメントの「Using GPU on YARN」を参照してください。

{ "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

Amazon EMR 7.x 用のサンプル my-configurations.json ファイル

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

Amazon EMR 6.x 用のサンプル my-configurations.json ファイル

[ { "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 管理ガイド」の「Bootstrap action basics」を参照してください。

以下のサンプルスクリプトは、Amazon EMR 6.x と 7.x のブートストラップアクションファイルを作成する方法を示しています。

Amazon EMR 7.x

Amazon EMR 7.x 用のサンプル my-bootstrap-action.sh ファイル

YARN を使用して Amazon EMR 7.x リリースの GPU リソースを管理するには、クラスターに手動で 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

Amazon EMR 6.x 用のサンプル my-bootstrap-action.sh ファイル

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.10.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://amzn-s3-demo-bucket/my-bootstrap-action.sh