'如何在 GPU 上加速數據科學'

"

雷鋒網 AI 科技評論按,數據科學家需要算力。無論您是用 pandas 處理一個大數據集,還是用 Numpy 在一個大矩陣上運行一些計算,您都需要一臺強大的機器,以便在合理的時間內完成這項工作。

在過去的幾年中,數據科學家常用的 Python 庫已經非常擅長利用 CPU 能力。

Pandas 的基礎代碼是用 C 語言編寫的,它可以很好地處理大小超過 100GB 的數據集。如果您沒有足夠的 RAM 來容納這樣的數據集,那麼您可以使用分塊功能,它很方便,可以一次處理一個數據塊。

GPUs vs CPUs:並行處理

有了大量的數據,CPU 就不會切斷它了。

一個超過 100GB 的數據集將有許多數據點,數據點的數值在數百萬甚至數十億的範圍內。有了這麼多的數據點要處理,不管你的 CPU 有多快,它都沒有足夠的內核來進行有效的並行處理。如果你的 CPU 有 20 個內核(這將是相當昂貴的 CPU),你一次只能處理 20 個數據點!

CPU 在時鐘頻率更重要的任務中會更好——或者根本沒有 GPU 實現。如果你嘗試執行的流程有一個 GPU 實現,且該任務可以從並行處理中受益,那麼 GPU 將更加有效。

"

雷鋒網 AI 科技評論按,數據科學家需要算力。無論您是用 pandas 處理一個大數據集,還是用 Numpy 在一個大矩陣上運行一些計算,您都需要一臺強大的機器,以便在合理的時間內完成這項工作。

在過去的幾年中,數據科學家常用的 Python 庫已經非常擅長利用 CPU 能力。

Pandas 的基礎代碼是用 C 語言編寫的,它可以很好地處理大小超過 100GB 的數據集。如果您沒有足夠的 RAM 來容納這樣的數據集,那麼您可以使用分塊功能,它很方便,可以一次處理一個數據塊。

GPUs vs CPUs:並行處理

有了大量的數據,CPU 就不會切斷它了。

一個超過 100GB 的數據集將有許多數據點,數據點的數值在數百萬甚至數十億的範圍內。有了這麼多的數據點要處理,不管你的 CPU 有多快,它都沒有足夠的內核來進行有效的並行處理。如果你的 CPU 有 20 個內核(這將是相當昂貴的 CPU),你一次只能處理 20 個數據點!

CPU 在時鐘頻率更重要的任務中會更好——或者根本沒有 GPU 實現。如果你嘗試執行的流程有一個 GPU 實現,且該任務可以從並行處理中受益,那麼 GPU 將更加有效。

如何在 GPU 上加速數據科學

多核系統如何更快地處理數據。對於單核系統(左),所有 10 個任務都轉到一個節點。對於雙核系統(右),每個節點承擔 5 個任務,從而使處理速度加倍

深度學習已經在利用 GPU 方面發揮了相當大的作用。許多在深度學習中完成的卷積操作是重複的,因此在 GPU 上可以大大加速,甚至可以達到 100 次。

今天的數據科學沒有什麼不同,因為許多重複的操作都是在大數據集上執行的,庫中有 pandas、Numpy 和 scikit-learn。這些操作也不太複雜,無法在 GPU 上實現。

最後,還有一個解決方案。

用 Rapids 加速 GPU

Rapids 是一套軟件庫,旨在利用 GPU 加速數據科學。它使用低級別的 CUDA 代碼實現快速的、GPU 優化的算法,同時它上面還有一個易於使用的 Python 層。

Rapids 的美妙之處在於它與數據科學庫的集成非常順利,比如 pandas 數據幀就很容易通過 Rapids 實現 GPU 加速。下圖說明了 Rapids 如何在保持頂層易用性的同時實現低層的加速。

"

雷鋒網 AI 科技評論按,數據科學家需要算力。無論您是用 pandas 處理一個大數據集,還是用 Numpy 在一個大矩陣上運行一些計算,您都需要一臺強大的機器,以便在合理的時間內完成這項工作。

在過去的幾年中,數據科學家常用的 Python 庫已經非常擅長利用 CPU 能力。

Pandas 的基礎代碼是用 C 語言編寫的,它可以很好地處理大小超過 100GB 的數據集。如果您沒有足夠的 RAM 來容納這樣的數據集,那麼您可以使用分塊功能,它很方便,可以一次處理一個數據塊。

GPUs vs CPUs:並行處理

有了大量的數據,CPU 就不會切斷它了。

