Python 实用技能 RAPIDS | 利用 GPU 加速数据科学工作流程

Posted 叶庭云

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 实用技能 RAPIDS | 利用 GPU 加速数据科学工作流程相关的知识,希望对你有一定的参考价值。

文章目录

CSDN 叶庭云https://yetingyun.blog.csdn.net/


一、前言

传统上,数据科学工作流程缓慢且繁琐,通常依靠 CPU 来加载、过滤和操作数据,以及训练和部署模型。凭借 RAPIDS 开源软件库,能够利用 GPU 显著降低基础设施成本,并为端到端数据科学工作流程提供出色性能。GPU 加速的数据科学在笔记本电脑、数据中心、边缘和云端均可使用。

数据科学家需要算力。无论您是用 Pandas 处理一个大数据集,还是用 Numpy 在一个大矩阵上运行一些计算,您都需要一台强大的机器,以便在合理的时间内完成这项工作。在过去的几年中,数据科学家常用的 Python 库已经非常擅长利用 CPU 能力。Pandas 的基础代码是用 C 语言编写的,它可以很好地处理大小超过 10GB 的大数据集。如果您没有足够的 RAM 来容纳这样的数据集,那么您可以使用分块功能,它很方便,可以一次处理一个数据块。

GPUs vs CPUs:并行处理

面对大量数据,单个 CPU 难以做到切分它。

一个超过 100GB 的数据集将有许多数据点,数据点的数值在数百万甚至数十亿的范围内。有了这么多的数据点要处理,不管你的 CPU 有多快,它都没有足够的内核来进行有效的并行处理。如果你的 CPU 有 20 个内核(这将是相当昂贵的 CPU),你一次只能处理 20 个数据点!

CPUs 在时钟频率更重要的任务中会更好—或者由于你根本没有 GPU 实现。如果你尝试执行的流程有一个 GPU 实现,且该任务可以从并行处理中受益,那么 GPU 将更加有效。

上图示意多核系统如何更快地处理数据。对于单核系统(左),所有 10 个任务都转到一个节点。对于双核系统(右),每个节点承担 5 个任务,从而使处理速度加倍。

深度学习已经在充分利用 GPU 性能的基础上取得了重要成功。深度学习中做的许多卷积操作是重复的,因此在 GPU 上可以大大加速,甚至可以达到 100 倍。如今的数据科学没有什么不同,因为许多重复的操作都是在大数据集上执行的,利用工具库:Pandas、Numpy 和 Scikit-Learn。这些操作对于在 GPU 上实现也不是很复杂。

目前有一个好的解决方案:RAPIDS


二、用 RAPIDS 实现 GPU 加速

以最少的代码更改和无需学习新工具的方式加速 Python 数据科学工具链。

RAPIDS 官方文档:https://rapids.ai/index.html

介绍 RAPIDS:https://www.youtube.com/watch?v=T2AU0iVbY5A


RAPIDS 是一个开源软件库套件,使您可以完全在 GPU 上执行端到端的数据科学和分析管道,旨在通过利用 GPU 加速数据科学。它使用底层 CUDA 代码来实现快速的、GPU 优化的算法,同时在顶层还有一个易于使用的 Python 层。Rapids 的美妙之处在于它与数据科学库的整合非常顺畅:像 pandas DataFrames 可以容易地传递到 Rapids,以实现 GPU 加速。下图说明了 Rapids 如何在保持顶层易用性的同时实现低层的优化和加速。


Rapids 利用了几个 Python 库:

  • cuDF:Python GPU 版的 DataFrames,在数据处理和操作方面,它几乎可以做到 Pandas 所能做的一切;
  • cuML:Python GPU 版的机器学习库。它包含许多 Scikit-Learn 拥有的 ML 算法,所有这些算法的使用方式都非常相似;
  • cuGraph:Python GPU 版的图处理。它包含了许多常用的图分析算法,包括 PageRank 和各种相似度量。

三、RAPIDS 实践

通过前面的了解,知道 RAPIDS 可以利用 GPU 加速数据科学。现在重要的是我们需要配置环境和实践一下,感受一下怎么用的!

要安装 RAPIDS,请访问:https://rapids.ai/start.html,在这里你将看到如何安装 RAPIDS。你可以通过 Conda 将其直接安装到你的机器上,或者简单地使用 Docker 容器。在安装时,您根据实际情况设置您的系统规格,如 CUDA 版本和您想要安装的库。例如,我有 CUDA 11.3,想要安装所有的库,所以我的 install 命令是:

这一行命令完成运行,就可以开始用 GPU 加速数据科学啦!

conda create -n rapids-22.12 -c rapidsai -c conda-forge -c nvidia  \\
    cudf=22.12 cuml=22.12 cugraph=22.12 cusignal=22.12 cucim=22.12 python=3.8 cudatoolkit=11.3

对于本教程,我们将介绍 DBSCAN 的 scikit-learn 版本与 RAPIDS GPU 加速版本。我将使用一张 A5000 进行测试。DBSCAN 是一种基于密度的聚类算法,可以自动对数据进行聚类,而无需用户指定有多少个 cluster。在 Scikit-Learn 中有它的实现。我们将从获取所有导入设置开始。先导入用于加载数据、可视化数据和应用 ML 模型的库。

