发布于: Nov 30, 2022
【概要】相较于使用 EC2 R5 内存优化型实例,运行 G4dn 实例上的 EMR 集群成本仅为前者的约 18.5%,性能却提升达 4.5 倍。
我们在运行有 Apache Spark 的 EC2 G4 实例上,通过 EMR 集群对最新的 RAPIDS-Spark XGBoost4j 开源库进行了基准测试。我们直接在 Amazon Simple Storage Service (Amazon S3) 上使用大小为 1TB 的 Criteo 开源数据集执行基准测试。Criteo 主要用于预测广告展示内容的点击率情况。这里使用 Amazon S3 充当数据存储方案。
下图所示,为我们在训练时间与训练成本方面的改进结果。
相较于使用 EC2 R5 内存优化型实例,运行 G4dn 实例上的 EMR 集群成本仅为前者的约 18.5%,性能却提升达 4.5 倍。与 EC2 P3 实例相比,采用 G4dn GPU 实例的 EMR 集群虽然在训练时间方面与前者基本持平,但训练成本却降低了一半。下表为此次基准测试的结果汇总。
类型 |
实例数量 |
每实例硬件配置 |
实例类型 |
Amazon EC2每小时使用成本 |
Amzon EMR每小时使用成本 |
训练时长(分钟) |
训练成本 |
GPU |
16 |
4x T4 |
g4dn.12xlarge |
3.912美元 |
0.27美元 |
6 |
6.69美元 |
GPU |
6 |
8 x V100 |
p3.16xlarge |
24.48美元 |
0.27美元 |
5 |
12.38美元 |
CPU |
16 |
64 vCPU |
r5a.16xlarge |
4.608美元 |
0.27美元 |
33 |
42.93美元 |
大家可以使用以下分步演练,在 EMR GPU 集群上使用开源 XGBoost 库运行示例贷款数据集。关于更多示例,请参阅 GitHub repo。
解决方案的实现具体分以下几个步骤:
- 创建一个 EMR notebook,并使用英伟达 GPU 节点启动 Amazon EMR。
- 在 notebook 上运行开源 XGBoost 库与 Apache Spark 示例。
- 查看训练与转换结果及基准。
- 使用 Apache Spark spark-submit 启动示例应用程序。
EMR notebook 即无服务器 Jupyter notebook。与传统 notebook 不同,EMR notebook 的内容(包括方程、可视化、查询、模型、代码与叙述文本)与代码代码的集群分保存在 Amazon S3 当中。通过这种方式,EMR notebook 在存储持久性、访问效率以及灵活性等方面都有所提升。
要创建 notebook 并启动 Amazon EMR,请完成以下操作步骤。
- 在 Amazon EMR 控制台上,选择您希望启动集群的对应区域(通常应选择大型训练数据集存储所在 S3 存储桶的同一区域)。
- 选择 Notebooks。
- 选择 Create notebook。
- 通过设置 GPU 节点创建一个带有 notebook 实例的新集群。
在本用例中,我们向新集群中添加 3 个 EC2 g4dn.xlarge GPU 节点。
如果大家希望使用高级配置创建自定义集群,则可分别创建一个 GPU 集群,而后再单独创建 EMR notebook 并接入该 GPU 集群。您可以在 Amazon Web Services 命令行界面(Amazon CLI)中输入以下代码,从而启动以 2 个 EC2 G4dn 实例为核心节点的 GPU 集群:
将其中的 KeyName, SubnetId, EmrManagedSlaveSecurityGroup, EmrManagedMasterSecurityGroup 以及 S3 存储桶的值替换为您的实际日志、名称与区域。
大家也可以使用 Amazon Web Services 管理控制台配置这套 EMR 集群。关于更多操作说明,请参阅 GitHub 上的 XGBoost4J-Spark on Amazon EMR 入门指南。
当集群准备就绪之后,转到 Amazon EMR notebooks,选择 notebook 实例,而后选择 Open in Jupyter。如果 notebook 实例还未运行,请将其启动。
从 GitHub 上的 Rapids/spark-examples 处下载示例 notebook EMR_Mortgage_Example_G4dn.ipynb,并将其上传至 EMR notebook 实例。关于更多 Scala 示例代码,请参阅 GitHub repo。
输入贷款示例 notebook,在开源 XGBoost 库上运行指向 Amazon S3 小型贷款数据集的 GPU 加速 Apache Spark 代码。如果 notebook 内核未被设定为 Apache Spark,则选择 Kernel、Change Kernel 并将 Apache Spark 设置为内核。EMR notebook 现在已经开始使用 pache Livy 与运行有 Apache Spark 的 EMR 集群通信。下图所示,为这套架构的基本构成。
大家还可以定制调整自己的 Apache Spark 作业配置,例如执行程序数量、核心数量以及 GPU 集群上的执行程序内存容量等等。每个 GPU 对应一个执行程序。
在 EMR notebook 中,大家可以查看 Apache Spark 作业的执行进度与基准测试结果。您还可以将训练后的模型保存在本地文件夹或者 S3 存储桶当中。以下截屏所示,为我们的作业进度。
以下代码,为本用例的基准测试结果:
—— Training ——==> Benchmark: Elapsed time for [train]: 37.881smodel: ml.dmlc.xgboost4j.scala.spark.XGBoostClassificationModel = xgbc_d5a83fea59b5 —— Transforming ——==> Benchmark: Elapsed time for [transform]: 0.115s…——Accuracy of Evaluation——evaluator: org.apache.spark.ml.evaluation.MulticlassClassificationEvaluator = mcEval_daa2cccd95a4accuracy: Double = 0.98750075898030530.9875007589803053
…
或者,您也可以通过 SSH 接入 EMR 主节点,并使用 Apache Spark spark-submit 脚本直接在集群上启动应用程序。请参考 GitHub repo 上的演练过程,使用 Apache Maven 创建一个包含贷款数据集及其依赖项的示例代码 jar 文件,而后使用 Apache Spark spark-submit 脚本 CLI 启动该应用程序。
为了避免基准测试中使用的资源持续产生成本,请删除为其创建的所有资源,具体包括 S3 存储桶、EMR 集群以及 EMR notebook 上的数据。
相关文章