適用于 Apache Spark 軟件插件的 NVIDIA RAPIDS 加速器 開創了零代碼更改用戶體驗 (UX),可用于 GPU 加速數據處理。無需更改查詢或源代碼,即可將 NVIDIA GPU 上基于 Apache Spark SQL 和 DataFrame 的現有應用程序加速 9 倍以上。
這催生了新的 Spark RAPIDS ML Python 庫,可將應用程序的速度提高 100 多倍,同時還調用了 Apache Spark 的可擴展機器學習庫 MLlib 。
直到最近,Spark RAPIDS ML 的 MLlib 加速仍需要稍作修改,才能讓 Python 使用加速實現。具體來說,您需要在希望加速的 ML 類的 Python 導入語句中,將 pyspark.ml
替換為 spark_rapids_ml
。例如,要使用加速的 KMeans 而不是基準 KMeans,您必須在整個代碼中將 import pyspark.ml.classication.KMeans
替換為 import spark_rapids_ml.classication.KMeans
。有利的一面是,無需進一步更改代碼即可使用加速版的 KMeans。
在這篇博文中,我們介紹了自 25.02 版本 以來 Spark RAPIDS ML 中的新功能,該功能允許您甚至跳過上述導入語句更改,從而在 Spark SQL 和 DataFrame 以及 MLlib 代碼中實現真正的端到端代碼更改加速體驗。
零代碼更改 MLlib 加速
考慮使用以下簡單的 PySpark 應用程序代碼:
from pyspark.ml.clustering import KMeans from pyspark.ml.functions import array_to_vector df = spark.read.parquet( "/data/embedding_vectors" ) df = df.select(array_to_vector(df.features).alias( "features" )) kmeans_estim = ( KMeans() .setK( 100 ) .setFeaturesCol( "features" ) .setMaxIter( 30 ) ) kmeans_model = kmeans_estim.fit(df) transformed = kmeans_model.transform(df) transformed.write.parquet( "/data/embedding_vectors_clusters" ) |
此代碼會讀取向量嵌入文件,該文件之前使用深度學習語言模型計算,并使用 array
類型以 parquet 格式存儲。 然后,它使用 Spark MLlib 中的 KMeans 算法對向量進行聚類。
通過將 Spark RAPIDS ML 的新零代碼更改功能與 RAPIDS Accelerator for Apache Spark 軟件插件相結合,您可以在不進行任何更改的情況下加速此完全兼容的 PySpark 代碼:在讀取 read.parquet()
中的文件時包括 parquet 解壓縮和解碼,在 fit()
和 transform()
中包括 KMeans 聚類數值計算,以及在將包含聚類的向量保存到 write.parquet()
中的另一個 parquet 文件時進行編碼和壓縮。
接下來,我們將介紹如何使用常見的 Spark 應用啟動方式的新變體來觸發加速執行:命令行接口 (CLI)、本地 Jupyter Notebooks 以及云提供商托管的 Spark 服務中的 Jupyter Notebooks。
命令行接口
假設上面的示例應用代碼位于名為 app.py
的文件中。按照慣例,您需要使用眾所周知的 Spark CLI spark-submit 在不同類型的集群 (local/test、standalone、yarn、kubernetes 等) 上啟動 app.py。
spark-submit <options> app.py
要加速 MLlib 部分,在通過 pip install spark-rapids-ml 安裝 Spark RAPIDS ML 庫后,您只需將 spark-submit
命令替換為新包含的加速 CLI 對應命令 (同時像以前一樣包括用于 SQL 和 DataFrame 加速的 configs 和 classpath 設置):
spark-rapids-submit <options> app.py
如果您更喜歡使用 CLI pyspark
在 PySpark shell 中以交互方式運行類似于 app.py
的代碼,您也可以使用新包含的對應 CLI pyspark-rapids
來啟動加速的 PySpark shell,從而在不更改代碼的情況下加速此過程。
Jupyter notebooks: 本地 Spark 集群
Spark 應用還通常在運行附加到 Spark 集群的內核的 Jupyter notebook 中以交互方式運行。
如 Spark RAPIDS ML 文檔 中所述,要開始在配備 NVIDIA GPU 的工作站上使用,您可以使用 pyspark-rapids
命令在本地模式下啟動具有加速 Spark 的 Jupyter:
PYSPARK_DRIVER_PYTHON = jupyter \ PYSPARK_DRIVER_PYTHON_OPTS = 'notebook --ip=0.0.0.0' \ pyspark - rapids - - master local[ * ] <options> |
然后通過記錄的 URL 連接到 Jupyter notebook 服務器。 然后,您可以在一個或多個 notebook 單元中以交互方式運行類似于 app.py
的代碼。
您可以添加 RAPIDS Accelerated Spark 插件 jar 和 spark.plugins
config,以實現端到端加速。
在對 --master
進行適當設置后,您可以使用相同的命令在其他 Spark 集群部署 (如 standalone、yarn) 中啟用零代碼更改 notebook 加速。
Jupyter notebook:云提供商托管的 Spark
對于云托管的 Spark Jupyter Notebooks 中的零代碼更改 UX, Spark RAPIDS ML 存儲庫 展示了如何在啟動 GPU Spark 集群時配置示例初始化和引導腳本,以啟用 SQL/Dataframe 加速和 MLlib 加速。提供了適用于 Databricks、GCP Dataproc 和 AWS EMR 的示例。
init 腳本將簡單的修改注入到各自托管的 Spark 環境中,從而在啟用零代碼更改加速的情況下啟動 Jupyter notebooks。
工作原理
通過在 Spark RAPIDS ML Python 庫中導入或運行新的 spark_rapids_ml.install
模塊,上述 CLI 和 Jupyter Notebook 部署啟用的 Spark MLlib 零代碼更改加速功能在幕后得到了支持。
這一新模塊在很大程度上基于去年 GTC 大會上發布的 RAPIDS cudf.pandas Python 包中的類似功能,該包為熱門 Pandas 數據分析庫的用戶帶來了零代碼更改 GPU 加速的 UX。
導入或運行新的 spark_rapids_ml.install
模塊會覆蓋 Python 的模塊導入機制,以透明地將應用代碼中的 pyspark.ml
估測器導入重定向到加速的 spark_rapids_ml
對應項(如果可用)。*一個棘手的問題是,當導入來自 PySpark 或 Spark RAPIDS ML 代碼本身時,要避免這樣做,因為在這些情況下,導入實際的 pyspark.ml
估測器至關重要。
后續步驟
您可以嘗試新的零代碼更改加速 Spark MLlib 功能,通過安裝 spark-rapids-ml Python 包 并在 Spark RAPIDS ML GitHub repo 中引用文檔以實現零代碼更改 CLI 和 notebook ,以及在 repo 中運行零代碼更改測試腳本,來增強適用于 Apache Spark 的原始 RAPIDS 加速器。
?
?
?