已知限制#

一般限制#

RAPIDS 25.02.01 版本中包含的 cuML 加速器是测试版本,具有以下一般限制

  • 估算器函数不支持摄取数字列表。请将列表转换为结构化格式(例如 NumPy 数组或 Pandas DataFrames)以确保兼容性。此限制将在下一版本 cuML 加速器中移除。

  • 不支持以字符串数组形式提供的标签。请在处理前将字符串标签预编码为数值或分类格式(例如,使用 scikit-learn 的 LabelEncoder)。此限制将在下一版本 cuML 加速器中移除。

  • 加速器已使用 scikit-learn 1.5.2 进行测试。不保证与其他版本的兼容性,因此请在部署前验证您的环境。在 RAPIDS 25.04 版本中,支持的版本将更新至 1.6.0,并且正在探索支持多个版本。

有关每种算法的说明,请参阅此文件中的特定章节。

算法特定限制#

umap.UMAP#

  • 算法限制
    • 在某些情况下,cuML 的 UMAP 可能无法达到参考实现的质量水平。可信度分数可用于评估局部结构在嵌入中的保留程度。即将发布的 25.04 和 25.06 版本将显著改进 cuML UMAP 的性能和数值精度。

    • 不支持以下参数:“low_memory”、“angular_rp_forest”、“transform_seed”、“tqdm_kwds”、“unique”、“densmap”、“dens_lambda”、“dens_frac”、“dens_var_shift”、“output_dens”、“disconnection_distance”。

    • 优化阶段的并行性意味着数值不精确,这通常会导致 CPU 和 GPU 之间的结果差异。

    • 使用种子(“random_state”参数)实现可复现性会相对牺牲性能。

  • 距离度量
    • 仅支持以下度量:“l1”、“cityblock”、“taxicab”、“manhattan”、“euclidean”、“l2”、“sqeuclidean”、“canberra”、“minkowski”、“chebyshev”、“linf”、“cosine”、“correlation”、“hellinger”、“hamming”、“jaccard”。

    • 其他度量将触发 CPU 回退,即:“sokalsneath”、“rogerstanimoto”、“sokalmichener”、“yule”、“ll_dirichlet”、“russellrao”、“kulsinski”、“dice”、“wminkowski”、“mahalanobis”、“haversine”。

  • 嵌入初始化方法
    • 仅支持以下初始化方法:“spectral”和“random”。

    • 其他初始化方法将触发 CPU 回退,即:“pca”、“tswspectral”。

虽然 UMAP 的精确数值输出可能与未使用 cuml.accel 时获得的输出不同,但我们期望输出是等效的,这意味着在大多数情况下,结果质量将与未使用 cuml.accel 时获得的结果质量大致相同或更好。UMAP 结果质量的一个常用衡量标准是可信度分数。您可以通过以下方式获得可信度

from umap import UMAP as refUMAP  #  with cuml.accel off
from cuml.manifold import UMAP
from cuml.metrics import trustworthiness

n_neighbors = 15

ref_model = refUMAP(n_neighbors=n_neighbors)
ref_embeddings = ref_model.fit_transform(X)

model = UMAP(n_neighbors=n_neighbors)
embeddings = model.fit_transform(X)

ref_score = trustworthiness(X, ref_embeddings, n_neighbors=n_neighbors)
score = trustworthiness(X, embeddings, n_neighbors=n_neighbors)

tol = 0.1
assert score >= (ref_score - tol)

hdbscan.HDBSCAN#

  • 算法限制
    • GPU HDBSCAN 使用并行 MST 实现,这意味着当互可达图中存在重复项时,结果不确定。

    • CPU HDBSCAN 提供多种不同的算法选择,而 GPU HDBSCAN 使用单一实现。除了 algorithm="auto" 之外的所有选项都将回退到 CPU。

    • GPU HDBSCAN 支持 CPU hdbscan.prediction 模块中的所有函数,但 approximate_predict_score 除外。

    • CPU HDBSCAN 提供一个 hdbscan.branches 模块,而 GPU HDBCAN 不提供。

  • 距离度量
    • 仅欧几里得距离支持 GPU 加速。

    • GPU 不支持预计算距离矩阵。

    • GPU 不支持自定义度量函数(可调用度量)。

  • 学习属性限制
    • GPU HDBSCAN 不学习属性 branch_detection_data_examplers_relative_validity_

