news 2026/4/13 3:24:23

Scikit-Learn 1.8引入 Array API,支持 PyTorch 与 CuPy 张量的原生 GPU 加速

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Scikit-Learn 1.8引入 Array API,支持 PyTorch 与 CuPy 张量的原生 GPU 加速

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_dispatch=True)

目前还有一个问题,就是不支持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_dispatch=True) # 加载数据并进行简单的预处理 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, shuffle=True, random_state=0) # 封装 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_categorical=True, feature_types=ft, device='cuda', n_jobs=4, random_state=0 ) # 执行交叉验证 scores = cross_val_score( model, X.values, y.values, cv=kfold, scoring=make_scorer( roc_auc_score, response_method="predict_proba" ), n_jobs=1 ) print(f"{scores.mean():.5f} ± {scores.std():.5f}")

虽然这段代码看起来还是需要一些修改,但它确实能让交叉验证循环保持在 GPU 上。

现阶段支持的组件

目前 Array API 的覆盖范围还在逐步扩大。在 1.8.0 中,以下组件已经具备了较好的支持:

  • 预处理StandardScalerPolynomialFeatures
  • 线性模型与校准RidgeCVRidgeClassifierCVCalibratedClassifierCV
  • 聚类与混合模型GaussianMixture

官方提供的一个基于 PyTorch 的 Ridge 管道示例显示,在处理线性代数密集型任务时,这种配置在 Colab 环境下能比单核 CPU 快出 10 倍左右。

ridge_pipeline_gpu = make_pipeline( feature_preprocessor, FunctionTransformer( lambda x: torch.tensor( x.to_numpy().astype(np.float32), device="cuda" ) ), CalibratedClassifierCV( RidgeClassifierCV(alphas=alphas), method="temperature" ), ) with sklearn.config_context(array_api_dispatch=True): 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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/11 14:33:49

揭秘边缘端Agent数据持久化难题:4步实现低功耗高可靠存储

第一章:边缘端Agent数据持久化的挑战与意义在物联网和边缘计算快速发展的背景下,边缘端Agent作为连接终端设备与云端服务的核心组件,承担着数据采集、本地处理与状态同步等关键任务。由于边缘设备常面临网络不稳定、资源受限和突发断电等问题…

作者头像 李华
网站建设 2026/4/7 20:26:18

从采集到洞察:工业互联网Agent数据分析的7个必知步骤

第一章:工业互联网Agent数据分析的核心价值在工业互联网体系中,Agent作为部署于边缘设备或关键节点的智能代理程序,承担着数据采集、实时处理与本地决策的重要职责。其产生的数据不仅涵盖设备运行状态、环境参数和操作日志,还包含…

作者头像 李华
网站建设 2026/4/11 23:12:27

别再盲目部署!边缘AI推理速度优化的6大实战误区与避坑指南

第一章:边缘AI推理速度优化的核心挑战在边缘计算场景中,AI模型的推理速度直接影响用户体验与系统响应能力。受限于边缘设备的算力、内存和功耗,如何在资源约束下实现高效推理成为关键难题。硬件资源受限带来的性能瓶颈 边缘设备如树莓派、Jet…

作者头像 李华
网站建设 2026/4/8 13:13:54

从零开始:Keil5下载与STM32项目实战指南

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个基于STM32的LED闪烁项目,包含以下步骤:1. 提供Keil5的官方下载链接和安装指南;2. 配置Keil5开发环境,包括安装STM32支持包&a…

作者头像 李华
网站建设 2026/4/12 19:17:28

ElementPlus在企业级后台管理系统中的最佳实践

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个电商后台管理系统,使用ElementPlus实现以下功能:1. 商品管理(CRUD操作);2. 订单处理流程;3. 数据统计…

作者头像 李华
网站建设 2026/4/11 17:04:41

下一代自动驾驶Agent感知技术趋势:2025年前必须掌握的5大核心技术

第一章:自动驾驶Agent环境感知技术演进全景自动驾驶系统的核心能力之一是环境感知,即通过多模态传感器理解周围动态与静态物体的状态。随着深度学习与边缘计算的发展,感知技术已从传统的规则驱动方法演进为以神经网络为主导的端到端模型架构。…

作者头像 李华