一個超過 100GB 的數據集將有許多數據點,數據點的數值在數百萬甚至數十億的範圍內。有了這麼多的數據點要處理,不管你的 CPU 有多快,它都沒有足夠的內核來進行有效的並行處理。如果你的 CPU 有 20 個內核(這將是相當昂貴的 CPU),你一次只能處理 20 個數據點!

CPU 在時鐘頻率更重要的任務中會更好——或者根本沒有 GPU 實現。如果你嘗試執行的流程有一個 GPU 實現,且該任務可以從並行處理中受益,那麼 GPU 將更加有效。

如何在 GPU 上加速數據科學

多核系統如何更快地處理數據。對於單核系統(左),所有 10 個任務都轉到一個節點。對於雙核系統(右),每個節點承擔 5 個任務,從而使處理速度加倍

深度學習已經在利用 GPU 方面發揮了相當大的作用。許多在深度學習中完成的卷積操作是重複的,因此在 GPU 上可以大大加速,甚至可以達到 100 次。

今天的數據科學沒有什麼不同,因為許多重複的操作都是在大數據集上執行的,庫中有 pandas、Numpy 和 scikit-learn。這些操作也不太複雜,無法在 GPU 上實現。

最後,還有一個解決方案。

用 Rapids 加速 GPU

Rapids 是一套軟件庫,旨在利用 GPU 加速數據科學。它使用低級別的 CUDA 代碼實現快速的、GPU 優化的算法,同時它上面還有一個易於使用的 Python 層。

Rapids 的美妙之處在於它與數據科學庫的集成非常順利,比如 pandas 數據幀就很容易通過 Rapids 實現 GPU 加速。下圖說明了 Rapids 如何在保持頂層易用性的同時實現低層的加速。

如何在 GPU 上加速數據科學

Rapids 利用了幾個 Python 庫:

  • cuDF-Python GPU 數據幀。它幾乎可以做 pandas 在數據處理和操作方面所能做的一切。

  • cuML-cuGraph 機器學習庫。它包含了 Scikit-Learn 擁有的許多 ML 算法,所有算法的格式都非常相似。

  • cuGraph-cuGraph 圖處理庫。它包含許多常見的圖分析算法,包括 PageRank 和各種相似性度量。

如何使用 Rapids

安裝

現在你將看到如何使用 Rapids!

要安裝它,請訪問這個網站,在這裡你將看到如何安裝 Rapids。你可以通過 Conda 將其直接安裝到你的機器上,或者簡單地使用 Docker 容器。

安裝時,可以設置系統規範,如 CUDA 版本和要安裝的庫。例如,我有 CUDA 10.0,想要安裝所有庫,所以我的安裝命令是:

conda install -c nvidia -c rapidsai -c numba -c conda-forge -c pytorch -c defaults cudf=0.8 cuml=0.8 cugraph=0.8 python=3.6 cudatoolkit=10.0

一旦命令完成運行,就可以開始用 GPU 加速數據科學了。

設置我們的數據

對於本教程,我們將介紹 DBSCAN demo 的修改版本。我將使用 Nvidia 數據科學工作站和 2 個 GPU 運行這個測試。

DBSCAN 是一種基於密度的聚類算法,可以自動對數據進行分類,而無需用戶指定有多少組數據。在 Scikit-Learn 中有它的實現。

我們將從獲取所有導入設置開始。先導入用於加載數據、可視化數據和應用 ML 模型的庫。

import os

import matplotlib.pyplot as plt

from matplotlib.colors import ListedColormap

from sklearn.datasets import make_circles

make_circles 函數將自動創建一個複雜的數據分佈,類似於我們將應用於 DBSCAN 的兩個圓。

讓我們從創建 100000 點的數據集開始,並在圖中可視化:

X, y = make_circles(n_samples=int(1e5), factor=.35, noise=.05)

X[:, 0] = 3*X[:, 0]

X[:, 1] = 3*X[:, 1]

plt.scatter(X[:, 0], X[:, 1])

plt.show

"

雷鋒網 AI 科技評論按,數據科學家需要算力。無論您是用 pandas 處理一個大數據集,還是用 Numpy 在一個大矩陣上運行一些計算,您都需要一臺強大的機器,以便在合理的時間內完成這項工作。

在過去的幾年中,數據科學家常用的 Python 庫已經非常擅長利用 CPU 能力。

Pandas 的基礎代碼是用 C 語言編寫的,它可以很好地處理大小超過 100GB 的數據集。如果您沒有足夠的 RAM 來容納這樣的數據集,那麼您可以使用分塊功能,它很方便,可以一次處理一個數據塊。

GPUs vs CPUs:並行處理

有了大量的數據,CPU 就不會切斷它了。

