作者|Khuyen Tran
编译|VK
起源|Towards Data Science

动机

Sklearn是一个很好的库,有各种机器学习模型,能够用来训练数据。然而如果你的数据很大,你可能须要很长时间来训练你的数据,特地是当你用不同的超参数来寻找最佳模型时。

有没有一种办法能够使机器学习模型的训练速度比应用Sklearn的速度快150倍?答案就是你能够应用cuML。

上面的图表比拟了应用Sklearn的RandomForestClassifier和cuML的RandomForestClassifier训练同一模型所需的工夫。

cuML是一套疾速的,GPU减速的机器学习算法,设计用于数据迷信和剖析工作。它的API相似于Sklearn的,这意味着你能够应用训练Sklearn模型的代码来训练cuML的模型。

from cuml.ensemble import RandomForestClassifierclf = KNeighborsClassifier(n_neighbors=10)clf.fit(X, y)

在本文中,我将比拟应用不同模型的这两个库的性能。我还将演示如何减少显卡,使得速度进步10倍。

装置cuML

要装置cuML,请依照Rapids页面上的阐明进行装置。请确保在装置库之前查看先决条件。你能够装置所有软件包,也能够只装置cuML。如果你的计算机空间无限,我倡议装置cuDF和cuML。

尽管在很多状况下,不须要装置cuDF来应用cuML,然而cuDF是cuML的一个很好的补充,因为它是一个GPU数据帧。

确保抉择适宜你计算机的选项。

创立数据

因为当有大量数据时,cuML通常比Sklearn更好,因而咱们将应用sklearn.datasets.

从sklearn导入数据集

from sklearn import datasetsX, y  = datasets.make_classification(n_samples=40000)

将数据类型转换为np.float32因为有些cuML模型要求输出是np.float32.

X = X.astype(np.float32)y = y.astype(np.float32)

反对向量机

咱们将创立用于训练模型的函数。应用此函数将使咱们更容易比拟不同的模型。

def train_data(model, X=X, y=y):    clf = model    clf.fit(X, y)

咱们应用iPython的magic命令%timeit运行每个函数7次,取所有试验的平均值。

from sklearn.svm import SVC from cuml.svm import SVC as SVC_gpuclf_svc = SVC(kernel='poly', degree=2, gamma='auto', C=1)sklearn_time_svc = %timeit -o train_data(clf_svc)clf_svc = SVC_gpu(kernel='poly', degree=2, gamma='auto', C=1)cuml_time_svc = %timeit -o train_data(clf_svc)print(f"""Average time of sklearn's {clf_svc.__class__.__name__}""", sklearn_time_svc.average, 's')print(f"""Average time of cuml's {clf_svc.__class__.__name__}""", cuml_time_svc.average, 's')print('Ratio between sklearn and cuml is', sklearn_time_svc.average/cuml_time_svc.average)
Average time of sklearn's SVC 48.56009825014287 sAverage time of cuml's SVC 19.611496431714304 sRatio between sklearn and cuml is 2.476103668030909

cuML的SVC比sklearn的SVC快2.5倍!

让咱们通过图片来可视化它。咱们创立一个函数来绘制模型的速度。

!pip install cutechartsimport cutecharts.charts as ctc def plot(sklearn_time, cuml_time):    chart = ctc.Bar('Sklearn vs cuml')    chart.set_options(        labels=['sklearn', 'cuml'],        x_label='library',        y_label='time (s)',        )    chart.add_series('time', data=[round(sklearn_time.average,2), round(cuml_time.average,2)])    return chart
plot(sklearn_time_svc, cuml_time_svc).render_notebook()

更好的显卡

因为cuML的模型在运行大数据时比Sklearn的模型快,因为它们是用GPU训练的,如果咱们将GPU的内存增加三倍会产生什么?

在后面的比拟中,我应用的是一台搭载geforce2060的Alienware M15笔记本电脑和6.3gb的显卡内存。

当初,我将应用一个带有Quadro RTX 5000的Dell Precision 7740和17 GB的显卡内存来测试GPU内存减少时的速度。

Average time of sklearn's SVC 35.791008955999914 sAverage time of cuml's SVC 1.9953700327142931 sRatio between sklearn and cuml is 17.93702840535976