sklearn.cluster.KMeans#

cuml.accel 使用的默认初始化算法类似但不同。cuml.accel 使用“scalable-k-means++”算法,更多详细信息请参阅 cuml.KMeans

这意味着 cluster_centers_ 属性将与 scikit-learn 实现的不完全相同。每个簇的 ID(labels_ 属性)可能会改变,这意味着在 scikit-learn 中标记为簇零的样本可能在 cuml.accel 中标记为簇一。如果使用不同的簇中心,inertia_ 属性也可能不同。算法可能在不同的迭代次数下收敛,这意味着 n_iter_ 属性可能不同。

要检查训练后的估算器是否与 scikit-learn 估算器等效,您可以评估在未用于训练估算器的样本上进行聚类结果的相似性。adjusted_rand_scoreadjusted_mutual_info_score 都给出一个单一分数,该分数应高于 0.9。对于低维数据,您还可以可视化检查所得的簇分配。

cuml.accel 不会回退到 scikit-learn。

sklearn.cluster.DBSCAN#

cuml.accel 使用的 DBSCAN 实现采用暴力算法进行 epsilon 邻域搜索。默认情况下,scikit-learn 根据数据形状和使用的度量来确定要使用的算法。所有算法都是精确的,这意味着选择是一个计算效率问题。

要检查训练后的估算器是否与 scikit-learn 估算器等效,您可以评估在未用于训练估算器的样本上进行聚类结果的相似性。adjusted_rand_scoreadjusted_mutual_info_score 都给出一个单一分数,该分数应高于 0.9。对于低维数据,您还可以可视化检查所得的簇分配。

cuml.accel 对于以下参数将回退到 scikit-learn

  • “manhattan”、“chebyshev”和“minkowski”度量。

  • “ball_tree”和“kd_tree”算法。

sklearn.decomposition.PCA#

cuml.accel 使用的 PCA 实现采用与 Scikit-Learn 中不同的 SVD 求解器,这可能导致 components_explained_variance_ 值存在数值差异。对于 svd_solver 值为“auto”、“full”或“arpack”时,这些差异应该很小,但对于“randomized”或“covariance_eigh”等随机或数值稳定性较差的求解器,差异可能更大。

同样,请注意 cuml.accel 中的当前实现可能导致 components_ 中的某些向量符号反转。此结果并非不正确,但在不先对符号进行归一化的情况下,这会使得直接进行数值比较更加困难。处理此问题的一种常见方法是将每个向量中的第一个非零值归一化为正。您可能会发现以下 numpy 函数对此很有用。

import numpy as np

def normalize(components):
    """Normalize the sign of components for easier numeric comparison"""
    nonzero = components != 0
    inds = np.where(nonzero.any(axis=1), nonzero.argmax(axis=1), 0)[:, None]
    first_nonzero = np.take_along_axis(components, inds, 1)
    return np.sign(first_nonzero) * components

有关更多算法详细信息,请参阅 cuml.PCA

  • 算法限制
    • n_components="mle" 将回退到 Scikit-Learn。

    • “randomized”求解器的参数,如 random_staten_oversamplespower_iteration_normalizer 将被忽略。

sklearn.decomposition.TruncatedSVD#

cuml.accel 使用的 TruncatedSVD 实现采用与 Scikit-Learn 中不同的 SVD 求解器,这可能导致 components_explained_variance_ 值存在数值差异。对于 algorithm="arpack",这些差异应该很小,但对于 algorithm="randomized",差异可能更大。

同样,请注意 cuml.accel 中的当前实现可能导致 components_ 中的某些向量符号反转。此结果并非不正确,但在不先对符号进行归一化的情况下,这会使得直接进行数值比较更加困难。处理此问题的一种常见方法是将每个向量中的第一个非零值归一化为正。您可能会发现以下 numpy 函数对此很有用。

