cuml.accel: Scikit-Learn, UMAP 和 HDBSCAN 的零代码修改加速#

从 RAPIDS 25.02.01 开始,cuML 提供了一种新的方式来加速基于 Scikit-Learn, UMAP-Learn 和 HDBSCAN 的现有代码。您无需重写代码以导入等效的 cuML 功能,只需按如下方式调用您现有未修改的 Python 脚本,cuML 将尽可能多地利用 NVIDIA GPU 加速代码,必要时回退到 CPU 执行:

python -m cuml.accel unchanged_script.py

在 Jupyter notebook 中,可以使用以下魔术命令(在其他导入之前)在 notebook 开头实现相同的功能:

%load_ext cuml.accel
import sklearn

您可以在KMeans Digits Notebook中看到一个示例,其中使用未修改的 Scikit-Learn 示例 notebook 来演示如何在 Jupyter 中使用cuml.accel

在任何 Python 环境中,如果希望在使用要加速的模块之前运行,也可以使用以下代码片段来激活cuml.accel

from cuml.accel import install
install()
import sklearn

``cuml.accel`` 目前是一个测试版功能,将随着时间不断改进。

常见问题#

1. 为什么使用 cuml.accel 而不是直接使用 cuML?#

许多软件生命周期涉及在各种硬件上运行代码。数据科学家可能没有 NVIDIA GPU 来开发管道,但您希望在生产环境中利用 NVIDIA GPU 运行该管道以节省成本和时间。cuml.accel让您能够立即在 NVIDIA GPU 上部署未经修改的 Scikit-Learn, UMAP-Learn 和 HDBSCAN 代码,而无需每次管道更新时都进行手动迁移到 cuML。此外,对于 Scikit-Learn 中已实现但 cuML 尚未加速的功能,cuml.accel将自动回退到 CPU 执行。

此外,cuml.accel提供了一种快速方法,可以在不修改一行代码的情况下评估 cuML 能为您的工作负载提供的最低加速。

2. 为什么直接使用 cuML 而不是 cuml.accel?#

在许多情况下,cuml.accel本身提供的性能提升已经足够,无需将代码迁移到 cuML。然而,cuML 的 API 提供了各种额外的参数,让您可以精细调整 GPU 执行,从而从 NVIDIA GPU 中获得最大的性能。因此,对于总是需要在有 NVIDIA GPU 的环境下运行的软件,直接使用 cuML 编写代码可能是值得的。

此外,直接使用 cuML 运行代码可以更精细地控制 GPU 内存使用。cuml.accel会为 NVIDIA GPU 上的分配自动使用统一或管理内存,以降低 CUDA OOM 错误的风险。相比之下,cuML 默认使用普通的设备内存,这可以提供更好的性能,但需要稍微注意避免耗尽 GPU 显存。如果您在使用cuml.accel时遇到意外的性能下降,可以尝试使用--disable-uvm标志禁用统一内存的使用。

3. cuml.accel加速了哪些功能?#

cuml.accel旨在为任何具有等效 cuML 实现的 Scikit-Learn 风格估计器提供零代码修改加速,包括来自 Scikit-Learn, UMAP-Learn 和 HDBSCAN 的估计器。目前,在使用cuml.accel运行时,以下估计器大部分或全部得到加速:

  • UMAP-Learn
    • umap.UMAP

  • HDBSCAN
    • hdbscan.HDBSCAN

  • Scikit-Learn
    • sklearn.cluster.KMeans

    • sklearn.cluster.DBSCAN

    • sklearn.decomposition.PCA

    • sklearn.decomposition.TruncatedSVD

    • sklearn.ensemble.RandomForestClassifier

    • sklearn.ensemble.RandomForestRegressor

    • sklearn.kernel_ridge.KernelRidge

    • sklearn.linear_model.LinearRegression

    • sklearn.linear_model.LogisticRegression

    • sklearn.linear_model.ElasticNet

    • sklearn.linear_model.Ridge

    • sklearn.linear_model.Lasso

    • sklearn.manifold.TSNE

    • sklearn.neighbors.NearestNeighbors

    • sklearn.neighbors.KNeighborsClassifier

    • sklearn.neighbors.KNeighborsRegressor

此列表将随着cuml.accel开发不断涵盖 cuML 中所有算法而继续扩展。有关已知限制,请参阅零代码修改限制

如果您特别希望某些特定模型在 cuML 中优先得到加速,请通过在 cuML GitHub 仓库中提交议题来提出请求。

4. 我使用cuml.accel获得的结果会与不使用时相同吗?#

