机器学习模型太慢?来看看英特尔(R) 扩展加速 ⛵
💡 作者:韩信子@ShowMeAI
📘 机器学习实战系列:https://www.showmeai.tech/tutorials/41
📘 本文地址:https://www.showmeai.tech/article-detail/295
📢 声明:版权所有,转载请联系平台与作者并注明出处
📢 收藏ShowMeAI查看更多精彩内容
我们在应用机器学习模型时,除了最终效果,也非常关注它们的性能。而机器学习模型的性能,不仅仅取决于我们的应用方式(特征多少、模型复杂度),也和硬件息息相关。
在本篇内容中,ShowMeAI 要给大家介绍到的是 Intel 针对 Scikit-Learn 机器学习工具库做的加速不定,可以非常大程度加速我们的模型训练与预测速度。
在我们的机器学习应用案例中,使用intel拓展加速的方式,仅仅花费原始建模方式1/5的时间,可以完成一样的任务达到一致的效果。
💡 Scikit-Learn (SKlearn) 机器学习工具库
Scikit-Learn (Sklearn) 是 Python 中最有用和最强大的机器学习库。 它通过 Python 中的接口为机器学习和统计建模提供了一系列有效工具,包括分类、回归、聚类和降维。
SKLearn 的快速使用方法也推荐大家查看[ShowMeAI](https://www.showmeai.tech/)的文章和速查手册:
💡 面向 Scikit-Learn 的英特尔扩展
Scikit-Learn是一个大而全的工具库,但它的性能并不总是最佳的,有时候一些 ML 算法可能需要数小时才能运行,时间成本很高。
面向 Scikit-Learn 的英特尔扩展(Intel(R) Extension for Scikit-learn)只需在大家熟悉的建模方法基础上,添加几行代码,就能显着提升性能,而且它也是开源的。
📌 scikit-learn-intelex 提速效果
通过 📘 scikit-learn-intelex 优化算法运行方式,可以获得 1-3 个数量级的效率改进,最终取决于使用到的数据集和算法。
- Intel Extension for Scikit-Learn 提供了许多 Scikit-Learn 算法(下表)的优化实现,这些算法与原始版本一致,有一样的最终结果。
- 即使大家使用到了当前拓展不支持的算法或参数,工具包也会自动退回到原始 Scikit-Learn,保证大家无缝衔接,大部分代码可以维持原来的形式,无需重写代码。
应用英特尔® Extension for Scikit-learn 可以对上述 Scikit-Learn 算法效率优化,具体的可以参考官网介绍。
💡 工具库安装&配置
Intel Extension for Scikit-Learn 支持 x86 架构上的 Linux、Windows 和 Mac 系统。 它可以使用 PyPI 或 Anaconda Cloud 下载:
📌 从 PyPI 安装
只需在命令行运行 pip 命令进行安装:
pip install scikit-learn-intelex
📌 从 Anaconda 安装
◉ Conda-Forge方式:
сonda install scikit-learn-intelex -c conda-forge
◉ 英特尔渠道:
conda install scikit-learn-intelex -c intel
◉ 默认方式:
conda install scikit-learn-intelex
📌 从容器安装
请注意,正确访问链接需要 DockerHub 帐户。
大家可以通过以下命令,将最新的英特尔® Scikit-Learn 扩展安装为 Docker 容器:
docker pull intel/intel-optimized-ml:scikit-learn
💡 英特尔® Scikit-Learn 扩展使用方法:
📌 打补丁 patch_sklearn
◉ patch
是一种保留 Scikit-Learn 库存版本以供使用的方法,大家可以在代码开头添加它( patch_sklearn()
函数调用),如下所示:
############### 在此处插入补丁##########################
from sklearnex import patch_sklearn
patch_sklearn()
##################################################################
◉ 这个补丁之后的所有import语句导入的来自sklearn
的算法,都会优先导入Scikit-Learn优化版本
# Importing sklearn optimised version of LogisticRegression
from sklearn.linear_model import LogisticRegression
# Creating an object for model and fitting it on training data set
logmodel = LogisticRegression()
logmodel.fit(X_train_sm, y_train_sm)
# Predicting the Target variable
predicted = logmodel.predict(X_test)# Classification Report
report = metrics.classification_report(y_test, predicted)
🕯️ 注意:导入顺序非常重要,请大家一定记得在导入Scikit-Learn工具库之前打补丁!
如果大家不想使用补丁,可以随时通过
sklearnex.unpatch_sklearn()
取消intel的补丁。
📌 其他替代方案
大家有很多替代方案,同样可以启用英特尔® Extension for Scikit-Learn优化:
◉ 在命令行直接使用拓展运行原始 Scikit-Learn 应用程序代码获取加速:
python -m sklearnex my_application.py
◉ 指定算法导入加速:
# 指定某个算法加速
from sklearnex import patch_sklearn
patch_sklearn("SVC")
# 指定若干个算法加速
patch_sklearn(["SVC", "PCA"])
# 撤销对于算法的加速补丁
from sklearnex import unpatch_sklearn
unpatch_sklearn("SVC")
📌 查看优化算法列表
# 可以直接查看可加速算法列表
from sklearnex import get_patch_names
get_patch_names()
>>
['pca','kmeans','dbscan', 'distances','linear','ridge','elasticnet','lasso',
'logistic','log_reg','knn_classifier','nearest_neighbors',
'knn_regressor', 'random_forest_classifier','random_forest_regressor',
'train_test_split', 'fin_check','roc_auc_score', 'tsne', 'logisticregression',
'kneighborsclassifier', 'nearestneighbors','kneighborsregressor',
'randomrorestclassifier', 'randomforestregressor','svr', 'svc', 'nusvr',
'nusvc','set_config', 'get_config','config_context']
📌 全局补丁
如果大家想使用全局补丁来优化所有 Scikit-Learn 应用程序,无需任何额外操作,只需要在命令行运行:
python sklearnex.glob patch_sklearn
💡 案例
我们用一个案例来说明一下,使用英特尔® Extension for Scikit-Learn,相比原始版本,有多大程度的提升,这里使用到的业务场景是信用卡欺诈识别场景。
数据可以在 🏆 Kaggle场景数据 下载,也可以在ShowMeAI 的百度网盘地址直接下载。
🏆 实战数据集下载(百度网盘):公众号『ShowMeAI研究中心』回复『实战』,或者点击 这里 获取本文 [8] 面向 Scikit-Learn 的英特尔加速扩展补丁 『creditcard 信用卡欺诈场景数据集』
⭐ ShowMeAI官方GitHub:https://github.com/ShowMeAI-Hub
📌 取消补丁的原始版本
因为我们的电脑上进行了配置,intel优化的算法会全局生效,为了对比原始版本的sklearn速度,我们这里使用unpatch_sklearn()
函数取消补丁,整个逻辑回归模型训练与测试花费了 35.5
秒。
################ Insert Patch here ############################
from sklearnex import unpatch_sklearn
unpatch_sklearn()
##########################################################
# 导入
from sklearn.linear_model import LogisticRegression
# 开始时间
start_time = time.time()
# 初始化模型并你和数据集
logmodel = LogisticRegression()
logmodel.fit(X_train_sm, y_train_sm)
# 测试集预估
predicted = logmodel.predict(X_test)
patched_time = time.time() - start_time
print("Time to calculate \033[1m logmodel.predict in Unpatched scikit-learn {:4.1f}\033[0m seconds".format(patched_time))
# 效果评估
report = metrics.classification_report(y_test, predicted)
print(f"Classification report for Logistic Regression with SMOTE:\n{report}\n")
运行结果截图如下所示:
📌 添加补丁的加速版本
下面是我们测试Intel优化版Logistic Regression算法, 代码使用patch_sklearn()
添加补丁,最后 执行时间 7.1
秒,可以看到,只花费了原始版本20%的时间,却取得了完全一样的效果!
💡 总结
本文介绍了英特尔针对Scikit-Learn的加速扩展,它的一些特点包括:
- 优化常见 ML 算法的性能
- 减少 ML 训练和推理时间
- 提供无缝体验(只需添加两行代码即可启用加速)
参考资料
- 🏆 实战数据集下载(百度网盘):公众号『ShowMeAI研究中心』回复『实战』,或者点击 这里 获取本文 [8] 面向 Scikit-Learn 的英特尔加速扩展补丁 『creditcard 信用卡欺诈场景数据集』
- ⭐ ShowMeAI官方GitHub:https://github.com/ShowMeAI-Hub
- 📘 SKLearn 官网:https://scikit-learn.org/stable/
- 📘 SKLearn Github:https://github.com/scikit-learn/scikit-learn
- 📘 scikit-learn-intelex:https://github.com/intel/scikit-learn-intelex
- 📘 机器学习实战 | SKLearn入门与简单应用案例:https://www.showmeai.tech/article-detail/202
- 📘 机器学习实战 | SKLearn最全应用指南:https://www.showmeai.tech/article-detail/203
- 📘 AI 垂直领域工具库速查表 | Scikit-Learn 速查表:https://www.showmeai.tech/article-detail/108