• <xmp id="om0om">
  • <table id="om0om"><noscript id="om0om"></noscript></table>
  • 3 月 19 日下午 2 點,鎖定 NVIDIA AI 網絡中文專場。立即注冊觀看
    數據科學

    在 NVIDIA GPU 上無需更改代碼即可加速 Apache Spark ML

    適用于 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 加速器。

    ?

    ?

    ?

    0

    標簽

    人人超碰97caoporen国产