📜  如何使用 cuDF 加速 Pandas?

📅  最后修改于: 2022-05-13 01:55:26.658000             🧑  作者: Mango

如何使用 cuDF 加速 Pandas?

Python中的 Pandas 数据框非常有用;它们提供了一种简单灵活的数据处理方式和大量内置函数来处理、分析和处理数据。虽然 Pandas 数据帧的处理时间不错,但在计算密集型操作的情况下,Pandas 数据帧往往很慢,导致数据科学和 ML 工作流程出现延迟。 pandas 数据帧的这种有限速度是因为 pandas 在只有 8 个内核的 CPU 上工作。然而,数据科学和机器学习工作流的 GPU 加速为这个问题提供了解决方案,并以令人印象深刻的水平提高了操作速度。

cuDF

cuDF (CUDA DF)是一个Python GPU 数据帧库,有助于加速海量数据的加载、处理和操作,从而使用户能够快速执行计算机密集型操作。 cuDF 基于 apache 箭头柱状布局,我们将在后面讨论。

为了从 CPU 转移到 GPU,即 Pandas 到 cuDF,不需要从头开始学习新的库。 cuDF 提供了一个类似于 Pandas 的 API——对于数据科学家、分析师和机器学习工程师来说,从 Pandas 到 cuDF 的转变非常简单。就像 Pandas 一样,cuDF 提供两种数据结构:Series 和 Dataframe——大多数内置函数在 cuDF 中也可用,语法相同。

CUDA/GPU 要求:

  • CUDA 11.0+
  • NVIDIA 驱动程序 450.80.02+
  • Pascal 架构或更好(计算能力 >=6.0)
  • 康达

cuDF 可以使用来自 rapidsai 频道的 conda 安装:

# for CUDA 11.0
conda install -c rapidsai -c nvidia -c numba -c conda-forge \
   cudf=21.08 python=3.7 cudatoolkit=11.0

# or, for CUDA 11.2
conda install -c rapidsai -c nvidia -c numba -c conda-forge \
   cudf=21.08 python=3.7 cudatoolkit=11.2

Pandas 和 cuDF 的计算时间比较

为了分析这两种情况所花费的时间,让我们尝试加载一个巨大的数据集 data.csv——首先使用 pandas 库,然后使用 cuDF,并比较两种情况下的计算时间。

在以下示例中,我们采用了包含 887379 行和 22 列的海量数据集“Data.csv” 。首先,我们将使用 Pandas 加载数据集计算所用时间,然后我们将使用 cuDF 重复相同的操作来加载相同的数据集并比较运行时间。

使用 Pandas 加载数据集:

Python3
# Loading the Dataset using Pandas Library (CPU Based)
import pandas as pd
import time
  
  
start = time.time()
df = pd.read_csv("Data.csv")
print("no. of rows in the dataset", df.shape[0])
print("no. of columns in the dataset", df.shape[1])
end = time.time()
print("CPU time= ", end-start)


Python3
# Loading the Dataset using Pandas Library (GPU Based)
import cudf
import time
  
start = time.time()
df = cudf.read_csv("../input/data-big/Data.csv")
print("no. of rows in the dataset", df.shape[0])
print("no. of columns in the dataset", df.shape[1])
end = time.time()
print("GPU time= ", end-start)


输出:

no. of rows in the dataset 887379
no. of columns in the dataset 22
CPU time=  2.3006720542907715

上述代码的输出使用Pandas加载 Data.csv。

使用 cuDF 加载数据集:

Python3

# Loading the Dataset using Pandas Library (GPU Based)
import cudf
import time
  
start = time.time()
df = cudf.read_csv("../input/data-big/Data.csv")
print("no. of rows in the dataset", df.shape[0])
print("no. of columns in the dataset", df.shape[1])
end = time.time()
print("GPU time= ", end-start)

输出:

no. of rows in the dataset 887379
no. of columns in the dataset 22
GPU time=  0.1478710174560547

上述代码的输出使用cuDF加载 Data.csv。

从以上两种情况可以看出, CPU(Pandas)加载数据集需要 2.3006720542907715 秒,而GPU(cuDF)只需 0.1478710174560547 秒,速度要快得多。

cuDF 中的箭头列式布局

如前所述,cuDF 采用 Apache Arrow Columnar Layout,这是一种用于表示结构化数据集的内存列格式。这种列格式速度很快,允许计算密集型操作在处理和迭代大数据集时以最高效率工作。

以下是传统内存缓冲区和箭头内存缓冲区(列式布局)中的示例数据集。

传统内存缓冲区与箭头内存缓冲区

传统的内存缓冲区,数据按行存储在连续的内存位置。相反,在 Arrow Memory Buffer 的情况下,数据按列存储在连续的内存位置中。这是加速 cuDF 数据帧速度的促成因素之一。

注意:由于 cuDF 要求您拥有特定的 RAPIDS 兼容 GPU,为了练习/探索,可以使用 Kaggle 或 Google Colaboratory,因为这两个平台都提供免费的 GPU 访问。但是,在使用 Google Colabs 时,只需确保为您分配了以下 GPU:Tesla T4、P4 或 P100,因为这些是 Google Colab 上唯一兼容 RAPIDS 的 GPU。

因此,很明显,使用 cuDF 我们可以在Python数据帧上使用 GPU 加速,并使数据处理速度非常快。这在数据科学和 ML 领域具有巨大的意义,因为每秒都在产生大量的数据——而且它的快速处理势在必行。