• <xmp id="om0om">
  • <table id="om0om"><noscript id="om0om"></noscript></table>
  • 數據科學

    利用 RAPIDS 和 Ray 加速 GPU 數據分析

    RAPIDS 是一套開源 GPU 加速的數據科學和 AI 庫,可通過 Spark Dask 等分布式引擎進行橫向擴展。 Ray 是一種熱門的開源分布式 Python 框架,常用于擴展 AI 和機器學習 (ML) 應用。Ray 特別擅長簡化和擴展訓練和推理工作流,并且可以輕松面向 CPU 和 GPU 設備。

    在本文中,我們將探討如何使用 Ray 和 RAPIDS 加速新型分析流程。

    Ray Actors?

    Ray 提供用于 訓練 服務 ML 模型的高級抽象概念 ,同時我們將試驗 Ray 的核心,尤其是 Ray Actors。Actors 是有狀態的 workers,這意味著每個 worker 都可以存儲、管理和變異存儲的任何數據。例如,如果您想使用 cuDF 在 GPU 上加載一些數據,可以執行以下操作:

    @ray.remote(num_gpus=1)
    class cuDFActor:
        def __init__(self):
            ...
     
        def read_parquet(self, filepath: str, columns: list = None) -> cudf.DataFrame:
            return cudf.read_parquet(filepath, columns=columns)
     
    # Start 4 Workers
    pool_size = 4
    actor_pool = [cuDFActor.remote() for i in range(pool_size)]

    此示例使用 Ray 在四個 GPU 上創建四個 Actor,并使用 cuDF 加速 IO。此示例可與其他 RAPIDS 優化 (使用 RMM 進行內存配置) 或常見 ETL 例程 (例如過濾/自定義函數和用戶定義函數) 一起使用:cudf ray-actor 示例。

    Ray Actors 非常通用,可以快速用于并行 Python 庫,還可以輕松集成現有的分布式算法。此外,借助 Ray,您可以在多個 GPUs 和多個節點上輕松擴展這項工作。

    NCCL 和 cuGraph?

    許多 RAPIDS 實現的流行算法已經為 C++ 中的分布式加速 GPU 計算而構建。這些實現經過高度調整,并且依賴于與 NCCL 以及 RAFT 中的基元和求解器 (成對距離、k-means 聚類、迭代求解器等) 的加速通信。RAFT 基元用于多個 RAPIDS 庫 (包括 cuML 和 cuGraph)。

    例如,cuGraph 弱連接組件 (WCC) 實現在很大程度上基于已盡快清理數據的流水線,從磁盤到較低級別的 CUDA C++ 實現。WCC 是一個很好的目標,它展示了開發者如何同時使用 RAPIDS (cuGraph) 和 Ray 來訪問功能強大的分布式加速算法。

    要實施 WCC,需要以下內容:

    1. 將數據加載到 GPU 顯存中
    2. 啟動 NCCL 通信 (以及 cuGraph 子通信器)
    3. 實例化和配置內部多 GPU cuGraph 實現
    4. 執行 WCC

    第一步已經演示。 雖然 Ray 具有 NCCL hook ,但由于 cuGraph 很難管理通信,因此我們將依賴 RAFT NCCL 接口。以下是對剛才概述的要求的省略:

    class RAFTActor:
        def __init__(self, index, pool_size, session_id):
            ...
     
        def broadcast_root_unique_id(self):
            # broadcast root/rank-0 to all actors
     
        def _setup_nccl(self):
            # start NCCL with identified rank-0 actor
     
        def _setup_raft(self):
            # configure RAFT and NCCL together
     
        def set_root_unique_id(self, root_uniqueId):
            # To be set rank-0 for all actors
     
    @ray.remote(num_gpus=1)
    class WCCActor(RAFTActor):
        def __init__(self, index, pool_size, session_id):
            super().__init__(index=index, pool_size=pool_size, session_id=session_id, actor_name_prefix="WCC")
     
        def weakly_connected_components(self, df):
            """
            1. Each actor loads in a chunk
            2. Each actor has a NCCL/RAFT Handle
            3. Pass each chunk and handle to MGGraph
            """
     
            src_array = df['src']
            dst_array = df['dst']
            weights = df['wgt']
     
            # Configure and setup a Multi-GPU cuGraph Object with
            # edge list data and NCCL
         graph = MGGraph(src_array, dst_array, weights, ...)
          
            # Execute WCC
         weakly_connected_components(graph)
     
    # Initialize Ray and Run WCC algorithm

    這包括運行 cuGraph 弱連接組件所需的兩個類別。如需了解詳情,請參閱 弱連接組件的實現 。大部分工作是配置 NCCL/RAFT。此模式適用于 cuML 等其他庫,如 cuML k-means 實現所示。

    結束語?

    Ray 提供可表達且可擴展的 Actor 接口,可輕松用于 RAPIDS。我們探討了如何連接 Ray Actors 以使用優化的 CUDA C++ 和 NCCL 實現。本次探索主要側重于將 Ray Actors 作為啟動器的 Level 1 集成。

    要詳細了解 GPU 加速數據處理,請加入 RAPIDS Slack 社區 中的 3500 多名成員。

    ?

    0

    標簽

    人人超碰97caoporen国产