头图

当涉及大量数据时,Pandas 可以有效地处理数据。但是它使用CPU 进行计算操作。该过程可以通过并行处理加快,但处理大量数据仍然效率不高。

在以前过去,GPU 主要用于渲染视频和玩游戏。但是现在随着技术的进步大多数大型项目都依赖 GPU 支持,因为它具有提升深度学习算法的潜力。

Nvidia的开源库Rapids,可以让我们完全在 GPU 上执行数据科学计算。在本文中我们将 Rapids优化的 GPU 之上的DF、与普通Pandas 的性能进行比较。

我们将在 Google Colab 中对其进行测试。因为我们只需要很少的磁盘空间但是需要大内存 GPU (15GB),而Colab 正好可以提供我们的需求。我们将从在安装开始,请根据步骤完成整个过程。

开启GPU

在菜单栏Colab 的“Runtime”选项中选择“Change runtime type”。然后选择GPU作为硬件加速器。

NV的显卡是唯一支持CUDA的显卡,Rapids只支持谷歌Colab中基于P4、P100、T4或V100的gpu,在分配到GPU后我们执行以下命令确认:

 !nvidia-smi

可以看到,分配到了一块T4,有15G的内存。如果分配到了其他GPU(如p4),可以在“Runtime”菜单并选择“Factory Reset Runtimes”,来重新申请。

安装 Rapids

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

运行以下命令,会更新现有的colab文件并重新启动内核。运行此命令后,当前会话将自动重新启动。

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

安装CondaColab

 import condacolab
 condacolab.install()

这条命令会让内核再次重启。重新启动后运行下面命令,确定安装是否成功:

 import condacolab
 condacolab.check()

下面就是在colab实例上安装Rapids了

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

完成后,就可以测试GPU的性能了!

简单对比测试

创建一个大的DF可以让测试gpu的全部潜力。我们将创建cuDF(cuda dataframe),其大小为10000000行x 2列(10M x 2),首先导入需要的库:

 import cudf 
 import pandas as pd
 import numpy as np

创建DF

 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是在GPU之上的DataFrame。Pandas的几乎所有函数都可以在其上运行,因为它是作为Pandas的镜像进行构建的。与Pandas的函数操作一样,但是所有的操作都在GPU内存中执行。

我们看看创建时的时间对比:

现在让我们看看GPU是否通过对这些数据帧执行一些操作来提高性能!

对数运算

为了得到最好的平均值,我们将对两个df中的一列应用np.log函数,然后运行10个循环:

GPU的结果是32.8毫秒,而CPU(常规的pandas)则是2.55秒!基于gpu的处理快的多的多。

从" Int "到" String "的数据类型转换

通过将的“col_1”(包含从0到10M的整数值)转换为字符串值(对象)来进一步测试。

可以看到,速度差距更大了

线性回归模型测试

一个模特的训练可能要花很长时间。模型在GPU内存中的训练可能因其类型而异。我们将使用基于gpu的cuML来测试简单的建模,并将其性能与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函数和train_test_split都与与sklearn的同名函数函数相同使用.to_pandas()函数可以将gpu的数据转换为普通的pandas df。

训练一个基于skearn的模型:

训练一个基于gpu的模型和训练一个基于cpu的模型没有太大的区别。

这里训练sklearn模型需要16.2秒,但是训练基于gpu的cuML模型只需要342毫秒!

总结

Pandas和sklearn这两个是我们最常用的基本库,Rapids将Pandas和sklearn的功能完整的平移到了GPU之上,这对我们来说是非常有帮助的,如果你对这两个库感兴趣可以参考他官方的文档试一试吧:

https://avoid.overfit.cn/post/7ee1826e416a40b7965bca9ab4ee28f1

作者:Onepagecode


deephub
116 声望91 粉丝