import os
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn.datasets import make_circles

make_circles 函数将自动创建一个复杂的数据分布,类似于我们将应用于 DBSCAN 的两个圆。让我们从创建 100000 个数据点的数据集开始,并在图中可视化:

X, y = make_circles(n_samples=int(1e5), factor=.35, noise=.05)
X[:, 0] = 3*X[:, 0]
X[:, 1] = 3*X[:, 1]
plt.scatter(X[:, 0], X[:, 1])
plt.show()


CPU 上的 DBSCAN:使用 Scikit-Learn 在 CPU 上运行 DBSCAN 很容易。我们将导入 DBSCAN 算法并设置一些参数:

from sklearn.cluster import DBSCAN

db = DBSCAN(eps=0.6, min_samples=2)

我们现在可以通过调用 Scikit-Learn 中的一个函数对循环数据使用 DBSCAN。在函数前面加上一个 %%time,就可以让 Jupyter Notebook 合理测量它的运行时间。

%%time
y_db = db.fit_predict(X)

这 10 万个点的运行时间大约是 8.31 秒,如下图所示:

现在,让我们用 Rapids 进行加速!首先,我们将把数据转换为 pandas.DataFrame 并使用它创建一个 cudf.DataFrame pandas.DataFrame 无缝转换成 cudf.DataFrame,数据格式无任何更改。

import pandas as pd
import cudf

# 如果有表格 csv 数据也可以直接从 csv 数据读取:
# https://docs.rapids.ai/api/cudf/stable/api_docs/io.html
# X_df = cudf.read_csv("./datas/gene_edges_embeddings.csv")
X_df = pd.DataFrame(fea%d %i: X[:, i] for i in range(X.shape[1]))
X_gpu = cudf.DataFrame.from_pandas(X_df)

然后我们将从 cuML 导入并初始化一个 GPU 加速的版本的 DBSCAN。DBSCAN 的 cuML 版本的函数格式与 Scikit-Learn 的函数格式完全相同:相同的参数、相同的样式、相同的函数。

from cuml import DBSCAN as cumlDBSCAN

db_gpu = cumlDBSCAN(eps=0.6, min_samples=2)
# print(" ".join(["CSDN", "叶庭云", "https://yetingyun.blog.csdn.net/"]))

最后,我们可以在测量运行时间的同时运行 GPU DBSCAN 的预测函数。

%%time
y_db_gpu = db_gpu.fit_predict(X_gpu)

GPU 版本的运行时间为 4.22 秒,几乎加速了 2 倍。由于我们使用的是相同的算法,因此结果图也与 CPU 版本完全相同。

使用 Rapids GPU 获得超高速

我们从 Rapids 获得的加速量取决于我们正在处理的数据量。一个好的经验法则是,较大的数据集将更加受益于 GPU 加速。在 CPU 和 GPU 之间传输数据有一些开销时间,而对于较大的数据集,开销时间变得更值得。

我们可以用一个简单的例子来说明这一点。

我们将创建一个随机数的 Numpy 数组并对其应用 DBSCAN。我们将比较常规 CPU DBSCAN 和 cuML 的 GPU 版本的速度,同时增加和减少数据点的数量,以了解它如何影响我们的运行时间。

下面的代码说明如何进行测试:

import numpy as np

n_rows, n_cols = 10000, 100
X = np.random.rand(n_rows, n_cols)
print(X.shape)
X_df = pd.DataFrame( fea%d %i: X[:, i] for i in range(X.shape[1]))
X_gpu = cudf.DataFrame.from_pandas(X_df)
db = DBSCAN(eps=3, min_samples=2)
db_gpu = cumlDBSCAN(eps=3, min_samples=2)
%%time
y_db = db.fit_predict(X)
%%time
y_db_gpu = db_gpu.fit_predict(X_gpu)

用 Matplotlib 可视化改变数据量多次实验的结果:

横轴是数据点的数量,纵轴表示 GPU speed 与 CPU speed 的比值。当使用 GPU 而不是 CPU 时,数量会急剧增加。即使在 10000 点(最左边),我们的速度仍然是 4.54x。在更高的一端,1 千万点,我们切换到 GPU 时的速度是 88.04x


参考链接:

以上是关于Python 实用技能 RAPIDS | 利用 GPU 加速数据科学工作流程的主要内容,如果未能解决你的问题,请参考以下文章

使用NVIDIA开源Python RAPIDS库数据分析

实用技能分享,充分利用内联函数,内联汇编,内部函数和嵌入式汇编提升代码执行效率和便捷性(2021-12-17)

实用技能分享,充分利用内联函数,内联汇编,内部函数和嵌入式汇编提升代码执行效率和便捷性(2021-12-17)

实用技能 | 常用的爬虫框架

Pandas 实用技能,将列(column)排序的几种方法

学会这些逆天且实用的python技能,邻居家小孩这一生都会将你膜拜