上一篇文章 中介紹的 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 加速數據處理中的兩個關鍵挑戰至關重要:
- GPU 顯存有限:許多 GPU (尤其是消費級型號) 的顯存明顯少于現代數據集。UVM 支持超額認購,允許工作負載利用系統內存擴展到物理 GPU 顯存之外。
- 易用性: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
的多次調用:

如需更深入地了解 Unified Memory,包括其優勢以及預取和內存建議 (cudaMemAdvise
) 等優化實例,請參閱技術博客 《面向 CUDA 初學者的 Unified Memory》(Unified Memory for CUDA Beginners)。該博客解釋了 UVM 在不同 GPU 架構中的工作原理,并提供了在實際應用中更大限度提高性能的技巧。
cuDF-pandas
如何利用 UVM?
在 cuDF-pandas
中,UVM 在實現高性能數據處理方面發揮著關鍵作用:
- 托管內存池:默認情況下,
cuDF-pandas
使用由 UVM 支持的托管內存池。此池可減少分配開銷,并確保有效利用主機和設備內存。 - 預取優化:預取可確保在內核訪問數據之前將數據遷移到 GPU,從而減少運行時頁錯誤。例如,在需要大量數據的 I/O 操作或連接期間,預取可通過主動將數據移動到設備內存來確保更流暢的執行。如前所述,這些預取調用發生在
libcudf
層中,用于特定內核,如 哈希連接 。
示例:Google Colab 上的大型連接和寫入 Parquet
考慮對兩個非常大的表執行 合并/連接操作 ,即在 Google Colab 的有限 GPU memory 中執行 cuDF-pandas
:
- 如果沒有 UVM,此操作將因設備內存不足而失敗。
- 啟用 UVM 后,數據集將在主機內存和設備內存之間進行分割。隨著連接的進行,系統僅會將所需的數據部分遷移到 GPU。
- 預取可確保在計算之前將相關數據引入設備內存,從而進一步優化此過程。
用戶可以利用 GPU 處理超過 GPU 顯存的更大數據集,而無需更改代碼。使用 Unified Virtual Memory (UVM)時,速度提升因操作而異,但在保持穩定性的同時,仍可顯著提升端到端應用的性能。

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

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