做者|Khuyen Tran
编译|VK
来源|Towards Data Sciencepython
Sklearn是一个很好的库,有各类机器学习模型,能够用来训练数据。可是若是你的数据很大,你可能须要很长时间来训练你的数据,特别是当你用不一样的超参数来寻找最佳模型时。算法
有没有一种方法可使机器学习模型的训练速度比使用Sklearn的速度快150倍?答案就是你可使用cuML。api
下面的图表比较了使用Sklearn的RandomForestClassifier和cuML的RandomForestClassifier训练同一模型所需的时间。echarts
cuML是一套快速的,GPU加速的机器学习算法,设计用于数据科学和分析任务。它的API相似于Sklearn的,这意味着你可使用训练Sklearn模型的代码来训练cuML的模型。dom
from cuml.ensemble import RandomForestClassifier clf = KNeighborsClassifier(n_neighbors=10) clf.fit(X, y)
在本文中,我将比较使用不一样模型的这两个库的性能。我还将演示如何增长显卡,使得速度提升10倍。机器学习
要安装cuML,请按照Rapids页面上的说明进行安装。请确保在安装库以前检查先决条件。你能够安装全部软件包,也能够只安装cuML。若是你的计算机空间有限,我建议安装cuDF和cuML。函数
虽然在不少状况下,不须要安装cuDF来使用cuML,可是cuDF是cuML的一个很好的补充,由于它是一个GPU数据帧。性能
确保选择适合你计算机的选项。学习
由于当有大量数据时,cuML一般比Sklearn更好,所以咱们将使用sklearn.datasets.测试
从sklearn导入数据集
from sklearn import datasets X, 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_gpu clf_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 s Average time of cuml's SVC 19.611496431714304 s Ratio between sklearn and cuml is 2.476103668030909
cuML的SVC比sklearn的SVC快2.5倍!
让咱们经过图片来可视化它。咱们建立一个函数来绘制模型的速度。
!pip install cutecharts import 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 s Average time of cuml's SVC 1.9953700327142931 s Ratio 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 s Average time of cuml's RandomForestClassifier 0.49404465585715635 s Ratio 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 s Average 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 s Average time of cuml's KNeighborsClassifier 0.004251259535714585 s Ratio between sklearn and cuml is 18.43304854518441
注:y轴上的20m表示20ms。
cuML的KNeighborsClassifier比Sklearn的KNeighborsClassifier快18倍。
Average time of sklearn's KNeighborsClassifier 0.07511190322854547 s Average time of cuml's KNeighborsClassifier 0.0015137992111426033 s Ratio between sklearn and cuml is 49.618141346401956
在个人戴尔Precision 7740笔记本电脑上训练时,cuML的KNeighborsClassifier比Sklearn的KNeighborsClassifier快50倍。
你能够在这里找到其余比较的代码。
如下两个表总结了两个库之间不一样模型的速度:
index | sklearn(s) | cuml(s) | sklearn/cuml |
---|---|---|---|
SVC | 50.24 | 23.69 | 2.121 |
RandomForestClassifier | 29.82 | 0.443 | 67.32 |
KNeighborsClassifier | 0.078 | 0.004 | 19.5 |
LinearRegression | 0.005 | 0.006 | 0.8333 |
Ridge | 0.021 | 0.006 | 3.5 |
KNeighborsRegressor | 0.076 | 0.002 | 38 |
index | sklearn(s) | cuml(s) | sklearn/cuml |
---|---|---|---|
SVC | 35.79 | 1.995 | 17.94 |
RandomForestClassifier | 24.01 | 0.151 | 159 |
KNeighborsClassifier | 0.075 | 0.002 | 37.5 |
LinearRegression | 0.006 | 0.002 | 3 |
Ridge | 0.005 | 0.002 | 2.5 |
KNeighborsRegressor | 0.069 | 0.001 | 69 |
至关使人印象深入,不是吗?
你刚刚了解了在cuML上训练不一样的模型与Sklearn相比有多快。若是使用Sklearn训练你的模型须要很长时间,我强烈建议你尝试一下cuML,由于与Sklearn的API相比,代码没有任何变化。
固然,若是库使用GPU来执行像cuML这样的代码,那么你拥有的显卡越好,训练的速度就越快。
有关其余机器学习模型的详细信息,请参阅cuML的文档:https://docs.rapids.ai/api/cuml/stable/
原文连接:https://towardsdatascience.com/train-your-machine-learning-model-150x-faster-with-cuml-69d0768a047a
欢迎关注磐创AI博客站:
http://panchuang.net/
sklearn机器学习中文官方文档:
http://sklearn123.com/
欢迎关注磐创博客资源汇总站:
http://docs.panchuang.net/