一個超過 100GB 的數據集將有許多數據點,數據點的數值在數百萬甚至數十億的範圍內。有了這麼多的數據點要處理,不管你的 CPU 有多快,它都沒有足夠的內核來進行有效的並行處理。如果你的 CPU 有 20 個內核(這將是相當昂貴的 CPU),你一次只能處理 20 個數據點!

CPU 在時鐘頻率更重要的任務中會更好——或者根本沒有 GPU 實現。如果你嘗試執行的流程有一個 GPU 實現,且該任務可以從並行處理中受益,那麼 GPU 將更加有效。

如何在 GPU 上加速數據科學

多核系統如何更快地處理數據。對於單核系統(左),所有 10 個任務都轉到一個節點。對於雙核系統(右),每個節點承擔 5 個任務,從而使處理速度加倍

深度學習已經在利用 GPU 方面發揮了相當大的作用。許多在深度學習中完成的卷積操作是重複的,因此在 GPU 上可以大大加速,甚至可以達到 100 次。

今天的數據科學沒有什麼不同,因為許多重複的操作都是在大數據集上執行的,庫中有 pandas、Numpy 和 scikit-learn。這些操作也不太複雜,無法在 GPU 上實現。

最後,還有一個解決方案。

用 Rapids 加速 GPU

Rapids 是一套軟件庫,旨在利用 GPU 加速數據科學。它使用低級別的 CUDA 代碼實現快速的、GPU 優化的算法,同時它上面還有一個易於使用的 Python 層。

Rapids 的美妙之處在於它與數據科學庫的集成非常順利,比如 pandas 數據幀就很容易通過 Rapids 實現 GPU 加速。下圖說明了 Rapids 如何在保持頂層易用性的同時實現低層的加速。

如何在 GPU 上加速數據科學

Rapids 利用了幾個 Python 庫:

  • cuDF-Python GPU 數據幀。它幾乎可以做 pandas 在數據處理和操作方面所能做的一切。

  • cuML-cuGraph 機器學習庫。它包含了 Scikit-Learn 擁有的許多 ML 算法,所有算法的格式都非常相似。

  • cuGraph-cuGraph 圖處理庫。它包含許多常見的圖分析算法,包括 PageRank 和各種相似性度量。

如何使用 Rapids

安裝

現在你將看到如何使用 Rapids!

要安裝它,請訪問這個網站,在這裡你將看到如何安裝 Rapids。你可以通過 Conda 將其直接安裝到你的機器上,或者簡單地使用 Docker 容器。

安裝時,可以設置系統規範,如 CUDA 版本和要安裝的庫。例如,我有 CUDA 10.0,想要安裝所有庫,所以我的安裝命令是:

conda install -c nvidia -c rapidsai -c numba -c conda-forge -c pytorch -c defaults cudf=0.8 cuml=0.8 cugraph=0.8 python=3.6 cudatoolkit=10.0

一旦命令完成運行,就可以開始用 GPU 加速數據科學了。

設置我們的數據

對於本教程,我們將介紹 DBSCAN demo 的修改版本。我將使用 Nvidia 數據科學工作站和 2 個 GPU 運行這個測試。

DBSCAN 是一種基於密度的聚類算法,可以自動對數據進行分類,而無需用戶指定有多少組數據。在 Scikit-Learn 中有它的實現。

我們將從獲取所有導入設置開始。先導入用於加載數據、可視化數據和應用 ML 模型的庫。

import os

import matplotlib.pyplot as plt

from matplotlib.colors import ListedColormap

from sklearn.datasets import make_circles

make_circles 函數將自動創建一個複雜的數據分佈,類似於我們將應用於 DBSCAN 的兩個圓。

讓我們從創建 100000 點的數據集開始,並在圖中可視化:

X, y = make_circles(n_samples=int(1e5), factor=.35, noise=.05)

X[:, 0] = 3*X[:, 0]

X[:, 1] = 3*X[:, 1]

plt.scatter(X[:, 0], X[:, 1])

plt.show

如何在 GPU 上加速數據科學

CPU 上的 DBSCAN

使用 Scikit-Learn 在 CPU 上運行 DBSCAN 很容易。我們將導入我們的算法並設置一些參數。

from sklearn.cluster import DBSCAN

db = DBSCAN(eps=0.6, min_samples=2)

我們現在可以通過調用 Scikit-Learn 中的一個函數對循環數據使用 DBSCAN。在函數前面加上一個「%」,就可以讓 Jupyter Notebook 測量它的運行時間。

%%time

y_db = db.fit_predict(X)

這 10 萬個點的運行時間是 8.31 秒,如下圖所示:

"

