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

    RAPIDS 24.12 推出基于 PyPI 的 cuDF、適用于 Polar 的 CUDA 統一內存和更快的 GNN

    RAPIDS 24.12 cuDF 包引入 PyPI,加快了 groupby 聚合和從 AWS S3 讀取文件的速度,在 Polars GPU 引擎中支持大于 GPU 內存的查詢,并加快了真實圖形的圖形神經網絡 (GNN) 訓練速度。

    cuDF 和 RMM CUDA 12 軟件包現在可在 PyPI 上獲得

    從 24.12 版本的 RAPIDS 開始,rmmcudfdask-cudf 的 CUDA 12 版本及其所有依賴項現在均可 在 PyPI 上使用 。因此,安裝這些庫不再需要使用 –extra-index-urlpip 的其他配置。試用:

    pip install \
    ????'cudf-cu12==24.12.*' \
    ????'dask-cudf-cu12==24.12.*'\
    ????'rmm-cu12==24.12.*'

    這也意味著 Polars 用戶無需再在安裝期間指定額外的索引即可獲得 GPU 支持:pip install polars[gpu] 即可正常工作。

    這是通過 pypi.org 提供 RAPIDS 庫的持續努力的第一步。敬請關注,了解更多信息。

    Polars GPU 引擎:擴展對大數據規模的支持

    我們與 Polars 一起在 Open Beta 中推出了基于 cuDF 構建的 Polars GPU 引擎,將加速計算引入到適合 GPU 內存的 Polars 工作負載中。但是,隨著數據大小的增加,使用 Polars GPU 引擎處理數據集可能會導致 GPU 內存不足 (OOM) 錯誤。

    24.12 版本引入了兩項功能來消除 OOM,同時在大型數據集大小下保持出色性能:分塊 IO 和 CUDA 統一內存。

    分塊 IO?

    首先,cudf-polars 現在以塊 (默認為每個塊 8 GiB) 處理 parquet 文件,同時保持高解壓縮和解碼吞吐量。

    壓縮文件需要在內存中進行擴展,這可能會導致一些工作負載在 IO 期間顯存不足,而如果數據位于內存中,這些工作負載就會成功。這對于 ZSTD 壓縮尤其重要,因為實際內存占用通常是文件大小的 3 倍。

    分塊 IO 可減少此峰值內存壓力,助力更多工作負載取得成功。

    CUDA 統一顯存?

    其次,此版本在 cudf-polars 中默認啟用預取的托管內存池,這與之前在 cudf.pandas 中完成的工作類似。有關更多詳細信息,請參閱使用 RAPIDS cuDF 在 pandas 中擴展至十億行數據。

    統一內存使 DataFrames 能夠在 GPU 和主機內存之間進行擴展,高效處理通過 GPU 互連 (PCIe 或 C2C) 進行的數據遷移,實現無縫處理。

    借助 Unified Memory 和 prefetching,Polars GPU 引擎現在可以處理更大的數據集,而不會出現顯存不足的情況。

    PDS-H 基準測試?

    在上一版本中,隨著 Scale Factor(數據集大小)超過 80 GB 或 100 GB,許多使用 Polars GPU 引擎運行的 PDS-H 基準查詢將在 NVIDIA H100 GPU 上顯存不足。

    借助這些增強功能,Polars GPU 引擎現在可以高效處理適合 GPU 和 CPU 組合顯存但之前會導致 GPU OOM 錯誤的工作負載。

    圖 1 比較了使用 RAPIDS 24.10 和 24.12 在 PDS-H 基準測試中進行的 22 次查詢中 Polars GPU 與 Polars CPU 引擎的加速比。根據對 Scale Factors 的掃描,先前因 OOM 而失敗的查詢現已成功。與僅使用 CPU 的基礎設施相比,更新后的引擎現在可以大幅加速,甚至可提升至 Scale Factor 250 (250 GB)。

    Two charts comparing the speedup ratio for Polars GPU versus Polars CPU engines across the 22 queries from the PDS-H benchmark. In the RAPIDS 24.12 release, the Polars GPU engine can now efficiently process workloads that fit in combined GPU+CPU memory but would previously cause GPU out-of-memory errors.
    圖 1、在 RAPIDS 24.12 中,Polars GPU 引擎現在可以高效處理適合 GPU+CPU 組合顯存的工作負載,但之前會導致 GPU 顯存不足錯誤

    GPU:NVIDIA H100|CPU:雙路英特爾 Xeon 8480CL (Sapphire Rapids)|存儲:本地 NVMe。注意:PDS-H 源自 TPC-H,但這些結果無法與 TPC-H 結果進行比較。

    cuDF 性能改進?

    RAPIDS 24.12 還包括兩項性能優化,旨在改善大規模數據處理工作流程。

    cuDF 中更快的低基數 groupby?

    此版本包括針對 cuDF 中基于哈希的 groupby 聚合的新優化。以前,處理低基數 (少量組) 的 groupby 聚合會導致吞吐量相對較低。

    吞吐量較低的原因是當組數量低于 100 時發生原子爭用。現在,通過使用 GPU 共享內存來追蹤部分聚合,可以避免此瓶頸。

    以下代碼示例展示了此效果的實際應用:

    import cudf, cupy, rmm
    import time
    rmm.mr.set_current_device_resource(rmm.mr.CudaAsyncMemoryResource())
    ?
    df = cudf.DataFrame({
    ????'key': cupy.ones(100_000_000),
    ????'payload': cupy.random.rand(100_000_000),
    })
    ?
    for _ in range(3):
    ????t0 = time.time()
    ????g = df.groupby('key').agg({'payload': 'sum'}).reset_index()
    ????t1 = time.time()
    ?
    print(f'cudf {cudf.__version__}: {t1-t0:0.3f} seconds')
    ?
    cudf 24.10.01: 0.177 seconds
    cudf 24.12.01: 0.012 seconds
    pandas 2.2.3:? 1.463 seconds

    在配備 NVIDIA H100 GPU 和 Intel Xeon Platinum 8480CL CPU 的系統上執行,可在此用例中將 cuDF 24.10 至 24.12 的速度提高 15 倍。

    此優化對于 Spark 和 Dask 用戶特別有用,因為在這些用戶中,大型工作負載可能需要對少量類別得出聚合結果。

    AWS S3 提供更快的 IO (遠程存儲)

    cuDF 24.12 為 cuDF 和 Dask-cuDF 引入了新的可選擇功能,用于多線程 S3 對象讀取。

    新功能基于 KvikIO 中用于管理 S3 對象讀取的 libcurl 用法,可顯著提高 Dask cuDF 中 S3 讀取的整體性能和可擴展性。可以使用 CUDF_KVIKIO_REMOTE_IO 環境變量啟用,并使用 KVIKIO_NTHREADS 進行控制。

    在圖 2 中,KvikIO (通過 CUDF_KVIKIO_REMOTE_IO=ON) 用于將 Red-Pajama v2 數據集的子集從 S3 存儲桶讀取到具有不同線程數的 4-GPU g5.12xlarge EC2 實例。

    Chart comparing the throughput (MB/s) of reading a subset of the Red-Pajama v2 dataset from an S3 bucket to a 4-GPU g5.12xlarge EC2 instance with the new KvikIO-based multi-threaded object read functionality. On this dataset, throughput increases significantly up to 128 threads.
    圖 2、新的多線程 S3 對象讀取可選功能可顯著提高 cuDF 和 Dask cuDF 中 S3 讀取的整體性能和可擴展性

    在這種情況下,KVIKIO_NTHREADS=128 的總吞吐量為 963 MiB/s,而不使用 KvikIO 的總吞吐量為 450 MiB/s。

    由于每個工作負載都不同,因此線程數量是可配置的。我們目前正在研究一系列數據集和系統中的適當默認配置,因此此功能目前可供用戶選擇,但可廣泛使用。

    在 WholeGraph 中通過基于層次結構的集合加快 GNN 訓練速度

    此版本還通過專為 power-law 圖形設計的新通信優化,顯著提升了 WholeGraph 的性能。

    定律圖的度數分布與圖 3 所示相似。大多數頂點的度數很小 (許多頂點只有一個近鄰),而一些頂點的度數非常高且高度連接。大多數真實圖形都屬于這一類。

    Degree distribution of a power-law graph, where the x-axis is the degree value, and the y-axis is the number of vertices with the given degree. Power-law graphs have a skewed degree distribution. Most vertices have very few neighbors, but a few key vertices have many neighbors and appear frequently in the edge list.
    圖 3、ogbn-papers100M 數據集是定律圖的典型示例,其中大多數頂點的度數很小,但一些頂點的度數很高

    對冪律圖進行采樣時,最高度頂點可以在批量中多次出現。對于 ogbn-papers100M 數據集,使用 8 個 GPU 進行訓練時,重復頂點的百分比最高可達 70%。

    通過僅讀取重復頂點的特征張量一次,我們可以在特征獲取階段節省大量時間。這稱為基于層次結構的收集操作,而不是默認的分布式收集操作。

    在這些場景中,使用基于層次結構的收集操作可獲得比分布式收集操作高 2 倍的速度。更快的采集步驟可為批量大小為 1,024 的三層 GraphSAGE 模型提供約 30-40% 的端到端加速。

    Chart comparing the average time per epoch to train a 3-layer GraphSAGE model with batch size 1,024 on different systems using the distributed (old) and hierarchy-based (new) gather operation. Across the system configurations, the hierarchy-based gather improves end-to-end performance by 29-41%.
    圖 4、對于批量大小為 1,024 的三層 GraphSAGE 模型,使用基于層次結構的收集操作可將端到端速度提高約 30-40%

    系統:NVIDIA DGX H100

    結束語?

    RAPIDS 24.12 版本為 DataFrame 分析和 GNN 訓練帶來了顯著的用戶體驗改進和性能優化。Polars GPU 引擎處于 Open Beta 階段,多線程 AWS S3 文件讀取處于實驗階段。歡迎您向 GitHub 提供反饋。您還可以加入 RAPIDS Slack 社區 的 3,500+ 名成員,討論 GPU 加速的數據處理。

    如果您不熟悉 RAPIDS,請查看這些 資源以開始使用

    ?

    0

    標簽

    人人超碰97caoporen国产