如何用CuPy來對Numpy進行700倍加速

編譯:ronghuaiyang

導讀

給大家試試GPU的威力!

如何用CuPy來對Numpy進行700倍加速

Numpy是Python社區的一份大禮。它允許數據科學家、機器學習使用者和統計學家以一種簡單有效的方式處理矩陣格式的大量數據。

即使就其本身而言,Numpy在速度方面已經比Python有了很大的提升。當你發現自己Python代碼運行緩慢,尤其是如果你看到很多的for循環,使用Numpy總是一個好主意,將數據處理成Numpy並讓其向量化工作,可以得到最高速度!

儘管如此,Numpy只在CPU上運行。對於通常只有8個或更少內核的消費級cpu,並行處理的數量以及因此可以達到的加速速度是有限的。

這時候,該我們的新朋友CuPy出場了!

什麼是CuPy?

CuPy是一個庫,它利用CUDA GPU庫在Nvidia GPU上實現Numpy數組的運算功能。有了這個實現,由於gpu的CUDA核有很多,可以實現更好的並行加速。

如何用CuPy來對Numpy進行700倍加速

CuPy的接口是Numpy的鏡像,在大多數情況下,它可以作為直接的替代。只要用兼容的CuPy代碼替換你的Numpy代碼,你就可以加使用GPU加速了。CuPy支持Numpy的大多數數組操作,包括索引、廣播、數組上的數學運算和各種矩陣轉換。

你也可以編寫自定義的Python代碼,利用CUDA和GPU加速,如果你有一些具體的東西還不支持。所需要的只是c++格式的一小段代碼,CuPy將自動執行GPU轉換,非常類似於使用Cython。

要開始與CuPy,我們可以通過pip安裝庫:

 pip install cupy

使用CuPy跑在GPU上

對於這些基準測試,我將使用以下配置的PC機進行測試:

  • i7-8700k的CPU
  • 1080 Ti GPU
  • 32gb的DDR4 3000MHz內存
  • CUDA 9.0

一旦安裝了CuPy,我們可以像Numpy一樣導入它:

 import numpy as np 

import cupy as cp
import time

對於剩下的代碼,在Numpy和CuPy之間切換就像用CuPy的cp替換Numpy的np一樣簡單。下面的代碼為Numpy和CuPy創建了一個包含10億個1的3D數組。為了測量創建數組的速度,我使用了Python的原生“time”庫:

 ### Numpy and CPU
s = time.time()
x_cpu = np.ones((1000,1000,1000))
e = time.time()
print(e - s)
### CuPy and GPU
s = time.time()
x_gpu = cp.ones((1000,1000,1000))
e = time.time()
print(e - s)

非常容易!

令人難以置信的是,即使這只是一個數組創建,CuPy仍然要快得多。Numpy在1.68秒內創建了包含10億個1的數組,而CuPy只花了0.16秒,這是10.5倍的加速!

但我們還可以做得更多。

讓我們試著對數組做一些數學運算。這次我們將整個數組乘以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倍的加速!

現在讓我們嘗試使用多個數組並執行一些操作。下面的代碼將做以下工作:

  1. 將數組乘以5
  2. 將數組與本身相乘
  3. 將數組加上自己
 ### Numpy and CPU
s = time.time()
x_cpu *= 5
x_cpu *= x_cpu
x_cpu += x_cpu
e = time.time()
print(e - s)
### CuPy and GPU
s = time.time()
x_gpu *= 5
x_gpu *= x_gpu
x_gpu += x_gpu
e = time.time()
print(e - s)

在本例中,Numpy在CPU上以1.49秒的時間執行完該進程,而CuPy在GPU上以0.0922秒的時間執行完該進程,仍然有16.16倍加速!

是不是超級快?

使用CuPy是在GPU上多次加速Numpy和矩陣運算的好方法。需要注意的是,你將獲得的加速高度依賴於你正在處理的數組的大小。下表顯示了我們改變數組大小時的速度差異:

如何用CuPy來對Numpy進行700倍加速

一旦我們達到大約1000萬個數據點,速度就會大大加快,而一旦超過1億個數據點,速度就會大大加快。在此之下,Numpy實際上更快。此外,請記住,更多的GPU內存將幫助你處理更多的數據,所以很重要的是看看你的GPU是否有足夠的內存,以適應足夠的數據,CuPy是值得的。

英文原文:https://towardsdatascience.com/heres-how-to-use-cupy-to-make-numpy-700x-faster-4b920dda1f56

如何用CuPy來對Numpy進行700倍加速


分享到:


相關文章: