• sklearnex 让你的 sklearn 机器学习模型训练快得飞起?



    一、引言

    scikit-learn 作为经典的机器学习框架,从诞生至今已发展了十余年,其简洁易用的 API 深受用户的喜欢(fit()、predict()、transform() 等),其他机器学习框架或多或少都会借鉴。但其运算速度一直广受用户的诟病。熟悉 scikit-learn 的朋友应该清楚,scikit-learn 中自带的一些基于 joblib 等库的运算加速功能效果有限,并不能很充分地利用算力。

    今天给大家分享一个技巧,可以帮助我们在不改变原有代码的基础上,获得数十倍甚至上千倍的 scikit-learn 运算效率提升。


    二、利用 sklearnex 加速 scikit-learn

    为了达到加速运算的效果,只需要额外装上 sklearnex 这个库,就可以帮助我们在拥有 Intel 处理器的设备上,获得大幅度的运算效率提升。

    这种较新的库,最好创建一个干净的 conda 虚拟环境做实验(免得某些依赖库版本跟 Base 环境里冲突,多一些不必要麻烦)全部命令如下,我们顺便安装jupyterlab作为IDE:

    conda create -n sklearnex python=3.8
    conda activate sklearnex
    
    conda install jupyter
    conda install nb_conda
    pip install scikit-learn scikit-learn-intelex -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    完成实验环境的准备后,在 jupyter notebook 中编写测试用代码来看看加速效果如何,使用方式很简单,只需要在代码中导入scikit-learn相关功能模块之前,运行下列代码即可:

    from sklearnex import patch_sklearn, unpatch_sklearn
    patch_sklearn()
    
    • 1
    • 2

    成功开启加速模式后会打印以下信息:

    其他要做的仅仅是将你原本的 scikit-learn 代码在后面继续执行即可,我在自己平时学习和写代码的老款华硕笔记本上简单测试了一下。

    以 K-Means 聚类为例,在十万级别样本量的示例数据集上,开启加速后仅耗时 46.84 秒就完成对训练集的训练,而使用 unpatch_sklearn() 强制关闭加速模式后(注意 scikit-learn 相关模块需要重新导入),训练耗时随即上升到 100.52 秒,意味着通过 sklearnex 我们获得了 2 多倍的运算速度提升。

    结果如下:

    而按照官方的说法,越强劲的 CPU 可以获得的性能提升比例也会更高(就我本地跑 exampls 来看,老的 Intel CPU 加速不够劲儿),下图是官方在 Intel Xeon Platinum 8275CL 处理器下测试了一系列算法后得出的性能提升结果,不仅可以提升训练速度,还可以提升模型推理预测速度,在某些场景下甚至达到数千倍的性能提升:

    a00495e80823141d2f80add0961817ca.png

    官方也提供了一些 ipynb 示例:https://github.com/intel/scikit-learn-intelex/tree/master/examples/notebooks

    展示了包含K-meansDBSCAN随机森林逻辑回归岭回归等多种常用模型的加速,感兴趣的读者朋友们可以自行去查阅学习。

    此外,还可加速 sklearn 在 GPU 上的表现,使用方法类似:

    import numpy as np
    import dpctl
    from sklearnex import patch_sklearn, config_context
    patch_sklearn()
    
    from sklearn.cluster import DBSCAN
    
    X = np.array([[1., 2.], [2., 2.], [2., 3.],
                [8., 7.], [8., 8.], [25., 80.]], dtype=np.float32)
    with config_context(target_offload="gpu:0"):
        clustering = DBSCAN(eps=3, min_samples=2).fit(X)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    参考了:

  • 相关阅读:
    【Python机器学习】零基础掌握gaussian_process高斯过程中的核函数
    老张的思考
    获取热门电影算法
    基于PHP MYSQL的化妆品店会员管理网站的设计与实现毕业设计源码131102
    Mybatis-Flex框架初体验
    arm代码
    golang学习笔记系列之复杂数据类型
    【软件逆向-基础知识】分析方法、汇编指令体系结构
    ”linux学习之路” (感觉写的很好,更像是网络编程学习路线图)
    mapstruct进阶属性
  • 原文地址:https://blog.csdn.net/fyfugoyfa/article/details/125417641