GPU加速数据处理与Pandas性能对比

数据科学领域,对数据进行高效处理是至关重要的。随着数据量的不断增长,传统的基于CPU的处理方法逐渐显得力不从心。GPU(图形处理单元)因其并行处理能力而成为处理大数据的优选方案。本文将探讨Nvidia Rapids,这是一个开源库,允许在GPU上执行整个数据科学流水线,并将其性能与传统的Pandas库进行对比。

首先,将在Google Colab上测试这个库,因为它提供免费的GPU支持。Google Colab提供的GPU具有高内存(15GB)但磁盘空间较小。安装过程可能需要一些时间(大约16-18分钟)。以下是安装步骤:

第一步:启用GPU运行时。首先,点击菜单栏中的“运行时”选项,然后选择“更改运行时类型”。接下来,选择GPU作为硬件加速器。

第二步:检查图形卡。目前,CUDA仅支持Nvidia图形卡,它使得在GPU上运行通用编程成为可能。尽管Google Colab分配了基于Nvidia或Tesla的GPU,但Rapids仅支持Google Colab中的P4、P100、T4或V100 GPU。可以通过运行以下命令来确认:

! nvidia-smi

如果得到的是其他GPU(如Tesla T8),则需要返回“运行时”菜单,然后选择“恢复出厂设置”。

第三步:获取Rapids Colab安装文件。

! git clone https://github.com/rapidsai/rapidsai-csp-utils.git ! python rapidsai-csp-utils/colab/env-check.py

第四步:更新Colab环境文件并重启内核。以下命令将更新现有的Colab文件并重启内核。执行此命令后,会话将崩溃,但将自动重新启动。

! bash rapidsai-csp-utils/colab/update_gcc.sh import os os._exit(00)

第五步:安装condacolab。

import condacolab condacolab.install()

这是最后一次会话崩溃和内核重启。重启后,可以通过运行以下命令来检查安装是否成功:

import condacolab condacolab.check()

第六步:安装Rapids。最后一个设置命令也是最耗时的(大约15分钟),用于在Colab实例上安装Rapids并将文件复制到当前工作目录。

!python rapidsai-csp-utils/colab/install_rapids.py stable

现在已经准备好测试GPU的性能了!本文讨论的所有代码都可以在这个GitHub仓库中找到。

为了测试GPU的全部潜力,将创建一个相当大的数据框架。以下代码创建了Pandas和cuDF数据框架,大小为10000000行×2列(10M×2)!

第一步:导入库。

import cudf import pandas as pd import numpy as np

第二步:创建数据框架。

gpuDF = cudf.DataFrame({'col_1': np.random.randint(0, 10000000, size=10000000), 'col_2': np.random.randint(0, 10000000, size=10000000)}) pandasDF = pd.DataFrame({'col_1': np.random.randint(0, 10000000, size=10000000), 'col_2': np.random.randint(0, 10000000, size=10000000)})

cuDF是一个Python GPU数据框架。它被构建为Pandas数据框架的镜像,并且几乎提供了Pandas所提供的所有功能。它可以用作Pandas的替代品,并且将在GPU内存中执行所有操作。

创建这些数据框架的时间几乎相同,因为使用了NumPy数组而不是列表。如果使用列表,将观察到显著的差异。

接下来,将对这些数据框架执行一些操作,以捕捉速度差异,并检查GPU是否真的提高了性能!

1. 对数运算。对两种数据框架的一列应用np.log函数,并进行10次循环以获得最佳平均值:

%%timeit -n 10 pandasDF['log_1'] = np.log(pandasDF['col_1']) %%timeit -n 10 gpuDF['log_1'] = np.log(gpuDF['col_1'])

对数运算时间。如所见,对GPU数据框架应用对数函数的结果是每循环32.8毫秒,而Pandas数据框架为2.55秒!这就是在基于GPU的处理中预期的差异。所有过程都是高效的,并在高性能内存中完成。

2. 平方运算。对两种类型的数据框架的一列应用np.sqrt函数:

%%timeit -n 10 pandasDF['sqaure_1'] = np.sqrt(pandasDF['col_1']) %%timeit -n 10 gpuDF['square_1'] = np.sqrt(gpuDF['col_1'])

平方运算时间。在这里,执行时间从Pandas数据框架的每循环508毫秒减少到13.8毫秒!

3. 将“Int”数据类型转换为“string”。为了进一步让惊讶,让将两种类型数据框架的“col_1”(包含从0到10M的整数值)转换为字符串类型(对象)。

%%time pandasDF.col_1.astype(str) %%time gpuDF.col_1.astype(str)

整数到字符串类型的转换。这种执行速度差异在实际项目中很重要,其中需要快速的数据摄取和预测。

训练线性回归模型。模型训练可能需要很多时间。根据模型的类型,可能会有所不同,但如果模型在GPU内存中训练呢?使用Rapids是可能的。要传递给这个基于GPU的实现的数据框架是cuDF,不同之处在于模型将使用cuML库构建,这也是基于GPU的。

让一步一步构建这个模型,并将其性能与基于sklearn的模型进行比较!

第一步:导入必需品。

import cudf from cuml import make_regression, train_test_split from cuml.linear_model import LinearRegression as cuLinearRegression from cuml.metrics.regression import r2_score from sklearn.linear_model import LinearRegression as skLinearRegression

第二步:创建假数据并分割它(训练和测试)。

n_samples = 2**20 n_features = 399 random_state = 23 X, y = make_regression(n_samples=n_samples, n_features=n_features, random_state=random_state) X = cudf.DataFrame(X) y = cudf.DataFrame(y)[0] X_cudf, X_cudf_test, y_cudf, y_cudf_test = train_test_split(X, y, test_size = 0.2, random_state=random_state) X_train = X_cudf.to_pandas() X_test = X_cudf_test.to_pandas() y_train = y_cudf.to_pandas() y_test = y_cudf_test.to_pandas()

cuML库的make_regression函数使得根据提供的超参数创建回归数据集变得非常容易。它接受要包含在数据集中的特征数量和行数。

cuML的train_test_split函数与sklearn中使用的相同。

cudf.DataFrame.to_pandas() 将GPU驱动的数据框架转换为在CPU上运行的普通Pandas数据框架。

现在数据集已经准备好了,让训练一个基于sklearn的模型并检查其训练时间。

sk = skLinearRegression(fit_intercept=True, normalize=True, n_jobs=-1) sk.fit(X_train, y_train)

训练这个模型所花费的时间是:

sklearn模型训练

训练基于GPU的模型并不非常不同。

gpuModel = cuLinearRegression(fit_intercept=True, normalize=True, algorithm='eig') gpuModel.fit(X_cudf, y_cudf)

看看这次训练所花费的时间:

基于GPU的模型训练

虽然sklearn模型每个循环需要16.2秒来训练模型,基于GPU的cuML模型只需要342毫秒每个循环!

如果有任何疑问、查询或潜在机会,可以通过以下方式联系:

1. Linkedin – in/kaustubh-gupta/

2. Twitter – @Kaustubh1828

3. GitHub – kaustubhgupta

4. Medium – @kaustubhgupta1828

blogathon

GPU

pandas

k

kaustubh

数据科学

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485