游乐游手机版
首页/AI热点日报/热点详情

Spark ML算法GPU加速实现与性能优化指南

类型:热点整理2026-07-16
NVIDIA开源的SparkRAPIDSML为PySpark机器学习提供GPU加速方案。它完全兼容PySparkMLlib的DataFrameAPI,仅需修改import语句即可无缝迁移。支持PCA、K-Means、线性回归、随机森林等多种监督与无监督算法,利用cuML实现GPU加速,通过NCCL UCX优化多GPU通信。基准测试表明,GPU加速可将运行时间

概述

Spark MLlib 是 Apache Spark 用于大规模机器学习的核心组件,提供了许多流行机器学习算法的内置实现。然而,这些实现创建于十年前,并未充分利用现代计算翻跟斗(如 NVIDIA GPU)。为弥补这一差距,NVIDIA 开源了 Spark RAPIDS MLNVIDIA/spark-rapids-ml),一个 Python 包,专为 PySpark ML 应用程序提供 GPU 加速。通过本教程,您将了解其核心设计、主要特性、支持的算法、如何使用它以及性能成本优势。

关键目标与特性

Spark RAPIDS ML 实现了以下三个关键目标:

  • 应用程序编程接口:完全保留 PySpark MLlib 基于 DataFrames 的 API,保持与 Spark 的 Pipeline API、CrossValidation 等的兼容性。允许在基线 Spark ML 实现和 GPU 加速实现之间切换,只需最少的代码更改(通常只需修改 Python 包导入语句)。
  • 加快速度并节省成本:为 Spark ML 算法展示 GPU 加速带来的显著性能提升和成本节约。
  • 体系结构:利用 NVIDIA 已经在传统 ML 算法加速方面完成的既有工作(如 RAPIDS cuML 库)。

支持的算法

初始版本为以下 Spark ML 算法提供了 GPU 加速:

  • 主成分分析 (PCA)
  • K-Means 聚类
  • 带脊回归和弹性网正则化的线性回归
  • 随机森林分类与回归

此外,还包含一个 Spark ML API 兼容版本的 K 最近邻 (KNN),作为概念验证。

这些算法的选择背后,主要是为了最大化利用已有的 NVIDIA 加速 ML 库:Spark RAPIDS ML 为 OSS RAPIDS cuML 库中已有的分布式实现提供了 PySpark API 包装器。而 KNN 在 cuML 中有分布式实现但未出现在 Spark ML 原生算法中,因此也被引入以展示兼容性。

图 1. Spark RAPIDS ML 和 cuML 集成架构

如图 1 所示,Spark RAPIDS ML 利用 Spark 的 Barrier RDD 同步和通信机制,在运行中的 Spark 集群上启动 cuML 的分布式算法实现。每个 RAPIDS 工作者映射到一个 Spark 任务上。算法计算和工作者之间的通信委托给 cuML,而 cuML 依赖于 NCCL 和 UCX 库加速 GPU 间的通信,这些库也被 Spark RAPIDS ML 使用。

易于采用的 API

核心设计目标是让 Spark ML 开发人员能够以最少的代码更改快速采用,并促进现有 Spark ML 应用程序的迁移。以下代码示例展示了使用 KMeans 时,基线 Spark ML 与 Spark RAPIDS ML 的唯一区别:仅修改了导入语句

PySpark ML(基线)

from pyspark.ml.clustering import KMeans
kmeans_estm = KMeans().setK(100).setFeaturesCol("features").setMaxIter(30)
kmeans_model = kmeans_estm.fit(pyspark_data_frame)
kmeans_model.write().sa ve("sa ved-model")
transformed = kmeans_model.transform(pyspark_data_frame)

Spark RAPIDS ML(GPU 加速)

from spark_rapids_ml import KMeans
kmeans_estm = KMeans().setK(100).setFeaturesCol("features").setMaxIter(30)
kmeans_model = kmeans_estm.fit(pyspark_data_frame)
kmeans_model.write().sa ve("sa ved-model")
transformed = kmeans_model.transform(pyspark_data_frame)

