在数据科学领域,对数据进行高效处理是至关重要的。随着数据量的不断增长,传统的基于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