ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

NVIDIA cuML `cuml.accel` 兼容性全面解析:支持的估计器、CPU 回退条件与结果差异指南

NVIDIA cuML `cuml.accel` 兼容性全面解析:支持的估计器、CPU 回退条件与结果差异指南 NVIDIA cuMLcuml.accel兼容性全面解析支持的估计器、CPU 回退条件与结果差异指南【免费下载链接】cumlNVIDIA cuML: GPU-Accelerated Machine Learning项目地址: https://gitcode.com/GitHub_Trending/cu/cumlcuml.accel是 NVIDIA cuML 提供的零改动加速入口在不修改既有 scikit-learn / UMAP / HDBSCAN 代码的前提下把受支持的估计器透明迁移到 GPU 执行。本文以仓库中 compatibility.rst 为骨架逐模块列出受支持估计器及其触发 CPU 回退的参数、输入和版本条件并对照 estimator_proxy.py 与各 override 源码解释回退机制的原理。读完本文你将能够判断现有工作负载能否被加速、为何回退以及如何正确对比 GPU 与 CPU 的训练结果。一、先理解cuml.accel的加速模型Proxy 与回退机制在深入兼容性清单之前先建立底层模型。cuml.accel通过“代理估计器Proxy Estimator”机制工作核心实现在 estimator_proxy.py 中的ProxyBase类它同时持有两个实例self._cpu对应的 scikit-learn CPU 估计器是所有超参数的“事实来源”source of truthself._gpu对应的 cuML GPU 估计器仅在成功完成 GPU 拟合后才会被赋值。当调用fit等公开方法时代理会尝试把超参数同步到 GPU 实例见_sync_params_to_gpu若 GPU 实现不支持当前参数组合会抛出UnsupportedOnGPU异常代理随即自动回退到 CPU 执行并记录一条日志logger.info。从 core.py 可以看到cuml.accel拥有独立的日志级别体系error / warn / info / debug可单独控制回退诊断信息的输出量。各估计器的 GPU 映射关系定义在 python/cuml/cuml/accel/_overrides/sklearn/ 目录下按 sklearn 子模块组织cluster.py、covariance.py、decomposition.py、ensemble.py、kernel_ridge.py、linear_model.py、manifold.py、neighbors.py、preprocessing.py、svm.py另有 umap.py 和 hdbscan.py 处理第三方库。例如 linear_model.py 中class LinearRegression(ProxyBase): _gpu_class cuml.linear_model.LinearRegression _not_implemented_attributes frozenset((rank_, singular_))其中_not_implemented_attributes声明了 GPU 拟合后不会计算的拟合属性此处是rank_、singular_访问这些属性时代理会给出更友好的提示而非裸AttributeError。这种“双实例 按需同步 异常触发回退”的设计正是整个兼容性清单背后的实现逻辑。二、通用行为General Behaviorcuml.accel的兼容性策略由四条通用规则构成适用于所有受支持估计器。2.1 版本兼容范围加速器经过验证的依赖版本区间如下依赖库已验证版本区间区间外行为scikit-learn1.6 至 1.9.1发出运行时警告后继续执行umap-learn0.5.7 至 0.5.12发出运行时警告后继续执行hdbscan0.8.39 至 0.8.44发出运行时警告后继续执行当检测到版本超出上述区间时cuml.accel会发出运行时警告并继续运行——未验证的版本“大概率仍能工作”但未经完整验证可能存在细微的兼容性问题。需要特别注意的是部分估计器依赖 scikit-learn 实验性的 Array API 支持要求 scikit-learn 1.8 才能获得 GPU 加速。从 preprocessing.py 源码可见StandardScaler、MinMaxScaler、MaxAbsScaler、PolynomialFeatures均继承自ArrayAPIProxyBase因此在 scikit-learn 1.8 时这些估计器会整体回退到 CPU。2.2 CPU 回退CPU Fallback未列入兼容清单的估计器一律使用原始 CPU 实现已列入清单的估计器也可能因特定方法、特定超参数、特定输入类型或特定依赖版本而回退 CPU回退应当是透明的原有工作流不受破坏。每个估计器的具体回退条件见下文各模块小节如何判断“哪些操作跑在 GPU 上、哪些回退到 CPU”参见文档 logging-and-profiling。2.3 结果差异ResultsGPU 与 CPU 实现应提供可比的模型质量但不保证数值完全一致。原因包括并行浮点运算的执行顺序可能不同部分 GPU 算法专门为高度并行硬件设计cuml.accel不保证生成 scikit-learn 的全部拟合属性缺失属性通常属于检查辅助性质如n_iters_而非推理所必需。因此正确对比方式是比较模型质量指标如model.score或准确率而不是直接比较拟合系数。2.4 性能预期Performance性能取决于估计器与工作负载数据集越大通常收益越明显小输入上初始化和数据传输开销可能占主导加速收益有限甚至更慢部分 GPU 操作使用运行时编译的 kernel首次调用可能包含编译开销计时前应先“预热”warm up并对比开启/关闭cuml.accel的端到端运行时间代表性性能结果参见文档 benchmarks。2.5 错误与警告错误/警告消息可能与 scikit-learn 不同某些错误甚至包含 C 堆栈回溯。异常、失败或可测得的模型质量显著下降均属于 bug应通过 NVIDIA/cuml 的 issue 入口 反馈该链接在仓库文档 compatibility.rst 末尾声明。三、支持估计器总览模块受支持估计器sklearn.clusterKMeans、SpectralClustering、DBSCANsklearn.covarianceEmpiricalCovariance、LedoitWolfsklearn.decompositionPCA、IncrementalPCA、TruncatedSVDsklearn.ensembleRandomForestClassifier、RandomForestRegressorsklearn.kernel_ridgeKernelRidgesklearn.linear_modelLinearRegression、LogisticRegression、ElasticNet、Ridge、Lassosklearn.manifoldTSNE、SpectralEmbeddingsklearn.neighborsNearestNeighbors、KNeighborsClassifier、KNeighborsRegressor、KernelDensitysklearn.preprocessingStandardScaler、MinMaxScaler、MaxAbsScaler、PolynomialFeatures、LabelEncoder、LabelBinarizer、OneHotEncoder、TargetEncodersklearn.svmSVC、SVR、LinearSVC、LinearSVRumap-learnUMAPhdbscansklearn.cluster.HDBSCAN、hdbscan.HDBSCAN下文按模块给出每个估计器的完整回退条件与行为差异全部条目来自 compatibility.rst且多数可以在_overrides源码中找到对应检查逻辑。四、sklearn.cluster聚类cuML 与 scikit-learn 的聚类算法实现不同因此不要期待拟合属性如labels_与未启用cuml.accel时数值一致。对比结果建议使用sklearn.metrics.adjusted_rand_score或sklearn.metrics.adjusted_mutual_info_score低维数据下也可以直接目视检查聚类划分。4.1KMeans触发 CPU 回退提供了可调用callable的initX为稀疏矩阵。4.2SpectralClustering触发 CPU 回退assign_labels不是kmeansaffinity不是nearest_neighbors或precomputed。注意 scikit-learn 中affinity的默认值是rbf不被 GPU 加速X为稀疏矩阵。当前不计算以下拟合属性affinity_matrix_4.3DBSCAN触发 CPU 回退algorithm不是auto或brutemetric不在受支持列表中l2、euclidean、cosine、precomputedX为稀疏矩阵。附加说明该估计器不支持通过skl2onnx导出 ONNX。五、sklearn.covariance协方差两个受支持估计器均没有已知的估计器级cuml.accel限制EmpiricalCovarianceLedoitWolf六、sklearn.decomposition分解cuml.accel使用的sklearn.decomposition实现采用了与 scikit-learn 不同的 SVD 求解器可能导致components_与explained_variance_出现数值差异。对大多数算法差异很小但对randomized或covariance_eigh这类随机性或数值稳定性较弱的求解器差异可能更大。6.1PCA触发 CPU 回退n_components0n_componentsmle。附加说明面向randomized求解器的参数random_state、n_oversamples、power_iteration_normalizer会被忽略。6.2IncrementalPCA无已知估计器级限制。附加说明partial_fit不支持稀疏输入。这与 scikit-learn 行为一致稀疏输入请改用fit或向partial_fit提供稠密批次。6.3TruncatedSVD触发 CPU 回退X为稀疏矩阵。附加说明面向randomized求解器的参数random_state、n_oversamples、power_iteration_normalizer会被忽略。七、sklearn.ensemble集成cuML 的随机森林实现与 scikit-learn算法上存在差异因此不要期待拟合属性如estimators_数值一致。对比结果建议使用sklearn.metrics.root_mean_squared_error回归或sklearn.metrics.log_loss分类。7.1RandomForestClassifier触发 CPU 回退criterion为log_lossoob_score为可调用对象warm_startTruemonotonic_cst不是Nonemax_samples为整数min_weight_fraction_leaf不为0ccp_alpha不为0class_weight不是None向fit或score传入sample_weightX为稀疏矩阵X含缺失值以NaN表示y为多输出multi-output目标。7.2RandomForestRegressor触发 CPU 回退criterion为absolute_error或friedman_mseoob_score为可调用对象warm_startTruemonotonic_cst不是Nonemax_samples为整数min_weight_fraction_leaf不为0ccp_alpha不为0向fit或score传入sample_weightX为稀疏矩阵X含缺失值NaNy为多输出目标。八、sklearn.kernel_ridge核岭回归8.1KernelRidge触发 CPU 回退X为稀疏矩阵kernel不是字符串。结果一致性说明启用cuml.accel后KernelRidge的结果应与 scikit-learn几乎一致尤其是拟合出的dual_coef_足够接近可用np.allclose直接比较。九、sklearn.linear_model线性模型cuML 使用的线性模型求解器与 scikit-learn 不同因此不要期待拟合属性如coef_数值一致。对某些估计器如LinearRegression可能非常接近对其他估计器则可能有较大数值差异。对比结果建议使用sklearn.metrics.r2_score回归或sklearn.metrics.accuracy_score分类。9.1LinearRegression触发 CPU 回退positiveTrue。当前不计算以下拟合属性rank_singular_这与 linear_model.py 中_not_implemented_attributes frozenset((rank_, singular_))的定义一一对应。9.2LogisticRegression触发 CPU 回退warm_startTrueintercept_scaling不为1使用了已弃用的multi_class参数通过set_callbacks配置了回调。9.3ElasticNet触发 CPU 回退positiveTruewarm_startTrueprecompute不是False。当前不计算以下拟合属性dual_gap_9.4Ridge触发 CPU 回退positiveTrue或solverlbfgs。补充实现细节在 linear_model.py 的Ridge._gpu_fit中还有一层对稀疏输入 求解器的约束——cuML 的 Ridge 稀疏求解器是迭代式的为保持最大兼容性代理只允许solver为(auto, lsqr, lbfgs, sparse_cg)之一的稀疏输入走 GPU其余组合抛出UnsupportedOnGPU回退 CPU。此外该文件还处理了 scikit-learn 1.6 前后coef_形状差异的透明对齐见源码注释与SKLEARN_16分支。9.5Lasso触发 CPU 回退positiveTruewarm_startTrueprecompute不是False。当前不计算以下拟合属性dual_gap_十、sklearn.manifold流形学习10.1TSNE触发 CPU 回退n_components不是2init为数组initpca且X为稀疏矩阵metric不在受支持列表中l2、euclidean、sqeuclidean、cityblock、l1、manhattan、minkowski、chebyshev、cosine、correlation。附加说明即使设置了random_statecuml.accel使用的 TSNE 实现也不完全确定不支持通过skl2onnx导出 ONNX。结果对比TSNE 的精确数值输出可能与未启用cuml.accel时不同但预期结果质量在多数情况下大致相当。除目视比较外可比较sklearn.manifold.trustworthiness信任度得分或拟合属性kl_divergence_。10.2SpectralEmbedding触发 CPU 回退affinity不是nearest_neighbors或precomputedX为稀疏矩阵X只有一列特征。当前不计算以下拟合属性affinity_matrix_附加说明不支持通过skl2onnx导出 ONNX。十一、sklearn.neighbors近邻11.1NearestNeighbors触发 CPU 回退metric不在受支持列表中l2、euclidean、l1、cityblock、manhattan、taxicab、canberra、minkowski、lp、chebyshev、linf、jensenshannon、cosine、correlation、inner_product、sqeuclidean、haversine。附加说明algorithm参数被忽略cuML 始终使用 GPU 加速的brute实现cuML 未实现radius_neighbors因此该方法总是回退到 CPU不支持通过skl2onnx导出 ONNX。11.2KNeighborsClassifier触发 CPU 回退metric不在上述 17 个受支持度量列表中。附加说明algorithm参数被忽略始终使用 GPU 加速的brute实现。11.3KNeighborsRegressor触发 CPU 回退metric不在上述受支持度量列表中。附加说明algorithm参数被忽略始终使用 GPU 加速的brute实现。11.4KernelDensity触发 CPU 回退metric不在受支持列表中cityblock、cosine、euclidean、l1、l2、manhattan、sqeuclidean、canberra、chebyshev、minkowski、hellinger、correlation、jensenshannon、hamming、kldivergence、russellrao、nan_euclidean。附加说明algorithm、atol、rtol、breadth_first、leaf_size参数被忽略始终使用 cuML 中 GPU 加速的成对暴力pairwise brute-force实现。十二、sklearn.preprocessing预处理注意本节中的StandardScaler、MinMaxScaler、MaxAbsScaler、PolynomialFeatures均依赖 Array API 机制在 scikit-learn 1.8 时整体回退 CPU与 preprocessing.py 中这些类继承ArrayAPIProxyBase的实现一致。12.1StandardScaler触发 CPU 回退X为稀疏矩阵运行在scikit-learn1.8通过set_callbacks配置了回调。12.2MinMaxScaler触发 CPU 回退运行在scikit-learn1.8。12.3MaxAbsScaler触发 CPU 回退X为稀疏矩阵运行在scikit-learn1.8。12.4PolynomialFeatures触发 CPU 回退X为稀疏矩阵order为F运行在scikit-learn1.8。在源码中orderF的检查由_params_from_cpu显式抛出UnsupportedOnGPU(orderF is not supported)实现见 preprocessing.py。12.5LabelEncoder无已知估计器级限制。12.6LabelBinarizer无已知估计器级限制。12.7OneHotEncoder触发 CPU 回退X中任意列含bytes类型的值str值可正常工作dtype不是 float 或 bool 类型drop为if_binaryhandle_unknown为warn或infrequent_if_existmin_frequency不是Nonemax_categories不是Nonefeature_name_combiner为可调用对象。附加说明cuML 的编码器将None与NaN视为相同类别而 scikit-learn 将其视为不同类别。源码佐证_check_onehotencoder_X通过check_cudf检查输入当错误消息以X with bytes dtype开头时抛出UnsupportedOnGPU触发回退见 preprocessing.py。12.8TargetEncoder触发 CPU 回退categories不是autoy为多分类multiclass目标random_state是numpy.random.RandomState对象整数种子可以正常工作。附加说明cuML 与 scikit-learn 在fit_transform期间使用不同的交叉验证折分配策略。两者都是有效的目标编码实现但样本被分配到不同折导致训练数据的 leave-fold-out 编码不同transform方法在测试数据上结果等价因为它使用基于全部训练样本计算的全局统计量。十三、sklearn.svm支持向量机cuML 的 SVM 实现与 scikit-learn 不同不要期待拟合属性coef_或support_vectors_数值一致。对比结果建议使用sklearn.metrics.r2_score回归或sklearn.metrics.accuracy_score分类。13.1SVC触发 CPU 回退kernelprecomputed或 kernel 为可调用对象y为多分类probabilityTrue。注意probability参数在scikit-learn1.9以及cuml26.06中均已弃用。官方推荐改用sklearn.calibration.CalibratedClassifierCV包裹例如CalibratedClassifierCV(SVC(), ensembleFalse)——该方案跨 scikit-learn 版本均受支持且不需要 CPU 回退。源码佐证在 svm.py 中SVC._gpu_fit对y的类别数大于 2 时抛出UnsupportedOnGPU(Multiclassyis not supported)predict_proba/predict_log_proba通过available_if(_has_probability)门控而_has_probability会识别 scikit-learn 1.9 的deprecated哨兵值视为未请求校准。13.2SVR触发 CPU 回退kernelprecomputed或 kernel 为可调用对象。13.3LinearSVC触发 CPU 回退X为稀疏矩阵intercept_scaling不为1multi_class不是ovr。附加说明使用样本权重sample weights的结果可能与按权重复制数据不完全等价。13.4LinearSVR触发 CPU 回退X为稀疏矩阵intercept_scaling不为1。附加说明使用样本权重可能与按权重复制数据不完全等价。十四、UMAP14.1umap.UMAP触发 CPU 回退init不是random或spectralmetric不在受支持列表中l1、cityblock、taxicab、manhattan、euclidean、l2、sqeuclidean、canberra、minkowski、chebyshev、linf、cosine、correlation、hellinger、hamming、jaccardtarget_metric不在受支持列表中categorical、l2、euclideanuniqueTruedensmapTrueensure_all_finite不是True。附加说明使用种子random_state获得可复现性的代价是相对的性能损失优化阶段的并行化引入数值不精确性可能导致 CPU 与 GPU 结果之间存在差异不支持通过skl2onnx导出 ONNX已知兼容性问题UMAP 与numba0.62.0存在兼容性问题。使用cuml.accel加速 UMAP 时官方建议使用numba0.62.0以获得最佳稳定性。结果对比UMAP 的精确数值输出可能不同但预期结果质量在多数情况下大致相当。除目视比较外可比较sklearn.manifold.trustworthiness信任度得分。十五、HDBSCANcuml.accel同时支持两种 HDBSCAN 入口scikit-learn 的sklearn.cluster.HDBSCAN与第三方库hdbscan.HDBSCAN。两者共同的底层特征是cuML 使用float32 计算与并行 MST最小生成树因此 linkage 距离、概率、聚类标签乃至簇分配都可能与 CPU 实现存在数值差异且并行 MST 意味着当互达图mutual reachability graph中存在重复项时结果不确定。两者均不支持通过skl2onnx导出 ONNX。在源码层面cluster.py 中的_SklearnHDBSCAN适配类与_check_hdbscan_input实现了对metric、metric_params、store_centers、非有限值输入等的检查并通过_linkage_to_sklearn/_linkage_from_sklearn在 cuML 稠密 linkage 矩阵与 sklearn 结构化数组之间转换。15.1sklearn.cluster.HDBSCAN触发 CPU 回退metric不是l2或euclideanmetric_params非空store_centers不是None有效的 scikit-learnmin_samples值超出 2~1024 范围特别是min_samples1会回退 CPU输入为稀疏、预计算precomputed矩阵或包含非有限值。行为说明algorithm、leaf_size、n_jobs、copy参数只控制 CPU 实现细节对受支持的稠密输入不改变 GPU 执行方式公开方法dbscan_clustering在 CPU 上运行使用 GPU 拟合阶段计算出的 linkage 树不会重新拟合。附加说明max_cluster_sizeNone会被转换为 cuML 的“无限制”值并行 MST 导致互达图存在重复项时结果不确定与 15.2 相同。15.2hdbscan.HDBSCAN触发 CPU 回退metric不是l2或euclidean配置了memory位置缓存match_reference_implementationTruebranch_detection_dataTrue。当前不计算以下拟合属性exemplars_outlier_scores_relative_validity_十六、实践建议验证、诊断与反馈综合以上兼容性规则在实际项目中建议按以下流程使用cuml.accel确认版本核对 scikit-learn / umap-learn / hdbscan 是否落在已验证区间注意需要 Array API 的估计器scaler 类、PolynomialFeatures要求 scikit-learn 1.8。识别回退结合 logging-and-profiling 中的日志与性能分析工具逐操作确认 GPU/CPU 执行位置与回退原因。对比质量而非数值聚类用adjusted_rand_score/adjusted_mutual_info_score分类用accuracy_score/log_loss回归用r2_score/root_mean_squared_error流形学习用trustworthiness或kl_divergence_避免直接比较coef_、labels_、estimators_等拟合属性。评估性能数据集足够大时再测速对可能含运行时编译 kernel 的操作先预热再比较开启/关闭cuml.accel的端到端耗时参考文档 benchmarks。反馈异常异常、失败或可测得的模型质量显著下降均视为 bug通过仓库声明的 issue 入口上报。需要说明的是兼容性清单本身会随 cuML 版本演进_overrides目录下的源码python/cuml/cuml/accel/_overrides/与对应的测试套件python/cuml/cuml_accel_tests/ 下的test_estimator_proxy.py、test_accelerator.py等才是每个版本回退行为的最终依据本文以当前仓库文档与源码为准升级版本后应重新核对最新文档 compatibility.rst。【免费下载链接】cumlNVIDIA cuML: GPU-Accelerated Machine Learning项目地址: https://gitcode.com/GitHub_Trending/cu/cuml创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表