Scikit-learn 是应用最广泛的 ML 库,因其 API 简单、算法多样且与 pandas 和 NumPy 等热门 Python 库兼容,因此在处理表格数据方面备受欢迎。现在,NVIDIA cuML 使您能够继续使用熟悉的 Scikit-learn API 和 Python 库,同时使数据科学家和机器学习工程师能够在 NVIDIA GPU 上利用 CUDA 的强大功能,而无需更改任何应用代码。
在 NVIDIA cuML 25.02 中,我们将在公测版中发布无需更改代码即可加速 scikit-learn 算法的功能。2019 年首次推出的 NVIDIA cuML 已迅速为 Python 机器学习添加基于 CUDA 的 GPU 算法。借助最新版本,数据科学家和机器学习工程师能够保持 scikit-learn 应用不变,并在 NVIDIA GPU 上实现比 CPU 快 50 倍的性能。
此新版本的 cuML 还可加速领先的降维和聚类算法 UMAP 和 HDBSCAN,在 NVIDIA GPU 上的速度是 CPU 的 60 倍和 175 倍,且无需更改代码。
在本文中,我们将讨论 cuML 中新的零代码更改功能的工作原理,并展示如何将其用于 scikit-learn 应用的示例。
概述
在 CPU 上训练 ML 模型一次运行可能需要几分钟时间。多次迭代和超参数扫描会导致速度变慢,导致开发者工作效率降低、迭代次数减少以及模型质量降低。
此 cuML 版本将 cuDF-pandas 为 DataFrame 操作建立的零代码更改加速范式扩展到机器学习,将迭代时间缩短到数秒,且无需对代码进行任何更改。
过去,数据科学家必须自定义应用程序,以便使用 NVIDIA GPU 加速应用程序。这使得在不同平台上进行开发、训练和推理变得更加困难。
借助 cuML 中全新的零代码更改功能,现有的 scikit-learn 脚本可以保持不变地运行。cuML 会自动加速 NVIDIA GPUs 上的兼容组件,并针对不受支持的操作回退至 CPU 执行。这使得在 CPUs 上进行开发和在 GPUs 上进行部署成为可能,并且可以根据您的应用需求进行反向部署。
该测试版目前可通过零代码更改加速最热门的 scikit-learn 算法,包括随机森林、k-Nearest Neighbors、主成分分析 (PCA) 和 k-means 聚类。有关受支持方法的完整列表的更多信息,请参阅 cuML-accel 会加速什么? 正在进行的开发将根据用户反馈优先考虑额外的算法覆盖范围。
要在 NVIDIA GPU 上获得 ML 工作流的最高性能,请尽量减少 CPU 和 GPU 之间作为工作流一部分的数据传输。这可以通过以下方式实现:将数据加载到 GPU 上一次,然后执行预处理、ML 训练和推理,然后将结果发送回主机内存。
要使用 NumPy pandas 和 scikit-learn 过渡 CPU 工作流,请在发送返回结果之前使用 cuPy、cuDF-pandas 和 cuML。在此版本中,使用 cuDF-pandas 和 cuML 零代码更改的功能是试验性的,我们鼓励您在工作流中试用此功能。
要在 ML 模型推理期间获得最高性能,您可以使用 CUDA-X 生态系统中的库和模块在 GPU 上运行。
例如,要对随机森林模型执行推理,请使用 cuML 库中的 Forest Inference Library (FIL) 模块 。这可与 NVIDIA Triton 推理服务器 配合使用,在生产环境中部署和扩展 AI 模型。
幕后使用 cuML 零代码更改 scikit-learn
cuML 零代码更改功能通过 cuml.accel 模块实现。启用后,导入 scikit-learn 或其算法类会激活兼容性层,用于代理模型类型和函数。
对这些代理对象的操作通过受支持的 cuML 在 NVIDIA GPU 上执行,否则则退回到基于 CPU 的 scikit-learn 实现。即使与内部使用 scikit-learn 的第三方库集成,设备和主机内存之间的同步也会自动发生。
调用 scikit-learn 估计器时,如果 cuML 支持估计器,代理对象会生成 GPU 加速 (cuML) 模型实例,如果不支持,代理对象会创建 CPU 原生 (scikit-learn) 模型实例。
对于受支持的估测器,该方法首先调用 GPU 执行,并根据需要将输入数据复制到设备内存。对于不受支持的操作,系统通过在 CPU 上重建模型并在需要时将数据复制到 CPU,从而透明地将计算转移到 CPU。
如有需要,cuML 可在 CPU 上的 scikit-learn 对象和后端 GPU 上的 cuML 对象之间进行透明转换,从而实现真正的零代码更改功能。

借助 cuml.accel
,cuML 可自动转换超参数,并按照 scikit-learn 的约定对齐输出,以确保与 Python 生态系统中的其他库兼容。这可确保与基于 CPU 的工作流保持一致,同时加速受支持的算法。
在随机森林等某些情况下,为了利用 NVIDIA GPU 的巨大并行性,cuML 的实现方式与 scikit-learn 不同。
cuML 中的算法旨在在合并输出之前同时处理多行输入,管理 GPU 内存以避免昂贵的分配,并使用并行友好型算法版本。这预计会生成数值上等效的结果,但由于运算顺序不同或算法中错误的累积,这些结果并不总是相同的。
在某些情况下,机器学习数据集可能会超过 GPU 显存容量。cuml.accel 模块会自动使用 CUDA 统一内存 。借助统一内存,主机内存可以与 GPU 内存一起使用,并根据需要自动执行两者之间的数据迁移。这将可用于 ML 处理的有效内存扩展到 GPU 和主机内存的总和。
如何使用 cuML 加速 scikit-learn 代码
新版本的 NVIDIA cuML 与 scikit-learn 零代码更改,已预安装在 Google Colab 中。
在 Jupyter notebook 中,在导入其他 notebook 之前,使用 notebook 开头的以下命令:
%load_ext cuml.accel
import sklearn
要在各种本地和云环境中安装 cuML,请参阅 RAPIDS 安装指南 。使用带有 python
模块标志的 Python 脚本来加速保持不变的 scikit-learn 脚本:
python -m cuml.accel unchanged_script.py
这是一个简单的 scikit-learn 应用,可基于具有 50 万个样本和 100 个特征的数据集训练随机森林模型。
%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)
如需详细了解在 GPU 上运行的模型组件与回退所需的组件相比有哪些,请将 logger 对象添加到函数中。此代码示例将日志记录级别设置为 DEBUG
:
%load_ext cuml.accel
from cuml.common import logger;
logger.set_level(logger.level_enum.debug)
from sklearn.datasets import make_classification
…
执行时,日志记录器对象会发送捕获每个命令执行位置的消息。在之前的示例中,fit
函数在 GPU 上执行:
cuML: Installed accelerator for sklearn.
cuML: Installed accelerator for umap.
cuML: Installed accelerator for hdbscan.
cuML: Successfully initialized accelerator.
cuML: Performing fit in GPU.
基准测试
我们比较了在 Intel Xeon Platinum 8480CL CPU 上训练 scikit-learn 算法与 H100 80GB GPU 在分类和回归等代表性工作负载上的性能。我们观察到,随机森林等常见算法在训练期间可将速度提高 25 倍,从而将时间从 CPU 上的几分钟缩短到 GPU 上的几秒钟。
聚类和降维算法的计算更为复杂,通常使用更大的数据集大小。在这些情况下,GPU 可以将训练时间从使用 CPU 的几小时缩短到几分钟。有关更多结果的更多信息,请参阅 Zero Code Change Benchmarks 。

GPU 加速的加速效果受以下因素的影响:
- 算法的计算复杂性越高,GPU 加速的速度提升幅度就越大。计算更复杂的算法可能会影响数据传输和初始化的开销。
- 由于并行计算资源会同时处理更多运算,从而实现更高的速度提升,因此特征数量越多,GPU 利用率就越高。
开始使用 cuML
NVIDIA cuML 引入了一种简单的方法,使用零代码更改功能作为测试版,在 NVIDIA GPU 上加速 scikit-learn、UMAP 和 HDBSCAN 应用程序。cuML 现在可以在可能的情况下访问 NVIDIA GPU 和 CUDA 算法的强大功能,并在函数尚不支持时透明地使用 CPU 上的 scikit-learn。我们观察到,scikit-learn 的训练速度提高了 50 倍,UMAP 的训练速度提高了 60 倍,HDBSCAN 的训练速度提高了 250 倍。
有关此功能的更多信息,请参阅 NVIDIA cuML。 有关此功能的更多示例,请参阅 Google Colab notebook。最新版本的 cuML,具有零代码更改功能,已预安装在 Google Colab 中。
我们鼓励您下载最新版本并试用您的应用程序。您可以随时在 Slack 上与我们分享您的反馈,网址是#RAPIDS-GoAi。
有关自定进度课程和讲师指导式课程,请参阅 适用于数据科学的 DLI 学习路径 。