python使用cuML訓練你的機器學習模型

作者|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/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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章