前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python 实用技能 RAPIDS | 利用 GPU 加速数据科学工作流程

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

作者头像
叶庭云
发布2022-12-25 09:59:13
1.9K0
发布2022-12-25 09:59:13
举报
文章被收录于专栏:Python进阶之路Python进阶之路

文章目录

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 加速数据科学啦!

代码语言:javascript
复制
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 模型的库。

代码语言:javascript
复制
import os
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn.datasets import make_circles

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

代码语言:javascript
复制
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 算法并设置一些参数:

代码语言:javascript
复制
from sklearn.cluster import DBSCAN

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

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

代码语言:javascript
复制
%%time
y_db = db.fit_predict(X)

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

使用 Scikit-Learn 在 CPU 上运行 DBSCAN 的结果
使用 Scikit-Learn 在 CPU 上运行 DBSCAN 的结果

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

代码语言:javascript
复制
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 的函数格式完全相同:相同的参数、相同的样式、相同的函数。

代码语言:javascript
复制
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 的预测函数。

代码语言:javascript
复制
%%time
y_db_gpu = db_gpu.fit_predict(X_gpu)

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

使用 cuML 在 GPU 上运行 DBSCAN 的结果
使用 cuML 在 GPU 上运行 DBSCAN 的结果

使用 Rapids GPU 获得超高速

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

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

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

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

代码语言:javascript
复制
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


参考链接:

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-12-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、前言
  • 二、用 RAPIDS 实现 GPU 加速
  • 三、RAPIDS 实践
相关产品与服务
大数据
全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档