雷鋒網 AI 科技評論按,數據科學家需要算力。無論您是用 pandas 處理一個大數據集,還是用 Numpy 在一個大矩陣上運行一些計算,您都需要一臺強大的機器,以便在合理的時間內完成這項工作。

在過去的幾年中,數據科學家常用的 Python 庫已經非常擅長利用 CPU 能力。

Pandas 的基礎代碼是用 C 語言編寫的,它可以很好地處理大小超過 100GB 的數據集。如果您沒有足夠的 RAM 來容納這樣的數據集,那麼您可以使用分塊功能,它很方便,可以一次處理一個數據塊。

GPUs vs CPUs:並行處理

有了大量的數據,CPU 就不會切斷它了。

一個超過 100GB 的數據集將有許多數據點,數據點的數值在數百萬甚至數十億的範圍內。有了這麼多的數據點要處理,不管你的 CPU 有多快,它都沒有足夠的內核來進行有效的並行處理。如果你的 CPU 有 20 個內核(這將是相當昂貴的 CPU),你一次只能處理 20 個數據點!

CPU 在時鐘頻率更重要的任務中會更好——或者根本沒有 GPU 實現。如果你嘗試執行的流程有一個 GPU 實現,且該任務可以從並行處理中受益,那麼 GPU 將更加有效。

如何在 GPU 上加速數據科學

多核系統如何更快地處理數據。對於單核系統(左),所有 10 個任務都轉到一個節點。對於雙核系統(右),每個節點承擔 5 個任務,從而使處理速度加倍

深度學習已經在利用 GPU 方面發揮了相當大的作用。許多在深度學習中完成的卷積操作是重複的,因此在 GPU 上可以大大加速,甚至可以達到 100 次。

今天的數據科學沒有什麼不同,因為許多重複的操作都是在大數據集上執行的,庫中有 pandas、Numpy 和 scikit-learn。這些操作也不太複雜,無法在 GPU 上實現。

最後,還有一個解決方案。

用 Rapids 加速 GPU

Rapids 是一套軟件庫,旨在利用 GPU 加速數據科學。它使用低級別的 CUDA 代碼實現快速的、GPU 優化的算法,同時它上面還有一個易於使用的 Python 層。

Rapids 的美妙之處在於它與數據科學庫的集成非常順利,比如 pandas 數據幀就很容易通過 Rapids 實現 GPU 加速。下圖說明了 Rapids 如何在保持頂層易用性的同時實現低層的加速。

如何在 GPU 上加速數據科學

Rapids 利用了幾個 Python 庫:

  • cuDF-Python GPU 數據幀。它幾乎可以做 pandas 在數據處理和操作方面所能做的一切。

  • cuML-cuGraph 機器學習庫。它包含了 Scikit-Learn 擁有的許多 ML 算法,所有算法的格式都非常相似。

  • cuGraph-cuGraph 圖處理庫。它包含許多常見的圖分析算法,包括 PageRank 和各種相似性度量。

如何使用 Rapids

安裝

現在你將看到如何使用 Rapids!

要安裝它,請訪問這個網站,在這裡你將看到如何安裝 Rapids。你可以通過 Conda 將其直接安裝到你的機器上,或者簡單地使用 Docker 容器。

安裝時,可以設置系統規範,如 CUDA 版本和要安裝的庫。例如,我有 CUDA 10.0,想要安裝所有庫,所以我的安裝命令是:

conda install -c nvidia -c rapidsai -c numba -c conda-forge -c pytorch -c defaults cudf=0.8 cuml=0.8 cugraph=0.8 python=3.6 cudatoolkit=10.0

一旦命令完成運行,就可以開始用 GPU 加速數據科學了。

設置我們的數據

對於本教程,我們將介紹 DBSCAN demo 的修改版本。我將使用 Nvidia 數據科學工作站和 2 個 GPU 運行這個測試。

DBSCAN 是一種基於密度的聚類算法,可以自動對數據進行分類,而無需用戶指定有多少組數據。在 Scikit-Learn 中有它的實現。

我們將從獲取所有導入設置開始。先導入用於加載數據、可視化數據和應用 ML 模型的庫。

import os

import matplotlib.pyplot as plt

from matplotlib.colors import ListedColormap

from sklearn.datasets import make_circles

make_circles 函數將自動創建一個複雜的數據分佈,類似於我們將應用於 DBSCAN 的兩個圓。

讓我們從創建 100000 點的數據集開始,並在圖中可視化:

X, y = make_circles(n_samples=int(1e5), factor=.35, noise=.05)

X[:, 0] = 3*X[:, 0]

X[:, 1] = 3*X[:, 1]

plt.scatter(X[:, 0], X[:, 1])

plt.show

如何在 GPU 上加速數據科學

CPU 上的 DBSCAN