cuml.accel旨在提供与其加速的估计器等效的结果,但输出可能存在微小的数值差异。更具体地说,结果质量的衡量标准(准确性、可信度等)应该与不使用cuml.accel获得的结果大致相同或更好,即使确切的输出有所不同。

无法获得精确数值一致性的一个基本限制是,在高度并行执行环境(例如 GPU)中,无法保证浮点运算将以与非并行环境完全相同的顺序发生。这意味着浮点算术误差可能会以不同的方式传播,从而导致不同的结果。离散化操作可能会加剧这种情况,其中值根据浮点值最终落入不同的类别。

其次,为了有效利用 GPU 的高度并行计算能力,某些算法在 GPU 上的实现方式与在 CPU 上根本不同。在这种情况下,cuml.accel将适当转换超参数,以保持与 CPU 实现的等效性。此类差异已在该估计器在零代码修改限制中对应的条目中注明。

如果您发现使用cuml.accel获得的结果质量比不使用时差的使用案例,请将其报告为错误,RAPIDS 团队将进行调查。

5. cuml.accel有多快?#

这取决于被加速的单个算法和正在处理的数据集。与 cuML 本身一样,通常在使用大型数据集时,cuml.accel带来的收益最大。请参阅零代码修改基准测试以了解一些代表性基准。

请注意,在 Python 进程中第一次调用估计器方法时,由于 cupy 内核的 JIT 编译,可能会有一些开销。为了获得准确的性能感知,在对全尺寸数据集测量运行时之前,先在一个小的数据子集上运行一次该方法。

6. 使用cuml.accel会耗尽 GPU 内存吗?#

cuml.accel将使用 CUDA 管理内存在 NVIDIA GPU 上进行分配。这意味着主机内存可以用来补充 GPU 内存,并且数据会在必要时自动迁移。但这并不意味着cuml.accel完全不会出现 OOM 错误。非常大的数据集可能会耗尽主机和设备的所有内存。此外,如果设备内存严重超额订阅,可能会导致执行缓慢。cuml.accel旨在尽量减少这两种可能性,但如果您在使用系统的主机加设备总内存足以容纳的数据时观察到 OOM 错误或执行缓慢,请报告,RAPIDS 团队将进行调查。

7. cuml.accelcudf.pandas有什么关系?#

这两个项目扮演着类似的角色。就像cuml.accel为 Scikit-Learn 及类似包提供零代码修改加速一样,cudf.pandas为 Pandas 提供零代码修改加速。

同时使用它们作为一个实验性功能是支持的。要在命令行界面中使用,可以在cuml.accel调用中添加--cudf-pandas标志:

python -m cuml.accel --cudf-pandas

对于 Jupyter notebook,使用以下方法同时启用两者:

%load_ext cudf.pandas
from cuml.experimental.accel import install
install()

cuML 的下一个版本将提供一个单独的魔术命令调用。

8. 如果我的脚本中的某些内容在 cuML 中没有实现会发生什么?#

cuml.accel对于任何在 cuML 中未实现的方法或估计器,都应该干净且透明地回退到 CPU 实现。如果未能做到这一点,请将其报告为错误,RAPIDS 团队将进行调查。

9. 我在使用cuml.accel时发现了一个错误。如何报告?#

影响cuml.accel的错误可以通过cuML 问题跟踪器报告。如果您在使用和不使用cuml.accel时输出质量存在显著差异,请将其报告为错误。这些问题将受到特别重视。同样,如果您的估计器在使用cuml.accel时运行时变慢,RAPIDS 团队将尽快进行分类和修复。请注意,使用cuml.accel时库导入时间变长,请将其排除在运行时之外。导入时间长是已知问题,将在 cuML 的后续版本中得到改进。

10. 如果我使用cuml.accel序列化模型,可以在不使用cuml.accel的情况下加载它吗?#

这是cuml.accel和 cuML 的常见使用场景,因为在有 NVIDIA GPU 的环境训练模型,然后在没有 NVIDIA GPU 的环境部署进行推理可能很有用。

目前,使用cuml.accel序列化的模型需要转换为纯粹的 Scikit-Learn(或 UMAP/HDBSCAN/…)模型。例如,使用 pickle 或 joblib 序列化模型后,例如到model_pickled.pkl,该模型可以通过以下方式转换为常规的 sklearn/umap-learn/hdbscan pickle 模型:

python -m cuml.accel --convert-to-sklearn model_pickled.pkl --format pickle --output converted_model.pkl

现在,converted_model.pkl是一个常规的 pickle/joblib 序列化模型,可以在没有 cuML 或 GPU 的计算机/环境中进行反序列化和使用。

此转换步骤将在 cuML 的未来版本中变得不必要。