更一般地,所有支持算法的 Spark RAPIDS ML 加速版本都实现了与 Spark ML 对应的 Estimator - Model API。它们具有匹配的构造函数参数、getter、setter 以及模型属性和方法(在 cuML 实现允许的范围内)。.fit().transform() 方法接受带有 VectorUDT、Spark SQL 数组或标量特征列(FloatDouble 元素类型)的 Spark DataFrame。注意:当前仅支持密集向量。

小提示: 迁移时,您只需将 from pyspark.ml.xxx import YYY 替换为 from spark_rapids_ml import YYY,其余代码(如参数设置、拟合、保存模型、转换等)无需改动。

加快速度并节省成本

以下基准测试比较了 GPU 加速的 Spark RAPIDS ML 版本和基于 CPU 的 Spark ML 版本。

测试环境

  • 运行平台:Databricks 的 AWS 托管 Spark 服务
  • 集群节点:3 节点(1 Driver + 2 Executor)
  • CPU 集群:m5.2xlarge(每节点 8 个 CPU 核,32 GB RAM)
  • GPU 集群:g5.2xlarge(与 CPU 集群相同的 CPU/RAM,外加 NVIDIA 24GB A10 GPU)
  • 数据集:12-GB 合成数据集(使用 scikit-learn 生成,以 Parquet 格式存储在 Amazon S3 上)
  • 测量内容:端到端数据加载(从 S3)+ 拟合方法的运行时间
  • GPU 运行时的数据加载借助了 spark-rapids 插件加速

图 2: 基于 CPU 的 Spark ML 和 GPU 加速 Spark RAPIDS ML 算法拟合方法的运行时间(秒,对数刻度)

图 3: GPU – CPU 加速系数与成本效益

从图 2 和图 3 可以看出,尽管 GPU 集群每小时的成本更高,但对于计算密集型的 ML 工作负载,GPU 加速带来的端到端运行时间优势远超其更高的成本,从而实现了显著的成本效益。详细数据和重现步骤请参见 NVIDIA/spark-rapids-ml GitHub 仓库

常见问题解答

  • Q:除了导入语句,我还需要修改其他代码吗?
    A:通常不需要。Spark RAPIDS ML 的 Estimator/Model 类与 Spark ML 的对应类具有相同的参数名称和类型、getter/setter、属性和方法。在 cuML 实现支持的范围内,所有原有逻辑(如 Pipeline、CrossValidator 等)均可直接使用。
  • Q:支持稀疏向量吗?
    A:当前版本仅支持密集向量(DenseVector)。如果您的数据是稀疏格式,请先转换为密集向量再使用。
  • Q:如何确认我的 Spark 环境是否满足运行条件?
    A:需要安装 Spark RAPIDS ML 包并确保集群中有 NVIDIA GPU。建议同时使用 spark-rapids 插件来加速数据加载。更详细的版本要求和依赖请查阅 GitHub 上的安装文档。
  • Q:是否能将已经训练好的 Spark ML 模型直接用于 GPU 转换?
    A:不可以。GPU 加速版本是基于 cuML 实现的独立模型,与 CPU 版 Spark ML 模型不兼容。您需要使用 spark_rapids_ml 的 Estimator 重新训练模型,但代码改动极小(仅修改导入语句)。
  • Q:如果我使用了自定义的 Pipeline 步骤,会不会受影响?
    A:只要自定义步骤不使用 Spark MLlib 内置的算法,且不影响数据列类型,就无需额外修改。但请注意,如果自定义步骤依赖于 CPU 版本的 ML 类,可能会与 GPU 加速的 Estimator 混合使用,但此时性能只会体现在被加速的算法上。

下一步行动

通过 Spark RAPIDS ML,您只需一行代码更改即可显著加速 Spark ML 应用程序,并降低计算成本。立即访问 GitHub 仓库 获取安装说明、完整文档和更多示例,开始体验 GPU 加速的机器学习吧!

来源:https://m.elecfans.com/article/2164581.html

相关热点

继续查看同栏目近期热点。

延伸阅读

补充最近整理过的热点入口。