目录
Scikit-learn是用于机器学习(ML)的最强大的Python库之一。它配备了许多机器学习工具,包括数学、统计和通用算法。虽然Scikit-learn速度很快,但总有改进的余地,以实现更大的优化并减少执行时间。此外,Scikit-learn本身不支持在GPU上运行。
为了解决这个问题,英特尔开发了面向Scikit-learn*的Intel®扩展。它可以提高性能,并将程序速度从10倍提高到100倍。加速是通过将Scikit-learn的库存算法替换为利用矢量指令的版本来实现的,例如Intel®高级矢量扩展指令集(AVX-512),线程和特定于硬件的内存优化。
此扩展在不依赖其他库的情况下提供更好的性能,因此无需更改代码。使用此扩展的另一个好处是,它包括对英特尔 oneAPI 概念的支持,这意味着您的代码可以轻松地在CPU和GPU等不同设备上运行。
要利用这些优化,只需运行以下命令:
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_test的Python函数。此检验函数将用于运行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