如何用cuDF加快Pandas的速度

如何用cuDF加快Pandas的速度

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

cuDF

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

为了从CPU转向GPU,即从Pandas转向cuDF,人们不需要从头开始学习一个新的库。cuDF提供了一个类似Pandas的API–使数据科学家、分析师和机器学习工程师从Pandas转向cuDF相当简单。就像Pandas一样,cuDF提供两种数据结构。大多数内置函数也可以在cuDF中以同样的语法使用。

CUDA/GPU 需求:

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

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
Python

Pandas和cuDF的计算时间比较

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

在下面的例子中,我们采取了一个由887379行和22列组成的大量数据集’Data.csv’。首先,我们将使用Pandas加载数据集,计算所需的时间,然后我们将使用cuDF重复加载相同的数据集,并比较运行时间。

使用Pandas来加载数据集:

# 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)
Python

输出:

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

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

使用cuDF来加载数据集:

# 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)
Python

输出:

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

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

从以上两个案例可以看出,CPU(Pandas)加载数据集需要2.3006720542907715秒,而GPU(cuDF)只需要0.1478710174560547秒,速度快很多。

cuDF中的箭形列式布局

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

以下是传统内存缓冲区和箭形内存缓冲区(柱状布局)的样本数据集。

如何用cuDF加快Pandas的速度?

传统内存缓冲器与箭形内存缓冲器

传统的内存缓冲器的数据是以行为单位存储在连续的内存位置。相反,在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领域有着巨大的意义,因为每秒钟都会有大量的数据产生–其快速的处理是必须的。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册