使用 Scikit-Learn 在 CPU 上運行 DBSCAN 很容易。我們將導入我們的算法並設置一些參數。

from sklearn.cluster import DBSCAN

db = DBSCAN(eps=0.6, min_samples=2)

我們現在可以通過調用 Scikit-Learn 中的一個函數對循環數據使用 DBSCAN。在函數前面加上一個「%」,就可以讓 Jupyter Notebook 測量它的運行時間。

%%time

y_db = db.fit_predict(X)

這 10 萬個點的運行時間是 8.31 秒,如下圖所示:

如何在 GPU 上加速數據科學

使用 Scikit-Learn 在 CPU 上運行 DBSCAN 的結果

GPU 上帶 Rapids 的 DBSCAN

現在,讓我們用 Rapids 進行加速!

首先,我們將把數據轉換為 pandas.DataFrame 並使用它創建一個 cudf.DataFrame。pandas.DataFrame 無縫轉換成 cudf.DataFrame,數據格式無任何更改。

import pandas as pd

import cudf


X_df = pd.DataFrame({'fea%d'%i: X[:, i] for i in range(X.shape[1])})

X_gpu = cudf.DataFrame.from_pandas(X_df)

然後我們將從 cuML 導入並初始化一個特殊版本的 DBSCAN,它是 GPU 加速的版本。DBSCAN 的 cuML 版本的函數格式與 Scikit-Learn 的函數格式完全相同:相同的參數、相同的樣式、相同的函數。

from cuml import DBSCAN as cumlDBSCAN


db_gpu = cumlDBSCAN(eps=0.6, min_samples=2)

最後,我們可以在測量運行時間的同時運行 GPU DBSCAN 的預測函數。

%%time

y_db_gpu = db_gpu.fit_predict(X_gpu)

GPU 版本的運行時間為 4.22 秒,幾乎加速了 2 倍。由於我們使用的是相同的算法,因此結果圖也與 CPU 版本完全相同。

"

雷鋒網 AI 科技評論按,數據科學家需要算力。無論您是用 pandas 處理一個大數據集,還是用 Numpy 在一個大矩陣上運行一些計算,您都需要一臺強大的機器,以便在合理的時間內完成這項工作。

在過去的幾年中,數據科學家常用的 Python 庫已經非常擅長利用 CPU 能力。

Pandas 的基礎代碼是用 C 語言編寫的,它可以很好地處理大小超過 100GB 的數據集。如果您沒有足夠的 RAM 來容納這樣的數據集,那麼您可以使用分塊功能,它很方便,可以一次處理一個數據塊。

GPUs vs CPUs:並行處理

有了大量的數據,CPU 就不會切斷它了。

一個超過 100GB 的數據集將有許多數據點,數據點的數值在數百萬甚至數十億的範圍內。有了這麼多的數據點要處理,不管你的 CPU 有多快,它都沒有足夠的內核來進行有效的並行處理。如果你的 CPU 有 20 個內核(這將是相當昂貴的 CPU),你一次只能處理 20 個數據點!

CPU 在時鐘頻率更重要的任務中會更好——或者根本沒有 GPU 實現。如果你嘗試執行的流程有一個 GPU 實現,且該任務可以從並行處理中受益,那麼 GPU 將更加有效。

如何在 GPU 上加速數據科學

多核系統如何更快地處理數據。對於單核系統(左),所有 10 個任務都轉到一個節點。對於雙核系統(右),每個節點承擔 5 個任務,從而使處理速度加倍

深度學習已經在利用 GPU 方面發揮了相當大的作用。許多在深度學習中完成的卷積操作是重複的,因此在 GPU 上可以大大加速,甚至可以達到 100 次。

今天的數據科學沒有什麼不同,因為許多重複的操作都是在大數據集上執行的,庫中有 pandas、Numpy 和 scikit-learn。這些操作也不太複雜,無法在 GPU 上實現。

最後,還有一個解決方案。

用 Rapids 加速 GPU

Rapids 是一套軟件庫,旨在利用 GPU 加速數據科學。它使用低級別的 CUDA 代碼實現快速的、GPU 優化的算法,同時它上面還有一個易於使用的 Python 層。

Rapids 的美妙之處在於它與數據科學庫的集成非常順利,比如 pandas 數據幀就很容易通過 Rapids 實現 GPU 加速。下圖說明了 Rapids 如何在保持頂層易用性的同時實現低層的加速。

如何在 GPU 上加速數據科學