import numpy as np

def normalize(components):
    """Normalize the sign of components for easier numeric comparison"""
    nonzero = components != 0
    inds = np.where(nonzero.any(axis=1), nonzero.argmax(axis=1), 0)[:, None]
    first_nonzero = np.take_along_axis(components, inds, 1)
    return np.sign(first_nonzero) * components

有关更多算法详细信息,请参阅 cuml.TruncatedSVD

  • 算法限制
    • “randomized”求解器的参数,如 random_staten_oversamplespower_iteration_normalizer 将被忽略。

sklearn.ensemble.RandomForestClassifier / sklearn.ensemble.RandomForestRegressor#

cuml.accel 中的随机森林使用不同的算法来查找树节点分割点。在选择分割阈值时,cuml.accel 随机森林仅将分位数作为阈值候选,而 scikit-learn 随机森林考虑训练数据中的所有可能的特征值。因此,cuml.accel 随机森林可能选择与 scikit-learn 对应的不同的分割阈值,导致树结构不同。尽管如此,我们期望输出是等效的,这意味着结果质量将与未使用 cuml.accel 时获得的结果质量大致相同或更好。随机森林常用的质量衡量标准包括 RMSE(回归的均方根误差)和 Log Loss(分类的对数损失)。您可以使用 sklearn.metrics 模块中的函数来获得这些衡量标准。

某些参数支持有限:* max_samples 必须是浮点数,而不是整数。

以下参数不支持,并将触发 CPU 回退:* min_weight_fraction_leaf * monotonic_cst * ccp_alpha * class_weight * warm_start * oob_score

以下 criterion 值将触发 CPU 回退:* log_loss * friedman_mse

sklearn.linear_model.LinearRegression#

线性回归是较简单的估算器之一,cuML.accel 与 Scikit-learn 之间的功能和结果会非常接近,但有以下限制

  • 目前不支持多输出目标。

  • 目前不支持 positive 参数强制系数为正,如果该参数设置为 True,cuml.accel 将不会加速线性回归。

  • cuML 的线性回归目前只实现了密集输入,因此 cuml.accel 不提供

    模型训练的稀疏输入加速。

另一个重要考虑因素是,与流形或聚类算法等更复杂的模型不同,线性模型运行起来非常高效和快速。即使在较大的数据集上,执行时间也通常以秒为单位衡量,因此在评估结果时考虑到这一点很重要,例如在零代码修改基准测试中看到的结果。

sklearn.linear_model.LogisticRegression#

cuML 逻辑回归与 Scikit-learn 的主要区别在于用于训练模型的求解器。cuML 使用一组拟牛顿求解器(L-BFGS 或 OWL-QN),它们本身与 sklearn 的求解器存在算法差异。即便如此,不同实现之间的结果应该是可比较的。

  • 无论原始逻辑回归模型使用哪种 solver,cuml.accel 都将使用上述描述的 qn

sklearn.linear_model.ElasticNet#

与线性回归类似,Elastic Net 有以下限制

  • 目前不支持 positive 参数强制系数为正,如果该参数设置为 True,cuml.accel 将不会加速 Elastic Net。

  • GPU 加速不支持 warm_start 参数。

  • 不支持 precompute 参数。

  • cuML 的 ElasticNet 目前只实现了密集输入,因此 cuml.accel 不提供

    模型训练的稀疏输入加速。

sklearn.linear_model.Ridge#

与线性回归类似,Elastic Net 有以下限制

  • 目前不支持 positive 参数强制系数为正,如果该参数设置为 True,cuml.accel 将不会加速 Elastic Net。

  • solver 所有求解器参数值都转换为 eig,以使用协方差矩阵的特征分解。

  • cuML 的 Ridge 目前只实现了密集输入,因此 cuml.accel 不提供模型训练的稀疏输入加速。

sklearn.linear_model.Lasso#

  • 不支持 precompute 参数。

  • cuML 的 Lasso 目前只实现了密集输入,因此 cuml.accel 不提供

    模型训练的稀疏输入加速。

