石家庄做网站比较好的公司,建设工程网站资质人员查询,网站制作怎么入门,广州市 网站建设 有限公司Scikit-Learn 1.8.0 更新引入了实验性的 Array API 支持。这意味着 CuPy 数组或 PyTorch 张量现在可以直接在 Scikit-Learn 的部分组件中直接使用了#xff0c;且计算过程能保留在 GPU 上。1.8.0 到底更新了什么#xff1f;
Scikit-Learn 开始正式支持Python Array API 标准。…Scikit-Learn 1.8.0 更新引入了实验性的 Array API 支持。这意味着 CuPy 数组或 PyTorch 张量现在可以直接在 Scikit-Learn 的部分组件中直接使用了且计算过程能保留在 GPU 上。1.8.0 到底更新了什么Scikit-Learn 开始正式支持Python Array API 标准。这是一个由 NumPy、CuPy、PyTorch、JAX 等库共同维护的接口规范。在 1.8.0 版本中可以实现直接传参受支持的评估器estimators现在可以直接接收 CuPy 数组或 PyTorch 张量。计算分派运算会被自动分派到对应的非 CPU 设备如 GPU上执行。状态保留模型拟合后的属性会与输入数据保持在同一物理设备上。虽然目前的版本依然贴着“实验性”标签且需要显式开启但它确实打破了 Scikit-Learn 过去那种“万物皆需 NumPy”的框架。交叉验证如果你平时不怎么用cross_val_score、GridSearchCV或CalibratedClassifierCV那你可能感觉不到这次更新的提速。但对大多数从事肃建模的开发者来说交叉验证一直是 GPU 的“性能杀手”。在旧版本中即便你的基础模型如 XGBoost是在 GPU 上训练的Scikit-Learn 的编排逻辑会把数组转回 NumPy然后在 CPU 上重新计算各项指标。这种频繁的内存搬运和 CPU 的操作浪费了大量的时间但是Array API 的加入让这种循环能基本闭环在 GPU 内部运行。开启方式与限制启用这项特性需要完成下面的配置。如果漏掉任何一步程序都会悄悄退回到 NumPy 模式。环境变量设置必须在导入 SciPy 或 Scikit-Learn 之前importos os.environ[SCIPY_ARRAY_API] 1配置 Scikit-Learn 内部开关fromsklearnimportset_config set_config(array_api_dispatchTrue)目前还有一个问题就是不支持cuDF DataFrames。但是你依然可以用 cuDF 做数据加载和预处理不过输入模型之前必须确保输入是 array-like 格式。也就是说类别特征必须手动编码而且且无法再依赖 pandas/cuDF 的 dtype 自动识别机制。基于 GPU 的 XGBoost 交叉验证下面是一个运行 5 折分层交叉验证的示例。为了让整个链路留在 GPU 上我们需要对XGBClassifier做一点小的封装并结合 cuML 的指标计算。import os os.environ[SCIPY_ARRAY_API] 1 import cupy as cp import cudf from sklearn.model_selection import StratifiedKFold, cross_val_score from sklearn.metrics import make_scorer from cuml.metrics import roc_auc_score from xgboost import XGBClassifier from sklearn import set_config set_config(array_api_dispatchTrue) # 加载数据并进行简单的预处理 X cudf.read_csv(/kaggle/input/playground-series-s5e12/train.csv).set_index(id) y X.pop(diagnosed_diabetes).astype(int) # 类别特征编码处理 cat_cols [c for c in X.columns if X[c].dtype object] X X.astype({c: category for c in cat_cols}) for c in cat_cols: X[c] X[c].cat.codes ft [c if c in cat_cols else q for c in X.columns] kfold StratifiedKFold(5, shuffleTrue, random_state0) # 封装 XGB 以适配 CuPy 预测 class cuXGBClassifier(XGBClassifier): property def classes_(self): return cp.asarray(super().classes_) def predict_proba(self, X): p self.get_booster().inplace_predict(X) if p.ndim 1: p cp.column_stack([1 - p, p]) return p def predict(self, X): return cp.asarray(super().predict(X)) model cuXGBClassifier( enable_categoricalTrue, feature_typesft, devicecuda, n_jobs4, random_state0 ) # 执行交叉验证 scores cross_val_score( model, X.values, y.values, cvkfold, scoringmake_scorer( roc_auc_score, response_methodpredict_proba ), n_jobs1 ) print(f{scores.mean():.5f} ± {scores.std():.5f})虽然这段代码看起来还是需要一些修改但它确实能让交叉验证循环保持在 GPU 上。现阶段支持的组件目前 Array API 的覆盖范围还在逐步扩大。在 1.8.0 中以下组件已经具备了较好的支持预处理StandardScaler、PolynomialFeatures线性模型与校准RidgeCV、RidgeClassifierCV、CalibratedClassifierCV聚类与混合模型GaussianMixture官方提供的一个基于 PyTorch 的 Ridge 管道示例显示在处理线性代数密集型任务时这种配置在 Colab 环境下能比单核 CPU 快出 10 倍左右。ridge_pipeline_gpu make_pipeline( feature_preprocessor, FunctionTransformer( lambda x: torch.tensor( x.to_numpy().astype(np.float32), devicecuda ) ), CalibratedClassifierCV( RidgeClassifierCV(alphasalphas), methodtemperature ), ) with sklearn.config_context(array_api_dispatchTrue): cv_results cross_validate( ridge_pipeline_gpu, features, target )总结Scikit-Learn 准备好完全接管 GPU 了吗显然还没有。但这个版本意义在于它正已经向GPU的支持迈出了第一步。目前这种方式虽然还有点“硬核”对普通用户不够友好但对于追求极致效率的开发者来说Scikit-Learn 1.8.0 已经要想这个方向前进了。Scikit-Learn 1.8.0 首次引入实验性 Array API 支持可直接使用 CuPy 数组或 PyTorch 张量计算全程保留在 GPU。交叉验证等操作不再强制转回 CPU大幅提升效率。需配置环境变量与set_config开启目前支持部分组件如 Ridge、GaussianMixture 等标志其迈向 GPU 加速的重要一步。作者Abish Pius