作者:George Seif
編譯:ronghuaiyang
給大家試試GPU的威力!
Numpy是Python社區(qū)的一份大禮。它允許數(shù)據(jù)科學(xué)家、機(jī)器學(xué)習(xí)使用者和統(tǒng)計(jì)學(xué)家以一種簡單有效的方式處理矩陣格式的大量數(shù)據(jù)。
即使就其本身而言,Numpy在速度方面已經(jīng)比Python有了很大的提升。當(dāng)你發(fā)現(xiàn)自己Python代碼運(yùn)行緩慢,尤其是如果你看到很多的for循環(huán),使用Numpy總是一個好主意,將數(shù)據(jù)處理成Numpy并讓其向量化工作,可以得到最高速度!
盡管如此,Numpy只在CPU上運(yùn)行。對于通常只有8個或更少內(nèi)核的消費(fèi)級cpu,并行處理的數(shù)量以及因此可以達(dá)到的加速速度是有限的。
這時候,該我們的新朋友CuPy出場了!
什么是CuPy?
CuPy是一個庫,它利用CUDA GPU庫在Nvidia GPU上實(shí)現(xiàn)Numpy數(shù)組的運(yùn)算功能。有了這個實(shí)現(xiàn),由于gpu的CUDA核有很多,可以實(shí)現(xiàn)更好的并行加速。
CuPy的接口是Numpy的鏡像,在大多數(shù)情況下,它可以作為直接的替代。只要用兼容的CuPy代碼替換你的Numpy代碼,你就可以加使用GPU加速了。CuPy支持Numpy的大多數(shù)數(shù)組操作,包括索引、廣播、數(shù)組上的數(shù)學(xué)運(yùn)算和各種矩陣轉(zhuǎn)換。
你也可以編寫自定義的Python代碼,利用CUDA和GPU加速,如果你有一些具體的東西還不支持。所需要的只是c++格式的一小段代碼,CuPy將自動執(zhí)行GPU轉(zhuǎn)換,非常類似于使用Cython。
要開始與CuPy,我們可以通過pip安裝庫:
使用CuPy跑在GPU上
對于這些基準(zhǔn)測試,我將使用以下配置的PC機(jī)進(jìn)行測試:
一旦安裝了CuPy,我們可以像Numpy一樣導(dǎo)入它:
import numpy as np import cupy as cp import time
對于剩下的代碼,在Numpy和CuPy之間切換就像用CuPy的cp替換Numpy的np一樣簡單。下面的代碼為Numpy和CuPy創(chuàng)建了一個包含10億個1的3D數(shù)組。為了測量創(chuàng)建數(shù)組的速度,我使用了Python的原生“time”庫:
非常容易!
令人難以置信的是,即使這只是一個數(shù)組創(chuàng)建,CuPy仍然要快得多。Numpy在1.68秒內(nèi)創(chuàng)建了包含10億個1的數(shù)組,而CuPy只花了0.16秒,這是10.5倍的加速!
但我們還可以做得更多。
讓我們試著對數(shù)組做一些數(shù)學(xué)運(yùn)算。這次我們將整個數(shù)組乘以5,再次檢查Numpy和CuPy的速度。
### Numpy and CPU s = time.time() x_cpu *= 5 e = time.time() print(e - s) ### CuPy and GPU s = time.time() x_gpu *= 5 e = time.time() print(e - s)
在本例中,CuPy吊打Numpy,Numpy花了0.507s,CuPy只花了0.000710s,這是714.1倍的加速!
現(xiàn)在讓我們嘗試使用多個數(shù)組并執(zhí)行一些操作。下面的代碼將做以下工作:
在本例中,Numpy在CPU上以1.49秒的時間執(zhí)行完該進(jìn)程,而CuPy在GPU上以0.0922秒的時間執(zhí)行完該進(jìn)程,仍然有16.16倍加速!
是不是超級快?
使用CuPy是在GPU上多次加速Numpy和矩陣運(yùn)算的好方法。需要注意的是,你將獲得的加速高度依賴于你正在處理的數(shù)組的大小。下表顯示了我們改變數(shù)組大小時的速度差異:
一旦我們達(dá)到大約1000萬個數(shù)據(jù)點(diǎn),速度就會大大加快,而一旦超過1億個數(shù)據(jù)點(diǎn),速度就會大大加快。在此之下,Numpy實(shí)際上更快。此外,請記住,更多的GPU內(nèi)存將幫助你處理更多的數(shù)據(jù),所以很重要的是看看你的GPU是否有足夠的內(nèi)存,以適應(yīng)足夠的數(shù)據(jù),CuPy是值得的。
英文原文:https://towardsdatascience.com/heres-how-to-use-cupy-to-make-numpy-700x-faster-4b920dda1f56
聯(lián)系客服