针对Scikit-learn的Intel®扩展进行基准测试:它的速度有多快?

文章介绍了英特尔为Scikit-learn开发的扩展,该扩展能显著提高机器学习算法的执行速度,最高可达100倍。通过使用矢量指令、线程和内存优化,扩展在不修改代码的情况下加速现有应用,并支持oneAPI,允许在不同硬件上运行。文章通过基准测试展示了K-Means聚类在扩展前后性能的提升,证明了扩展的有效性。
摘要由CSDN通过智能技术生成

目录

针对Scikit-learn的英特尔扩展进行基准测试

结论

引用


Scikit-learn是用于机器学习(ML)的最强大的Python库之一。它配备了许多机器学习工具,包括数学、统计和通用算法。虽然Scikit-learn速度很快,但总有改进的余地,以实现更大的优化并减少执行时间。此外,Scikit-learn本身不支持在GPU上运行。

为了解决这个问题,英特尔开发了面向Scikit-learn*的Intel®扩展。它可以提高性能,并将程序速度从10倍提高到100倍。加速是通过将Scikit-learn的库存算法替换为利用矢量指令的版本来实现的,例如Intel®高级矢量扩展指令集(AVX-512),线程和特定于硬件的内存优化。

此扩展在不依赖其他库的情况下提供更好的性能,因此无需更改代码。使用此扩展的另一个好处是,它包括对英特尔 oneAPI 概念的支持,这意味着您的代码可以轻松地在CPUGPU等不同设备上运行。

要利用这些优化,只需运行以下命令:

python -m sklearnex my_application.py

这将使您能够加速已经创建的应用程序,而无需编辑代码或修改实现。

本文将探讨和比较英特尔Scikit-learn扩展的性能,并将其与现有的Scikit-learn库进行基准比较。

针对Scikit-learn的英特尔扩展进行基准测试

确定算法质量的最佳方法是通过基准测试,我们可以通过在预定义的数据集上测试算法来执行基准测试。在本文中,我们将使用英特尔的机器学习基准测试库进行基准测试。

我们的测试将执行K-Means配件。K均值是最简单的无监督ML聚类机制之一,它以迭代方式将数据划分为称为聚类的子组。

我们将重复拟合100次,然后计算每次拟合的平均时间,首先在不使用英特尔Scikit-learn扩展的情况下执行我们的测试。然后,我们将执行修补并比较结果。

环境设置很简单。安装scikit-learn

pip install -U scikit-Learn

接下来,使用以下命令安装英特尔Scikit-learn扩展:

pip install scikit-learn-intelex

克隆基准库后,我们可以创建一个名为 my_app.py 的新Python文件。然后,在这个Python文件中,我们需要导入一些库:

import bench
import argparse
import numpy as np
from sklearn.cluster import KMeans
from tqdm import tqdm

tqdm库在命令行界面上显示进度条。如果还没有此库,请使用以下命令进行安装:

pip install tqdm

接下来,我们需要定义一个名为Kmeans_testPython函数。此检验函数将用于运行K-Means拟合100次。然后,它使用英特尔机器学习基准测试库中的measure_function_time()函数计算平均函数时序:

def Kmeans_test(X):
  X_init = 'k-means++'
  parser = argparse.ArgumentParser(description='SciKit-Learn K-means benchmark')
  params = bench.parse_args(parser)
  time = 0
  for x in tqdm(range(100)):
    fit_time, kmeans = bench.measure_function_time(fit_kmeans, X,
      X_init, params=params)
    time += fit_time
    average_time = time/100
    return average_time

measure_function_time()函数采用多个参数:要测量的函数、测量函数的参数和时间测量的参数。当我们想要测量拟合函数性能时,我们将创建一个名为fit_kmeans()的函数。此函数负责创建K-Means实例并将模型拟合到给定数据:

def fit_kmeans(X, X_init):
  alg = KMeans(n_clusters=2, random_state=0)
  alg.fit(X)
  return alg

我们的第一个简单测试将包括一个由六个元素组成的数组作为示例数据。我们将使用KMeans算法对数据进行聚类,并测量拟合K-Means模型所需的时间:

if __name__ == "__main__":
  X = np.array([[1,  3], [1,  4], [1,  0],
    [12, 2], [15, 4], [10, 3]])
  average_time = Kmeans_test(X)
  print(f"Average time ={average_time}")

首先,运行不带英特尔扩展的代码。输出将类似于以下内容:

此结果意味着此代码的平均执行时间约为34毫秒。

现在,使用以下命令运行扩展:

python -m sklearnex my_app.py

请注意,我们没有更改代码中的任何内容。我们只是使用了不同的命令来运行它。

英特尔扩展的程序输出为:

这表明,使用英特尔Scikit-learn扩展执行此代码的平均时间约为1.3毫秒,比原始执行速度快约26倍。

现在,我们将增加数据集大小并观察时间的比较情况。

为此,我们将修改代码以加载内置于Scikit-learn中的糖尿病数据集,其中包含有关442个样本的数据。

首先,使用以下命令加载数据:

from sklearn import datasets
diabetes = datasets.load_diabetes()

然后,将数据传递给该Kmeans_test方法。

if __name__ == "__main__":
	
    diabetes = datasets.load_diabetes()
    x= diabetes.data
	
    average_time = Kmeans_test(x)
    print(f"Average time ={average_time}")

在没有英特尔扩展的情况下运行时,代码的输出如下所示:

此结果意味着,没有英特尔Scikit-learn扩展的代码的平均执行时间约为63毫秒。

使用扩展执行代码将提供以下结果:

此代码的平均执行时间现在约为3.2毫秒。

这些结果表明,使用较大的数据集时,速度提高了约19倍。您可能会看到不同的加速量,具体取决于您的硬件平台和软件版本。您还可以使用此方法自行尝试机器学习基准库中的其他一些模型。

这些结果表明,英特尔Scikit-learn扩展可以提高使用Scikit-learn库编写的程序的性能,而无需修改代码。如果你想确保你的代码始终启用这个扩展,而不必在运行Python时添加-m sklearnex选项,你可以简单地添加这两行代码:

from sklearnex import patch_sklearn
patch_sklearn()

结论

在本文中,我们展示了面向Scikit-learn的英特尔扩展如何提高使用Scikit-learn Python库的应用程序的性能。英特尔通过使用优化的oneAPI版本修补Scikit-learn库的常用算法来实现这一目标。此扩展还为您的应用程序添加了GPU支持,使您能够在不重写任何代码的情况下加快应用程序速度。

我们鼓励您亲自尝试该扩展,以体验它如何在不需要重构的情况下轻松优化应用程序。您可以找到支持的算法和参数列表,如果修补不适合您的方案,则可以在GitHub提交问题

引用

https://www.codeproject.com/Articles/5344739/Benchmarking-Intel-Extension-for-Scikit-learn-How

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值