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.accel
与cudf.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 的未来版本中变得不必要。