Rapids 利用了幾個 Python 庫:

  • cuDF-Python GPU 數據幀。它幾乎可以做 pandas 在數據處理和操作方面所能做的一切。

  • cuML-cuGraph 機器學習庫。它包含了 Scikit-Learn 擁有的許多 ML 算法,所有算法的格式都非常相似。

  • cuGraph-cuGraph 圖處理庫。它包含許多常見的圖分析算法,包括 PageRank 和各種相似性度量。

如何使用 Rapids

安裝

現在你將看到如何使用 Rapids!

要安裝它,請訪問這個網站,在這裡你將看到如何安裝 Rapids。你可以通過 Conda 將其直接安裝到你的機器上,或者簡單地使用 Docker 容器。

安裝時,可以設置系統規範,如 CUDA 版本和要安裝的庫。例如,我有 CUDA 10.0,想要安裝所有庫,所以我的安裝命令是:

conda install -c nvidia -c rapidsai -c numba -c conda-forge -c pytorch -c defaults cudf=0.8 cuml=0.8 cugraph=0.8 python=3.6 cudatoolkit=10.0

一旦命令完成運行,就可以開始用 GPU 加速數據科學了。

設置我們的數據

對於本教程,我們將介紹 DBSCAN demo 的修改版本。我將使用 Nvidia 數據科學工作站和 2 個 GPU 運行這個測試。

DBSCAN 是一種基於密度的聚類算法,可以自動對數據進行分類,而無需用戶指定有多少組數據。在 Scikit-Learn 中有它的實現。

我們將從獲取所有導入設置開始。先導入用於加載數據、可視化數據和應用 ML 模型的庫。

import os

import matplotlib.pyplot as plt

from matplotlib.colors import ListedColormap

from sklearn.datasets import make_circles

make_circles 函數將自動創建一個複雜的數據分佈,類似於我們將應用於 DBSCAN 的兩個圓。

讓我們從創建 100000 點的數據集開始,並在圖中可視化:

X, y = make_circles(n_samples=int(1e5), factor=.35, noise=.05)

X[:, 0] = 3*X[:, 0]

X[:, 1] = 3*X[:, 1]

plt.scatter(X[:, 0], X[:, 1])

plt.show

如何在 GPU 上加速數據科學

CPU 上的 DBSCAN

使用 Scikit-Learn 在 CPU 上運行 DBSCAN 很容易。我們將導入我們的算法並設置一些參數。

from sklearn.cluster import DBSCAN

db = DBSCAN(eps=0.6, min_samples=2)

我們現在可以通過調用 Scikit-Learn 中的一個函數對循環數據使用 DBSCAN。在函數前面加上一個「%」,就可以讓 Jupyter Notebook 測量它的運行時間。

%%time

y_db = db.fit_predict(X)

這 10 萬個點的運行時間是 8.31 秒,如下圖所示:

如何在 GPU 上加速數據科學

使用 Scikit-Learn 在 CPU 上運行 DBSCAN 的結果

GPU 上帶 Rapids 的 DBSCAN

現在,讓我們用 Rapids 進行加速!

首先,我們將把數據轉換為 pandas.DataFrame 並使用它創建一個 cudf.DataFrame。pandas.DataFrame 無縫轉換成 cudf.DataFrame,數據格式無任何更改。

import pandas as pd

import cudf


X_df = pd.DataFrame({'fea%d'%i: X[:, i] for i in range(X.shape[1])})

X_gpu = cudf.DataFrame.from_pandas(X_df)

然後我們將從 cuML 導入並初始化一個特殊版本的 DBSCAN,它是 GPU 加速的版本。DBSCAN 的 cuML 版本的函數格式與 Scikit-Learn 的函數格式完全相同:相同的參數、相同的樣式、相同的函數。

from cuml import DBSCAN as cumlDBSCAN


db_gpu = cumlDBSCAN(eps=0.6, min_samples=2)

最後,我們可以在測量運行時間的同時運行 GPU DBSCAN 的預測函數。

%%time

y_db_gpu = db_gpu.fit_predict(X_gpu)

GPU 版本的運行時間為 4.22 秒,幾乎加速了 2 倍。由於我們使用的是相同的算法,因此結果圖也與 CPU 版本完全相同。

如何在 GPU 上加速數據科學

使用 cuML 在 GPU 上運行 DBSCAN 的結果

使用 Rapids GPU 獲得超高速

我們從 Rapids 獲得的加速量取決於我們正在處理的數據量。一個好的經驗法則是,較大的數據集將更加受益於 GPU 加速。在 CPU 和 GPU 之間傳輸數據有一些開銷時間——對於較大的數據集,開銷時間變得更「值得」。

我們可以用一個簡單的例子來說明這一點。

我們將創建一個隨機數的 Numpy 數組並對其應用 DBSCAN。我們將比較常規 CPU DBSCAN 和 cuML 的 GPU 版本的速度,同時增加和減少數據點的數量,以瞭解它如何影響我們的運行時間。

