GPU加速的机器学习:cuML与Scikit-learn的性能比较

无论是机器学习领域的资深专家还是刚刚踏入这个激动人心领域的新手,一定听说过Python的流行机器学习模型构建库——Scikit-learn。Scikit-learn,或简称sklearn,是Python最强大的库之一,提供了包括分类器、回归器、聚类模型和降维模块在内的一系列高效的机器学习和统计建模工具。

为了训练这些机器学习模型,需要用到训练数据。知道,数据每毫秒都在大量产生——这为这些ML模型提供了巨大的训练机会,使其能够以惊人的准确度进行训练。尽管sklearn拥有多样化的模型构建工具和能力,但在处理大量数据时,它往往会耗费大量时间——导致ML/DL工作流程的延迟,使整个过程变得繁琐。Scikit-Learn的速度限制在于它仅在拥有8个核心的CPU上运行。然而,通过GPU加速,可以利用并行计算的优势和更多的核心数量来加速ML模型的速度,达到令人印象深刻的规模。这可以通过NVIDIA的RAPIDS库实现。

在本文中,将了解cuML的基本语法、其用途,并最终将其时间消耗与sklearn进行比较。

cuML(CUDA ML)是NVIDIA的开源GPU加速机器学习算法套件,专为数据科学、机器学习和分析任务而设计。cuML的最大优点是其语法的开发确保了平缓的学习曲线。所以,好消息是——如果知道sklearn的语法,已经掌握了cuML!

cuML提供了类似sklearn的API——使得数据科学家、机器学习工程师和分析人员从Scikit Learn转向cuML变得相当简单;因此,所有内置的Scikit Learn函数在cuML中都有相同的名字和语法。

现在,如果想在GPU上使用cuML运行机器学习模型,需要有NVIDIA特定的GPU(查看先决条件)。如果没有合适的GPU——不用担心,仍然可以在Google Colaboratory或Kaggle Notebooks上使用NVIDIA的加速库。对于Google Colab,安装步骤相当繁琐;此外,RAPIDS仅支持Google Colab中的P4、P100、T4或V100 GPU——因此,如果没有被分配到这些GPU之一,将不得不重新启动笔记本运行时并再次尝试。然而,在Kaggle上使用RAPIDS库要容易得多;这就是将要深入探讨的内容。

要在Kaggle笔记本上运行GPU,只需按照以下步骤操作:

步骤1:访问www.kaggle.com(如果是新用户,需要注册)并点击左侧导航栏上的“创建”按钮。这将创建一个新的笔记本。

步骤2:点击右上角的三个点符号,一个下拉菜单将出现在屏幕上。

步骤3:将光标悬停在“加速器”选项上,另一个下拉菜单将显示出来。点击GPU。

步骤4:最后,一个对话框将弹出。Kaggle每周提供30小时的GPU访问权限。点击“打开GPU”。

现在,Kaggle笔记本得到了GPU的支持,可以在它上面使用cuML和所有其他RAPIDS库。

让比较一下sklearn和cuML的计算时间。正如已经提到的,cuML镜像了sklearn的语法——这意味着不需要从头开始学习cuML的语法;所有内置的sklearn模块和函数在cuML中都固有地可用。

现在,将首先使用sklearn训练一个K-最近邻模型,然后使用cuML,计算每种情况下的处理时间,并将两者进行比较。

# 使用sklearn训练KNN模型 # 导入必要的模块 import time from sklearn.neighbors import KNeighborsClassifier import pandas as pd #cudf是NVIDIA的GPU加速Pandas类库 start = time.time() # 加载训练数据 Data_train = pd.read_csv('../input/mnist-digit-recognition-using-knn/train_sample.csv') # 创建训练数据的特征和目标数组 X_train = Data_train.iloc[:,:-1] Y_train = Data_train.iloc[:,-1] # 加载测试数据 Data_test = pd.read_csv('../input/mnist-digit-recognition-using-knn/test_sample.csv') # 创建测试数据的特征和目标数组 X_test = Data_test.iloc[:,:-1] Y_test = Data_test.iloc[:,-1] knn = KNeighborsClassifier(n_neighbors=7) knn.fit(X_train, Y_train) # 在模型未见过的数据集上进行预测 Y = knn.predict(X_test) end = time.time() CPU_time = end-start print("在CPU上花费的时间 = ",CPU_time) 输出: 在CPU上花费的时间 = 8.159586906433105 # 使用cuML训练KNN模型 # 导入必要的模块 import time from cuml.neighbors import KNeighborsClassifier import cudf #cudf是NVIDIA的GPU加速Pandas类库 start = time.time() # 加载训练数据 Data_train = cudf.read_csv('../input/mnist-digit-recognition-using-knn/train_sample.csv') # 创建训练数据的特征和目标数组 X_train = Data_train.iloc[:,:-1] Y_train = Data_train.iloc[:,-1] # 加载测试数据 Data_test = cudf.read_csv('../input/mnist-digit-recognition-using-knn/test_sample.csv') # 创建测试数据的特征和目标数组 X_test = Data_test.iloc[:,:-1] Y_test = Data_test.iloc[:,-1] knn = KNeighborsClassifier(n_neighbors=7) knn.fit(X_train, Y_train) # 在模型未见过的数据集上进行预测 Y = knn.predict(X_test) end = time.time() GPU_time = end-start print("在GPU上花费的时间 = ",GPU_time) 输出: 在GPU上花费的时间 = 0.7302286624908447

比较sklearn和cuML的处理时间

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485