当它在一个显卡内存为17gb的机器上训练时,cuML的反对向量机比Sklearn的反对向量机快18倍!它的速度是笔记本电脑训练速度的10倍,显卡内存为6.3gb。

这就是为什么如果咱们应用像cuML这样的GPU减速库。

随机森林分类器

clf_rf = RandomForestClassifier(max_features=1.0,                   n_estimators=40)sklearn_time_rf = %timeit -o train_data(clf_rf)clf_rf = RandomForestClassifier_gpu(max_features=1.0,                   n_estimators=40)cuml_time_rf = %timeit -o train_data(clf_rf)print(f"""Average time of sklearn's {clf_rf.__class__.__name__}""", sklearn_time_rf.average, 's')print(f"""Average time of cuml's {clf_rf.__class__.__name__}""", cuml_time_rf.average, 's')print('Ratio between sklearn and cuml is', sklearn_time_rf.average/cuml_time_rf.average)
Average time of sklearn's RandomForestClassifier 29.824075075857113 sAverage time of cuml's RandomForestClassifier 0.49404465585715635 sRatio between sklearn and cuml is 60.3671646323408

cuML的RandomForestClassifier比Sklearn的RandomForestClassifier快60倍!如果训练Sklearn的RandomForestClassifier须要30秒,那么训练cuML的RandomForestClassifier只须要不到半秒!

更好的显卡

Average time of Sklearn's RandomForestClassifier 24.006061030143037 sAverage time of cuML's RandomForestClassifier 0.15141178591425808 s.The ratio between Sklearn’s and cuML is 158.54816641379068

在我的戴尔Precision 7740笔记本电脑上训练时,cuML的RandomForestClassifier比Sklearn的RandomForestClassifier快158倍!

最近邻分类器

Average time of sklearn's KNeighborsClassifier 0.07836367340000508 sAverage time of cuml's KNeighborsClassifier 0.004251259535714585 sRatio between sklearn and cuml is 18.43304854518441

注:y轴上的20m示意20ms。

cuML的KNeighborsClassifier比Sklearn的KNeighborsClassifier快18倍。

更大的显卡内存

Average time of sklearn's KNeighborsClassifier 0.07511190322854547 sAverage time of cuml's KNeighborsClassifier 0.0015137992111426033 sRatio between sklearn and cuml is 49.618141346401956

在我的戴尔Precision 7740笔记本电脑上训练时,cuML的KNeighborsClassifier比Sklearn的KNeighborsClassifier快50倍。

总结

你能够在这里找到其余比拟的代码。

以下两个表总结了两个库之间不同模型的速度:

  • Alienware M15-GeForce 2060和6.3 GB显卡内存
indexsklearn(s)cuml(s)sklearn/cuml
SVC50.2423.692.121
RandomForestClassifier29.820.44367.32
KNeighborsClassifier0.0780.00419.5
LinearRegression0.0050.0060.8333
Ridge0.0210.0063.5
KNeighborsRegressor0.0760.00238
  • Dell Precision 7740-Quadro RTX 5000和17 GB显卡内存
indexsklearn(s)cuml(s)sklearn/cuml
SVC35.791.99517.94
RandomForestClassifier24.010.151159
KNeighborsClassifier0.0750.00237.5
LinearRegression0.0060.0023
Ridge0.0050.0022.5
KNeighborsRegressor0.0690.00169

相当令人印象粗浅,不是吗?

论断

你刚刚理解了在cuML上训练不同的模型与Sklearn相比有多快。如果应用Sklearn训练你的模型须要很长时间,我强烈建议你尝试一下cuML,因为与Sklearn的API相比,代码没有任何变动。

当然,如果库应用GPU来执行像cuML这样的代码,那么你领有的显卡越好,训练的速度就越快。

无关其余机器学习模型的详细信息,请参阅cuML的文档:https://docs.rapids.ai/api/cu...

原文链接:https://towardsdatascience.co...

欢送关注磐创AI博客站:
http://panchuang.net/

sklearn机器学习中文官网文档:
http://sklearn123.com/

欢送关注磐创博客资源汇总站:
http://docs.panchuang.net/