1. 程式人生 > 實用技巧 >CuPy:將Numpy提速700倍!

CuPy:將Numpy提速700倍!

https://zhuanlan.zhihu.com/p/80328224

前言

Numpy是Python社群的一份禮物。它允許資料科學家、機器學習實踐者和統計學家以一種簡單有效的方式處理矩陣式的海量資料。

當你發現Python程式碼執行緩慢時,特別是看到許多 for-loop迴圈時,那麼將資料處理遷移到Numpy並讓其向量化以最快的速度完成工作總是一個好主意!

儘管如此,即使這樣加速Numpy也只能在CPU上執行。由於使用者的CPU通常有8個或更少的核心,因此可以加速的速度是有限的。

如何解決這個問題,CuPy來啦!

相關文章

1、30倍!使用Cython加速Python程式碼

2、10個提高工作效率的Pandas小技巧

3、高逼格使用Pandas加速程式碼,向for迴圈說拜拜!

什麼是CuPy?

CuPy是一個通過利用CUDA GPU庫在Nvidia GPU上實現Numpy陣列的庫。通過這種實現,由於擁有許多CUDA核心GPU,可以實現更好的並行加速。

官網:

CuPy的介面是Numpy的映象,在大多數情況下,它可以被直接替代。只要用相容的CuPy程式碼替換你的Numpy程式碼,你就可以加快 GPU 的執行速度。CuPy將支援Numpy的大多數陣列操作,包括索引、廣播和各種矩陣轉換。

你也可以編寫自定義Python程式碼,利用CUDA和GPU加速,如果你有一些特定的東西還不支援的話。 只需要一小段C++格式的程式碼,CuPy就會自動執行GPU轉換,非常類似於使用Cython。

我們可以通過pip安裝這個庫:

pip install cupy

執行GPU基於CuPy

對於這些基準測試,我們將使用PC機進行以下設定:

  • i7–8700k CPU
  • 1080 Ti GPU
  • 32 GB of DDR4 3000MHz RAM
  • CUDA 9.0

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

import numpy as np
import cupy as cp
import time

對於剩下的程式碼,在Numpy和CuPy之間切換就像用CuPy的cp替換Numpy中的np一樣簡單。下面的程式碼為Numpy和CuPy建立了一個3D陣列,其中包含10億個1。 為了測試建立陣列的速度,使用了 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.507秒,而CuPy只花了0.000710秒。714.1倍的加速!

現在讓我們嘗試使用多個數組並執行一些操作:

### 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和矩陣操作的一個很好的方法。需要注意的是,你將獲得的加速度在很大程度上取決於所使用陣列的大小。下面的表格顯示了當我們改變陣列的大小時速度上的差異:

一旦:

達到約1000萬個資料點,加速度就會急劇上升!

而一旦:

超過1億個資料點,加速度就會大大加快!

在此之下:

Numpy實際上更快!

還要記住,更多的GPU記憶體將幫助你處理更多的資料,所以重要的是看看你的GPU是否有足夠的記憶體來容納足夠的資料,而 CuPy是值得的!

來自:

—End—