新聞中心

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

當前位置:首頁 > 新聞中心
資訊分類 · 新聞中心 發佈時間 · 2025-01-10

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 工作流提供性能和穩定性。這使其成為擴展資料科學工作流的理想選擇,而無需犧牲可用性或修改大量代碼。