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

    統一虛擬內存利用 RAPIDS cuDF 為 pandas 提供強力支持

    上一篇文章 中介紹的 cuDF-pandas 是一個 GPU 加速庫,可加速 pandas 以實現顯著的性能提升,速度最高可提升至原來的 50 倍,而無需對現有代碼進行任何更改。作為 NVIDIA RAPIDS 生態系統的一部分,cuDF-pandas 充當代理層,盡可能在 GPU 上執行運算,必要時 (通過 pandas) 回退至 CPU。這可確保與完整的 pandas API 和第三方庫兼容,同時利用 GPU 加速加快數據處理速度。只需加載 cuDF-pandas,用戶即可維護熟悉的 pandas 工作流程,同時獲得統一的 CPU/GPU 體驗。

    在幕后,cuDF-pandas 默認使用托管內存池,使其能夠處理超過 GPU 物理內存的數據集。這是通過 CUDA Unified Virtual Memory (UVM) 實現的,可提供跨主機 (CPU) 和設備 (GPU) 內存的統一地址空間。UVM 允許 cuDF-pandas 超額訂閱 GPU 內存,根據需要自動在主機和設備之間遷移數據。

    這篇博文將介紹為什么需要 UVM 及其優勢。

    為什么 cuDF-pandas 使用 UVM?

    統一虛擬內存對于解決 GPU 加速數據處理中的兩個關鍵挑戰至關重要:

    1. GPU 顯存有限:許多 GPU (尤其是消費級型號) 的顯存明顯少于現代數據集。UVM 支持超額認購,允許工作負載利用系統內存擴展到物理 GPU 顯存之外。
    2. 易用性:UVM 可自動處理 CPU 和 GPU 之間的數據遷移,從而簡化內存管理。這降低了編程的復雜性,并確保用戶可以專注于自己的工作流程,而無需擔心顯式內存傳輸。

    有關 UVM 的詳細信息?

    CUDA 6.0 中引入的 Unified Virtual Memory (UVM)可創建 CPU 和 GPU 之間共享的單個虛擬地址空間,從而簡化開發者的內存管理。UVM 根據訪問模式以頁面粒度透明遷移數據:

    • 當 GPU 訪問駐留在主機內存中的數據時,它會觸發頁錯誤,促使數據遷移到 GPU 內存。
    • 相反,當 GPU 顯存已滿時,使用較少的頁面會被逐回主機內存。

    雖然 UVM 通過消除顯式內存傳輸的需求來擴展內存容量并簡化編程,但由于頁面錯誤和遷移開銷,它可能會引入性能瓶頸。為緩解這些問題,我們采用了優化措施,如預取(例如,使用 cudaMemPrefetchAsync),以便在執行內核之前主動將數據遷移到 GPU。以下是 nsys 配置文件圖,其中顯示了在執行 libcudf 內核之前對 CUDA API 層中 cudaMemPrefetchAsync 的多次調用:

    An nsys-profile showing calls to cudaMemPrefetchAsync being made before execution of libcudf kernels.
    圖 1. 一個 nsys-profile,顯示在執行 libcudf 核函數之前對 cudaMemPrefetchAsync 的調用。

    如需更深入地了解 Unified Memory,包括其優勢以及預取和內存建議 (cudaMemAdvise) 等優化實例,請參閱技術博客 《面向 CUDA 初學者的 Unified Memory》(Unified Memory for CUDA Beginners)。該博客解釋了 UVM 在不同 GPU 架構中的工作原理,并提供了在實際應用中更大限度提高性能的技巧。

    cuDF-pandas 如何利用 UVM?

    cuDF-pandas 中,UVM 在實現高性能數據處理方面發揮著關鍵作用:

    1. 托管內存池:默認情況下,cuDF-pandas 使用由 UVM 支持的托管內存池。此池可減少分配開銷,并確保有效利用主機和設備內存。
    2. 預取優化:預取可確保在內核訪問數據之前將數據遷移到 GPU,從而減少運行時頁錯誤。例如,在需要大量數據的 I/O 操作或連接期間,預取可通過主動將數據移動到設備內存來確保更流暢的執行。如前所述,這些預取調用發生在 libcudf 層中,用于特定內核,如 哈希連接

    示例:Google Colab 上的大型連接和寫入 Parquet

    考慮對兩個非常大的表執行 合并/連接操作 ,即在 Google Colab 的有限 GPU memory 中執行 cuDF-pandas

    • 如果沒有 UVM,此操作將因設備內存不足而失敗。
    • 啟用 UVM 后,數據集將在主機內存和設備內存之間進行分割。隨著連接的進行,系統僅會將所需的數據部分遷移到 GPU。
    • 預取可確保在計算之前將相關數據引入設備內存,從而進一步優化此過程。

    用戶可以利用 GPU 處理超過 GPU 顯存的更大數據集,而無需更改代碼。使用 Unified Virtual Memory (UVM)時,速度提升因操作而異,但在保持穩定性的同時,仍可顯著提升端到端應用的性能。

    A plot comparing time taken by pandas and cuDF-pandas to merge. Pandas takes 28.2 s whereas cuDF-pandas takes 2.19s.
    圖 2、表格 pandas 與 cuDF-pandas 的合并持續時間比較。 CPU 硬件:Intel(R) Xeon(R) Gold 6130 CPU @ 2.10GHz,GPU 硬件:NVIDIA T4

    寫入 Parquet 文件也是如此。原本使用 cudf 運行到 MemoryError 的內容,現在使用 cuDF-pandas 成功完成,甚至比 pandas 更快。

    A plot comparing time taken by pandas and cuDF-pandas for writing a large table to parquet. Pandas takes 28.1 s whereas cuDF-pandas takes 14.4s.
    圖 3、根據 pandas 與 cuDF-pandas 的拼接持續時間編寫大型表格。 CPU 硬件:Intel(R) Xeon(R) Gold 6130 CPU @ 2.10GHz,GPU 硬件:NVIDIA T4

    結束語?

    統一虛擬內存是 cuDF-pandas 的基石,使其能夠高效處理大型數據集,同時保持與低端 GPU 的兼容性。通過利用托管內存池和預取等功能,cuDF-pandas 可在受限硬件上為 pandas 工作流提供性能和穩定性。這使其成為擴展數據科學工作流的理想選擇,而無需犧牲可用性或修改大量代碼。

    試用此 Google Colab notebook ,了解大于 GPU 內存的數據集的實際執行能力。

    ?

    0

    標簽

    人人超碰97caoporen国产