下面的代碼說明如何進行測試:

import numpy as np


n_rows, n_cols = 10000, 100

X = np.random.rand(n_rows, n_cols)

print(X.shape)


X_df = pd.DataFrame({'fea%d'%i: X[:, i] for i in range(X.shape[1])})

X_gpu = cudf.DataFrame.from_pandas(X_df)


db = DBSCAN(eps=3, min_samples=2)

db_gpu = cumlDBSCAN(eps=3, min_samples=2)


%%time

y_db = db.fit_predict(X)


%%time

y_db_gpu = db_gpu.fit_predict(X_gpu)

檢查下面的 Matplotlib 結果圖:

"

雷鋒網 AI 科技評論按,數據科學家需要算力。無論您是用 pandas 處理一個大數據集,還是用 Numpy 在一個大矩陣上運行一些計算,您都需要一臺強大的機器,以便在合理的時間內完成這項工作。

在過去的幾年中,數據科學家常用的 Python 庫已經非常擅長利用 CPU 能力。

Pandas 的基礎代碼是用 C 語言編寫的,它可以很好地處理大小超過 100GB 的數據集。如果您沒有足夠的 RAM 來容納這樣的數據集,那麼您可以使用分塊功能,它很方便,可以一次處理一個數據塊。

GPUs vs CPUs:並行處理

有了大量的數據,CPU 就不會切斷它了。

一個超過 100GB 的數據集將有許多數據點,數據點的數值在數百萬甚至數十億的範圍內。有了這麼多的數據點要處理,不管你的 CPU 有多快,它都沒有足夠的內核來進行有效的並行處理。如果你的 CPU 有 20 個內核(這將是相當昂貴的 CPU),你一次只能處理 20 個數據點!

CPU 在時鐘頻率更重要的任務中會更好——或者根本沒有 GPU 實現。如果你嘗試執行的流程有一個 GPU 實現,且該任務可以從並行處理中受益,那麼 GPU 將更加有效。

如何在 GPU 上加速數據科學

多核系統如何更快地處理數據。對於單核系統(左),所有 10 個任務都轉到一個節點。對於雙核系統(右),每個節點承擔 5 個任務,從而使處理速度加倍

深度學習已經在利用 GPU 方面發揮了相當大的作用。許多在深度學習中完成的卷積操作是重複的,因此在 GPU 上可以大大加速,甚至可以達到 100 次。

今天的數據科學沒有什麼不同,因為許多重複的操作都是在大數據集上執行的,庫中有 pandas、Numpy 和 scikit-learn。這些操作也不太複雜,無法在 GPU 上實現。

最後,還有一個解決方案。

用 Rapids 加速 GPU

Rapids 是一套軟件庫,旨在利用 GPU 加速數據科學。它使用低級別的 CUDA 代碼實現快速的、GPU 優化的算法,同時它上面還有一個易於使用的 Python 層。

Rapids 的美妙之處在於它與數據科學庫的集成非常順利,比如 pandas 數據幀就很容易通過 Rapids 實現 GPU 加速。下圖說明了 Rapids 如何在保持頂層易用性的同時實現低層的加速。

如何在 GPU 上加速數據科學

Rapids 利用了幾個 Python 庫:

  • cuDF-Python GPU 數據幀。它幾乎可以做 pandas 在數據處理和操作方面所能做的一切。

  • cuML-cuGraph 機器學習庫。它包含了 Scikit-Learn 擁有的許多 ML 算法,所有算法的格式都非常相似。

  • cuGraph-cuGraph 圖處理庫。它包含許多常見的圖分析算法,包括 PageRank 和各種相似性度量。

如何使用 Rapids

安裝

現在你將看到如何使用 Rapids!

要安裝它,請訪問這個網站,在這裡你將看到如何安裝 Rapids。你可以通過 Conda 將其直接安裝到你的機器上,或者簡單地使用 Docker 容器。

安裝時,可以設置系統規範,如 CUDA 版本和要安裝的庫。例如,我有 CUDA 10.0,想要安裝所有庫,所以我的安裝命令是:

conda install -c nvidia -c rapidsai -c numba -c conda-forge -c pytorch -c defaults cudf=0.8 cuml=0.8 cugraph=0.8 python=3.6 cudatoolkit=10.0

一旦命令完成運行,就可以開始用 GPU 加速數據科學了。

設置我們的數據

對於本教程,我們將介紹 DBSCAN demo 的修改版本。我將使用 Nvidia 數據科學工作站和 2 個 GPU 運行這個測試。