sklearn.manifold.TSNE#

  • 算法限制
    • 参数“learning_rate”不能使用值“auto”,将默认为 200.0。

  • 距离度量
    • 仅支持以下度量:“l1”、“cityblock”、“manhattan”、“euclidean”、“l2”、“sqeuclidean”、“minkowski”、“chebyshev”、“cosine”、“correlation”。

    • 不支持“precomputed”选项或使用函数作为度量

虽然 TSNE 的精确数值输出可能与未使用 cuml.accel 时获得的输出不同,但我们期望输出是等效的,这意味着在大多数情况下,结果质量将与未使用 cuml.accel 时获得的结果质量大致相同或更好。TSNE 结果质量的常用衡量标准是 KL 散度和可信度分数。您可以通过以下方式获得它

from sklearn.manifold import TSNE as refTSNE  #  with cuml.accel off
from cuml.manifold import TSNE
from cuml.metrics import trustworthiness

n_neighbors = 90

ref_model = refTSNE() #  with perplexity == 30.0
ref_embeddings = ref_model.fit_transform(X)

model = TSNE(n_neighbors=n_neighbors)
embeddings = model.fit_transform(X)

ref_score = trustworthiness(X, ref_embeddings, n_neighbors=n_neighbors)
score = trustworthiness(X, embeddings, n_neighbors=n_neighbors)

tol = 0.1
assert score >= (ref_score - tol)
assert model.kl_divergence_ <= ref_model.kl_divergence_ + tol

sklearn.neighbors.NearestNeighbors#

  • 算法限制
    • “kd_tree”和“ball_tree”算法未在 CUDA 中实现。指定这些算法时,实现将自动回退到使用“brute force”算法。

  • 距离度量
    • 只有 Minkowski 族度量(欧几里得、曼哈顿、明可夫斯基)和余弦相似度支持 GPU 加速

    • 并非所有算法都支持所有度量。

    • GPU 不支持“mahalanobis”度量,并将触发回退到 CPU 实现。

    • GPU 不支持用于处理缺失值的“nan_euclidean”度量。

    • GPU 不支持自定义度量函数(可调用度量)。

  • 其他限制
    • 仅支持“uniform”加权策略。其他加权方案将导致回退到 CPU

    • 未实现基于半径的邻居搜索的“radius”参数,并将被忽略

sklearn.neighbors.KNeighborsClassifier#

  • 算法限制
    • “kd_tree”和“ball_tree”算法未在 CUDA 中实现。指定这些算法时,实现将自动回退到使用“brute force”算法。

  • 距离度量
    • 只有 Minkowski 族度量(欧几里得、曼哈顿、明可夫斯基)和余弦相似度支持 GPU 加速

    • 并非所有算法都支持所有度量。

    • GPU 不支持“mahalanobis”度量,并将触发回退到 CPU 实现。

    • GPU 不支持用于处理缺失值的“nan_euclidean”度量。

    • GPU 不支持自定义度量函数(可调用度量)。

  • 其他限制
    • 仅支持“uniform”加权策略进行投票计数。

    • 基于距离的权重(“distance”选项)将触发 CPU 回退。

    • GPU 不支持自定义权重函数。

sklearn.neighbors.KNeighborsRegressor#

  • 算法限制
    • “kd_tree”和“ball_tree”算法未在 CUDA 中实现。指定这些算法时,实现将自动回退到使用“brute force”算法。

  • 距离度量
    • 只有 Minkowski 族度量(欧几里得、曼哈顿、明可夫斯基)和余弦相似度支持 GPU 加速

    • 并非所有算法都支持所有度量。

    • GPU 不支持“mahalanobis”度量,并将触发回退到 CPU 实现。

    • GPU 不支持用于处理缺失值的“nan_euclidean”度量。

    • GPU 不支持自定义度量函数(可调用度量)。

  • 回归特定限制
    • 仅支持“uniform”加权策略进行预测平均。

    • 基于距离的预测权重(“distance”选项)将触发 CPU 回退。

    • GPU 不支持自定义权重函数。