数据科学

7 种可即时加速 Python 数据科学工作流程的插入式替代方案

您已经经历过。您编写了完美的 Python 脚本,在示例 CSV 上对其进行了测试,一切都很完美。但是,当您在 1000 万行数据集上运行该模型时,笔记本电脑风扇开始尖叫,控制台冻结,您有足够的时间煮三壶咖啡,然后才能看到结果。

如果您可以通过一个简单的标志或参数开关在这些相同的流程中获得巨大的加速,那会怎样?

事实证明,您可以做到。许多最受欢迎的 Python 数据科学库(包括 pandas、Polars、scikit-learn 和 XGBoost)现在可以在 GPU 上运行得更快,几乎无需更改代码。借助 NVIDIA cuDF、cuML 和 cuGraph 等库,您可以保留现有代码并轻松扩展其规模,以处理更大的工作负载。

本文介绍了如何加速七个热门 Python 库的直接替换,并提供了入门代码供您自己尝试。

在更大的数据集上加速运行 pandas 和 Polars

数据准备是任何数据科学或机器学习项目的基石。这通常是工作流中最耗时的部分,但并非必须如此。

#1: %%load_ext cudf.pandas:使用未经修改的 pandas 进行 GPU 加速

pandas 是 Python 数据科学的基石,但它在处理大型数据集时速度会变慢。借助 cudf.pandas,您可以保持代码完全相同,同时仍然获得 GPU 加速。

使用方法:只需在脚本或笔记本的顶部加载 cudf.pandas 扩展程序即可。然后,cuDF 将尽可能在 GPU 上智能地运行您的 pandas 命令,从而显著加快您的工作流。

# Just add this to the top of your script!
%load_ext cudf.pandas


# Your existing pandas code now runs on the GPU
import pandas as pd
df = pd.read_csv("your_large_dataset.csv")

# ... all your other pandas operations are now accelerated

观看启用 cudf.pandas 后,此股票分析工作流的运行速度有多快:

视频 1。在 pandas 中,开启和关闭 cuDF 时,处理 1800 万行股票数据的性能对比

立即试用:

#2:.collect(engine="gpu"):让 Polars 变得更快

Polars 以其速度闻名。现在,您可以将强大的查询优化与 cuDF 的原始处理能力相结合,以获得更高的性能。

工作原理:Polars 具有内置执行引擎,可以指向 GPU。通过启用 cuDF 驱动的引擎,您可以让 Polars 利用 GPU 进行操作。

# pip install polars using the "GPU" feature flag
pip install polars[gpu]
 
import polars as pl


# Call the GPU engine at collection
(transactions
 .group_by("CUST_ID")
 .agg(pl.col("AMOUNT").sum())
 .sort(by="AMOUNT", descending=True)
 .head()
 .collect(engine="gpu"))

以下是我们在有和没有 GPU 加速的情况下运行相同的 Polars 查询时所发生的情况。

视频 2。演示了由 cuDF 提供支持的 Polars GPU 引擎如何处理通常会导致速度下降的大型交易数据集,在不到两秒内处理 1 亿行数据

立即试用:

更快地训练 scikit-learn 和 XGBoost 模型

在准备数据后,是时候训练模型了,而这正是许多 Python 工作流遇到另一个瓶颈的地方。scikit-learn 和 XGBoost 等库功能强大,但在大数据集上运行速度会变慢。幸运的是,两者都提供了一种简单的方法来解锁 GPU 加速并大幅缩短训练时间。

#3:%%load_ext cuml.accel:在 GPU 支持下更快地训练 scikit-learn 模型

许多数据科学家依靠 scikit-learn 来完成分类、回归和聚类等日常机器学习任务。但随着数据的增长,以及超参数调优和可视化周期的增加,训练时间也随之增加。借助 cuML,您可以在 GPU 上加速热门的 scikit-learn 模型,从而节省时间,并在不更改代码的情况下对更大数据集进行训练。

工作原理:只需加载加速器,并像往常一样继续编写 scikit-learn 代码。在后台,cuML 处理 GPU 执行。语法没有变化。没有新的 API。

%load_ext cuml.accel


from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
 
X, y = make_classification(n_samples=500000, n_features=100, random_state=0)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
 
rf = RandomForestClassifier(n_estimators=100, random_state=0, n_jobs=-1)
 
rf.fit(X_train, y_train)

观看 RandomForestClassifier 训练时间从几分钟缩短到几秒:

视频 3. cuML 加速机器学习训练,无需更改代码

立即试用:

注意:虽然 cuml.accel 适用于许多常见的 scikit-learn 模型,但其覆盖范围仍在不断扩大。某些工作流可能会部分回退到 CPU,详情请参阅支持的估算器。

#4: device = "cuda":在 XGBoost 中使用一个参数启用 CUDA 加速

XGBoost 是一个世界级的、屡获殊荣的库,内置 GPU 加速功能。您只需打开它即可。

工作原理:无需使用不同的库。只需在模型初始化期间将设备参数设置为“cuda”即可利用 GPU。

# Just set the device to "cuda"
xgb_model = xgb.XGBRegressor(device="cuda") 
xgb_model.fit(X,y)