DBSCAN 是一種基於密度的聚類算法,可以自動對數據進行分類,而無需用戶指定有多少組數據。在 Scikit-Learn 中有它的實現。

我們將從獲取所有導入設置開始。先導入用於加載數據、可視化數據和應用 ML 模型的庫。

import os

import matplotlib.pyplot as plt

from matplotlib.colors import ListedColormap

from sklearn.datasets import make_circles

make_circles 函數將自動創建一個複雜的數據分佈,類似於我們將應用於 DBSCAN 的兩個圓。

讓我們從創建 100000 點的數據集開始,並在圖中可視化:

X, y = make_circles(n_samples=int(1e5), factor=.35, noise=.05)

X[:, 0] = 3*X[:, 0]

X[:, 1] = 3*X[:, 1]

plt.scatter(X[:, 0], X[:, 1])

plt.show

如何在 GPU 上加速數據科學

CPU 上的 DBSCAN

使用 Scikit-Learn 在 CPU 上運行 DBSCAN 很容易。我們將導入我們的算法並設置一些參數。

from sklearn.cluster import DBSCAN

db = DBSCAN(eps=0.6, min_samples=2)

我們現在可以通過調用 Scikit-Learn 中的一個函數對循環數據使用 DBSCAN。在函數前面加上一個「%」,就可以讓 Jupyter Notebook 測量它的運行時間。

%%time

y_db = db.fit_predict(X)

這 10 萬個點的運行時間是 8.31 秒,如下圖所示:

如何在 GPU 上加速數據科學

使用 Scikit-Learn 在 CPU 上運行 DBSCAN 的結果

GPU 上帶 Rapids 的 DBSCAN

現在,讓我們用 Rapids 進行加速!

首先,我們將把數據轉換為 pandas.DataFrame 並使用它創建一個 cudf.DataFrame。pandas.DataFrame 無縫轉換成 cudf.DataFrame,數據格式無任何更改。

import pandas as pd

import cudf


X_df = pd.DataFrame({'fea%d'%i: X[:, i] for i in range(X.shape[1])})

X_gpu = cudf.DataFrame.from_pandas(X_df)

然後我們將從 cuML 導入並初始化一個特殊版本的 DBSCAN,它是 GPU 加速的版本。DBSCAN 的 cuML 版本的函數格式與 Scikit-Learn 的函數格式完全相同:相同的參數、相同的樣式、相同的函數。

from cuml import DBSCAN as cumlDBSCAN


db_gpu = cumlDBSCAN(eps=0.6, min_samples=2)

最後,我們可以在測量運行時間的同時運行 GPU DBSCAN 的預測函數。

%%time

y_db_gpu = db_gpu.fit_predict(X_gpu)

GPU 版本的運行時間為 4.22 秒,幾乎加速了 2 倍。由於我們使用的是相同的算法,因此結果圖也與 CPU 版本完全相同。

如何在 GPU 上加速數據科學

使用 cuML 在 GPU 上運行 DBSCAN 的結果

使用 Rapids GPU 獲得超高速

我們從 Rapids 獲得的加速量取決於我們正在處理的數據量。一個好的經驗法則是,較大的數據集將更加受益於 GPU 加速。在 CPU 和 GPU 之間傳輸數據有一些開銷時間——對於較大的數據集,開銷時間變得更「值得」。

我們可以用一個簡單的例子來說明這一點。

我們將創建一個隨機數的 Numpy 數組並對其應用 DBSCAN。我們將比較常規 CPU DBSCAN 和 cuML 的 GPU 版本的速度,同時增加和減少數據點的數量,以瞭解它如何影響我們的運行時間。

下面的代碼說明如何進行測試:

import numpy as np


n_rows, n_cols = 10000, 100

X = np.random.rand(n_rows, n_cols)

print(X.shape)


X_df = pd.DataFrame({'fea%d'%i: X[:, i] for i in range(X.shape[1])})

X_gpu = cudf.DataFrame.from_pandas(X_df)


db = DBSCAN(eps=3, min_samples=2)

db_gpu = cumlDBSCAN(eps=3, min_samples=2)


%%time

y_db = db.fit_predict(X)


%%time

y_db_gpu = db_gpu.fit_predict(X_gpu)

檢查下面的 Matplotlib 結果圖:

如何在 GPU 上加速數據科學

當使用 GPU 而不是 CPU 時,數量會急劇增加。即使在 10000 點(最左邊),我們的速度仍然是 4.54x。在更高的一端,1 千萬點,我們切換到 GPU 時的速度是 88.04x!

Via:https://www.kdnuggets.com/2019/07/accelerate-data-science-on-gpu.html

雷鋒網雷鋒網

"

相關推薦

推薦中...