基准测试 Intel® Extension for Scikit-learn:速度提升了多少?
本文将探讨和比较 Intel Extension for Scikit-learn 的性能,并将其与标准 Scikit-learn 库进行基准测试。
Scikit-learn 是最强大的 Python 机器学习 (ML) 库之一。它配备了许多机器学习工具,包括数学、统计和通用算法。虽然 Scikit-learn 速度很快,但总有改进的空间,以实现更大的优化并减少执行时间。此外,Scikit-learn 本身不支持在 GPU 上运行。
为了解决这个问题,Intel 开发了 Intel® Extension for Scikit-learn*。它可以提高性能,并将您的程序速度提高 10 到 100 倍。这种加速是通过用利用矢量指令(如 Intel® Advanced Vector Extensions (AVX-512))、多线程和硬件特定内存优化的版本替换 Scikit-learn 的标准算法来实现的。
此扩展可在不依赖不同库的情况下提供更好的性能,因此您无需更改代码。使用此扩展的另一个好处是它包含了对 Intel 的 oneAPI 概念的支持,这意味着您的代码可以轻松地在 CPU 和 GPU 等不同设备上运行。
要利用这些优化,只需运行以下命令:
python -m sklearnex my_application.py
这将使您能够在不编辑代码或修改实现的情况下加速已有的应用程序。
本文将探讨和比较 Intel Extension for Scikit-learn 的性能,并将其与标准 Scikit-learn 库进行基准测试。
基准测试 Intel Extension for Scikit-learn
确定算法质量的最佳方法是通过基准测试,我们可以通过在预定义的数据集上测试算法来执行此操作。在本文中,我们将使用 Intel 的 Machine Learning Benchmarks library 进行基准测试。
我们的测试将执行 K-Means 拟合。K-Means 是一种最简单的无监督 ML 聚类机制,它迭代地将数据划分为称为簇的子组。
我们将重复拟合 100 次,然后计算每次拟合的平均时间,首先在未使用 Intel Extension for Scikit-learn 的情况下执行我们的测试。然后,我们将执行补丁并比较结果。
环境设置很简单。安装 scikit-learn。
pip install -U scikit-Learn
接下来,使用以下命令安装 Intel Extension for Scikit-learn:
pip install scikit-learn-intelex
克隆 benchmark library 后,我们可以创建一个名为 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 次。然后,它使用 Intel 的 Machine Learning Benchmarks 库中的 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 函数的性能,我们将创建一个名为 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}")
首先,在没有 Intel 扩展的情况下运行代码。输出将类似于:
此结果意味着此代码的平均执行时间约为 34 毫秒。
现在,使用以下命令运行扩展:
python -m sklearnex my_app.py
请注意,我们没有更改代码中的任何内容。我们只是使用了不同的命令来运行它。
使用 Intel 扩展的程序输出为:
这表明使用 Intel Extension for Scikit-learn 执行此代码的平均时间约为 1.3 毫秒,比原始执行速度快约 26 倍。
现在,我们将增加数据集大小并观察时间的比较。
为此,我们将修改代码以加载 Scikit-learn 中内置的 diabetes 数据集,该数据集包含约 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}")
在没有 Intel 扩展的情况下运行时,代码的输出如下:
此结果意味着未使用 Intel Extension for Scikit-learn 扩展的代码的平均执行时间约为 63 毫秒。
使用扩展执行代码会产生以下结果:
现在,此代码的平均执行时间约为 3.2 毫秒。
这些结果表明在使用更大的数据集时,速度提高了约 19 倍。您可能会看到不同的加速量,具体取决于您的硬件平台和软件版本。您还可以尝试使用此方法自行测试 Machine Learning Benchmarks library 中的其他模型。
这些结果表明,Intel Extension for Scikit-learn 可以在不修改代码的情况下提高使用 Scikit-learn 库编写的程序的性能。如果您想确保此扩展始终为您的代码启用,而无需在运行 Python 时添加 -m sklearnex 选项,您可以简单地添加这两行代码:
from sklearnex import patch_sklearn
patch_sklearn()
结论
在本文中,我们展示了 Intel Extension for Scikit-learn 如何提高使用 Scikit-learn Python 库的应用程序的性能。Intel 通过用优化的 oneAPI 版本补丁 Scikit-learn 库的标准算法来实现这一点。此扩展(还为您的应用程序添加了 GPU 支持)使您无需重写任何代码即可加快应用程序的速度。
我们鼓励您亲自尝试该扩展,体验它如何轻松优化您的应用程序而无需重构。您可以在 GitHub 上找到 支持的算法和参数 列表,如果补丁不适用于您的情况,您也可以 提交 issue。