此演示展示了如何通过启用 GPU 加速来加速模型训练,并在特征工程和超参数调优期间实现更快的迭代,从而在更短的时间内轻松测试、优化和改进模型。

视频 4。演示如何使用 GPU 加速 XGBoost 工作流,并使用实际出租车票价数据。它介绍了如何构建基线模型,以及如何通过高级特征工程提高模型准确性。

立即试用:在 Colab 中运行

加速探索性机器学习和聚类工作流

在训练模型之前,通常会探索高维模式或识别数据中的聚类。UMAP 和 HDBSCAN 等工具非常适合这项工作,但它们在处理大型数据集时速度会变慢。借助 cuML,您可以更快地运行这些工作流。

#5:%%load_ext cuml.accel:让 UMAP 可视化在几秒内运行,而不是几分钟

UMAP 是一种强大的降维技术,但它在处理大型数据集时速度非常慢。cuML 的实现让您能够在极短的时间内创建令人惊叹的可视化效果。

工作原理:与 scikit-learn 类似,只需更改导入内容以使用 cuml.accel,然后让 GPU 完成繁重的工作。

%%load_ext cuml.accel

import umap
umap_model = umap.UMAP(n_neighbors=15, n_components=2, random_state=42, min_dist=0.0)

# Fit UMAP model to the data
X_train_umap = umap_model.fit_transform(X_train_scaled)

以下是 cuML 如何加速真实数据集上的 UMAP 的并排演示。

视频 5。使用相同的 umap-learn 代码在 CPU 和 GPU 上对 UCI HAR 数据集进行 UMAP 投影。由于 cuML 的加速模式,GPU 版本可在不到一秒的时间内运行,无需任何代码更改。

立即试用:

#6:%%load_ext cuml.accel:在数百万行上实现更快的 HDBSCAN 聚类

基于密度的聚类在 CPU 上可能非常慢,尤其是在处理高维数据时。借助 cuML 的加速模式,您可以在几秒钟内发现复杂结构,而无需花费几分钟时间。

工作原理:加载 cuml.accel 扩展程序,您现有的 HDBSCAN 代码将自动在 GPU 上运行,无需重构。

%%load_ext cuml.accel
import hdbscan

clusterer = hdbscan.HDBSCAN()
time clusterer.fit(X)

使用 HDBSCAN 对大型数据集进行聚类可能非常耗时,即使在玩具示例上,CPU 运行也可能需要 30 到 60 秒。借助 cuML 的加速模式,您可以使用相同的 Python 代码在 1 秒内拟合 HDBSCAN 等聚类模型。

视频 6。观看如何通过单个导入(%load_ext cuml.accel)将高维数据集的 HDBSCAN 聚类时间从 45 秒降至 2 秒以下。无需重写代码。只需加载扩展程序,即可继续使用现有的 hdbscan 代码。

立即试用:

使用 NetworkX 扩展图形分析功能

图形对于分析数据中的关系非常强大,NetworkX 是用于处理图形的最广泛使用的库之一。

它提供数百种功能,帮助您轻松构建和分析各种图形结构。但其纯 Python 实现可能会成为大型数据集的瓶颈,因此很难扩展到 CPU 上的现实世界图形分析。

#7:%env NX_CUGRAPH_AUTOCONFIG=True:即时扩展 NetworkX 图表

为了克服这些扩展限制,NetworkX 生态系统现在包含一个由 cuGraph 提供支持的 GPU 加速后端,称为 nx-cugraph。借助 nx-cugraph,您可以保留完全相同的 NetworkX 代码并解锁 GPU 加速,无需更改代码。

工作原理:只需安装 nx-cugraph 并设置环境变量 NX_CUGRAPH_AUTCONFIG=True,然后运行您常用的 NetworkX 代码。NetworkX 可自动检测 nx-cugraph 支持的算法,并将其路由到 GPU 上的 cuGraph,无需重写或转换。

# Install the GPU-accelerated NetworkX backend
pip install nx-cugraph-cu11 --extra-index-url https://pypi.nvidia.com


# Enable GPU acceleration for NetworkX
%env NX_CUGRAPH_AUTOCONFIG=True

# Your existing NetworkX code stays the same
import pandas as pd
import networkx as nx

df = pd.read_csv("your_edgelist.csv", names=["src", "dst"])
G = nx.from_pandas_edgelist(df, source="src", target="dst")

centrality_scores = nx.betweenness_centrality(G, k=10)

以下是 NetworkX 在 CPU 和 GPU 上的并行比较:

视频 7。使用新的 nx-cugraph 加速器,对在 CPU 和 GPU 上运行的 NetworkX 进行并排演示。只需一个环境变量,无需更改代码,您就可以在更大的图形上运行标准 NetworkX 代码,而且只需几秒钟即可完成,而无需几分钟。

立即试用:

结论:相同的代码。更快的速度。

您无需成为 CUDA 专家,即可利用 GPU 的大规模并行处理能力。对于大量数据科学和机器学习工作流,这些工具已经到位。通过使用 cuDF、cuML 和 cuGraph 等库,您可以加速您喜爱的工具并更快地获得结果。

准备好开始构建了吗?本博客文章中的所有示例、笔记本和入门代码均位于此 GitHub 中。

 

标签