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