作者 |Khuyen Tran
编译 |VK
起源 |Towards Data Science
动机
Sklearn 是一个很好的库,有各种机器学习模型,能够用来训练数据。然而如果你的数据很大,你可能须要很长时间来训练你的数据,特地是当你用不同的超参数来寻找最佳模型时。
有没有一种办法能够使机器学习模型的训练速度比应用 Sklearn 的速度快 150 倍?答案就是你能够应用 cuML。
上面的图表比拟了应用 Sklearn 的 RandomForestClassifier 和 cuML 的 RandomForestClassifier 训练同一模型所需的工夫。
cuML 是一套疾速的,GPU 减速的机器学习算法,设计用于数据迷信和剖析工作。它的 API 相似于 Sklearn 的,这意味着你能够应用训练 Sklearn 模型的代码来训练 cuML 的模型。
from cuml.ensemble import RandomForestClassifier
clf = 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 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 倍。
总结
你能够在这里找到其余比拟的代码。
以下两个表总结了两个库之间不同模型的速度:
- Alienware M15-GeForce 2060 和 6.3 GB 显卡内存
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 |
- Dell Precision 7740-Quadro RTX 5000 和 17 GB 显卡内存
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/cu…
原文链接:https://towardsdatascience.co…
欢送关注磐创 AI 博客站:
http://panchuang.net/
sklearn 机器学习中文官网文档:
http://sklearn123.com/
欢送关注磐创博客资源汇总站:
http://docs.panchuang.net/