雷鋒網(wǎng) AI 科技評論按,數(shù)據(jù)科學家需要算力,。無論您是用 pandas 處理一個大數(shù)據(jù)集,,還是用 Numpy 在一個大矩陣上運行一些計算,您都需要一臺強大的機器,,以便在合理的時間內(nèi)完成這項工作,。 在過去的幾年中,數(shù)據(jù)科學家常用的 Python 庫已經(jīng)非常擅長利用 CPU 能力,。 Pandas 的基礎(chǔ)代碼是用 C 語言編寫的,,它可以很好地處理大小超過 100GB 的數(shù)據(jù)集,。如果您沒有足夠的 RAM 來容納這樣的數(shù)據(jù)集,那么您可以使用分塊功能,,它很方便,,可以一次處理一個數(shù)據(jù)塊。 GPUs vs CPUs:并行處理 有了大量的數(shù)據(jù),,CPU 就不會切斷它了,。 一個超過 100GB 的數(shù)據(jù)集將有許多數(shù)據(jù)點,數(shù)據(jù)點的數(shù)值在數(shù)百萬甚至數(shù)十億的范圍內(nèi),。有了這么多的數(shù)據(jù)點要處理,,不管你的 CPU 有多快,它都沒有足夠的內(nèi)核來進行有效的并行處理,。如果你的 CPU 有 20 個內(nèi)核(這將是相當昂貴的 CPU),,你一次只能處理 20 個數(shù)據(jù)點! CPU 在時鐘頻率更重要的任務(wù)中會更好——或者根本沒有 GPU 實現(xiàn),。如果你嘗試執(zhí)行的流程有一個 GPU 實現(xiàn),,且該任務(wù)可以從并行處理中受益,那么 GPU 將更加有效,。 多核系統(tǒng)如何更快地處理數(shù)據(jù),。對于單核系統(tǒng)(左),所有 10 個任務(wù)都轉(zhuǎn)到一個節(jié)點,。對于雙核系統(tǒng)(右),,每個節(jié)點承擔 5 個任務(wù),從而使處理速度加倍 深度學習已經(jīng)在利用 GPU 方面發(fā)揮了相當大的作用,。許多在深度學習中完成的卷積操作是重復的,,因此在 GPU 上可以大大加速,甚至可以達到 100 次,。 今天的數(shù)據(jù)科學沒有什么不同,因為許多重復的操作都是在大數(shù)據(jù)集上執(zhí)行的,,庫中有 pandas,、Numpy 和 scikit-learn。這些操作也不太復雜,,無法在 GPU 上實現(xiàn),。 最后,還有一個解決方案,。 用 Rapids 加速 GPU Rapids 是一套軟件庫,,旨在利用 GPU 加速數(shù)據(jù)科學。它使用低級別的 CUDA 代碼實現(xiàn)快速的,、GPU 優(yōu)化的算法,,同時它上面還有一個易于使用的 Python 層,。 Rapids 的美妙之處在于它與數(shù)據(jù)科學庫的集成非常順利,比如 pandas 數(shù)據(jù)幀就很容易通過 Rapids 實現(xiàn) GPU 加速,。下圖說明了 Rapids 如何在保持頂層易用性的同時實現(xiàn)低層的加速,。 Rapids 利用了幾個 Python 庫:
如何使用 Rapids 安裝 現(xiàn)在你將看到如何使用 Rapids,! 要安裝它,請訪問這個網(wǎng)站,,在這里你將看到如何安裝 Rapids,。你可以通過 Conda 將其直接安裝到你的機器上,或者簡單地使用 Docker 容器,。 安裝時,,可以設(shè)置系統(tǒng)規(guī)范,如 CUDA 版本和要安裝的庫,。例如,,我有 CUDA 10.0,想要安裝所有庫,,所以我的安裝命令是:
一旦命令完成運行,,就可以開始用 GPU 加速數(shù)據(jù)科學了。 設(shè)置我們的數(shù)據(jù) 對于本教程,,我們將介紹 DBSCAN demo 的修改版本,。我將使用 Nvidia 數(shù)據(jù)科學工作站和 2 個 GPU 運行這個測試。 DBSCAN 是一種基于密度的聚類算法,,可以自動對數(shù)據(jù)進行分類,,而無需用戶指定有多少組數(shù)據(jù)。在 Scikit-Learn 中有它的實現(xiàn),。 我們將從獲取所有導入設(shè)置開始,。先導入用于加載數(shù)據(jù)、可視化數(shù)據(jù)和應用 ML 模型的庫,。
make_circles 函數(shù)將自動創(chuàng)建一個復雜的數(shù)據(jù)分布,,類似于我們將應用于 DBSCAN 的兩個圓。 讓我們從創(chuàng)建 100000 點的數(shù)據(jù)集開始,,并在圖中可視化:
CPU 上的 DBSCAN 使用 Scikit-Learn 在 CPU 上運行 DBSCAN 很容易,。我們將導入我們的算法并設(shè)置一些參數(shù),。
我們現(xiàn)在可以通過調(diào)用 Scikit-Learn 中的一個函數(shù)對循環(huán)數(shù)據(jù)使用 DBSCAN。在函數(shù)前面加上一個「%」,,就可以讓 Jupyter Notebook 測量它的運行時間,。
這 10 萬個點的運行時間是 8.31 秒,如下圖所示: 使用 Scikit-Learn 在 CPU 上運行 DBSCAN 的結(jié)果 GPU 上帶 Rapids 的 DBSCAN 現(xiàn)在,,讓我們用 Rapids 進行加速,! 首先,我們將把數(shù)據(jù)轉(zhuǎn)換為 pandas.DataFrame 并使用它創(chuàng)建一個 cudf.DataFrame,。pandas.DataFrame 無縫轉(zhuǎn)換成 cudf.DataFrame,,數(shù)據(jù)格式無任何更改。
然后我們將從 cuML 導入并初始化一個特殊版本的 DBSCAN,,它是 GPU 加速的版本,。DBSCAN 的 cuML 版本的函數(shù)格式與 Scikit-Learn 的函數(shù)格式完全相同:相同的參數(shù)、相同的樣式,、相同的函數(shù),。
最后,我們可以在測量運行時間的同時運行 GPU DBSCAN 的預測函數(shù),。
GPU 版本的運行時間為 4.22 秒,,幾乎加速了 2 倍。由于我們使用的是相同的算法,,因此結(jié)果圖也與 CPU 版本完全相同,。 使用 cuML 在 GPU 上運行 DBSCAN 的結(jié)果 使用 Rapids GPU 獲得超高速 我們從 Rapids 獲得的加速量取決于我們正在處理的數(shù)據(jù)量。一個好的經(jīng)驗法則是,,較大的數(shù)據(jù)集將更加受益于 GPU 加速,。在 CPU 和 GPU 之間傳輸數(shù)據(jù)有一些開銷時間——對于較大的數(shù)據(jù)集,開銷時間變得更「值得」,。 我們可以用一個簡單的例子來說明這一點,。 我們將創(chuàng)建一個隨機數(shù)的 Numpy 數(shù)組并對其應用 DBSCAN。我們將比較常規(guī) CPU DBSCAN 和 cuML 的 GPU 版本的速度,,同時增加和減少數(shù)據(jù)點的數(shù)量,,以了解它如何影響我們的運行時間。 下面的代碼說明如何進行測試:
檢查下面的 Matplotlib 結(jié)果圖: 當使用 GPU 而不是 CPU 時,,數(shù)量會急劇增加。即使在 10000 點(最左邊),,我們的速度仍然是 4.54x,。在更高的一端,1 千萬點,,我們切換到 GPU 時的速度是 88.04x,! Via:https://www./2019/07/accelerate-data-science-on-gpu.html 雷鋒網(wǎng)雷鋒網(wǎng) |
|