关于机器学习:在gpu上运行Pandas和sklearn

6次阅读

共计 2772 个字符,预计需要花费 7 分钟才能阅读完成。

当波及大量数据时,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

正文完
 0