資料科學 如何使用CuPy使Numpy更快

2021-09-26 15:21:52 字數 2585 閱讀 7356

numpy一直是python社群的禮物。它允許資料科學家,機器學習從業者和統計學家以簡單有效的方式處理矩陣格式的大量資料。

就速度而言,numpy本身就是python的重要一步。每當你發現你的python**執行緩慢時,特別是如果你看到很多for迴圈,那麼將資料處理轉移到numpy並讓它的向量化以最快的速度完成工作總是乙個好主意!

儘管如此,即使加速,numpy也只能在cpu上執行。由於消費者cpu通常具有8個核心或更少,因此並行處理量以及因此可以實現的加速量是有限的。

這就是我們的新朋友cupy進來的地方!

目錄

什麼是cupy?

使用cupy在gpu上執行

總是超級快嗎?

cupy是乙個通過利用cuda gpu庫在nvidia gpu上實現numpy陣列的庫。通過該實現,由於gpu具有許多cuda核心,因此可以實現優異的並行加速。

cupy的介面是numpy的映象,在大多數情況下,它可以用作直接替代品。只需用相容的cupy**替換你的numpy**,就可以獲得gpu加速。cupy將支援numpy所擁有的大多數陣列操作,包括索引,廣播,陣列上的數學和各種矩陣變換。

您還可以編寫自定義python**,如果您具有尚不支援的特定內容,則可以利用cuda和gpu加速。所需要的只是c ++格式**的一小部分,cupy會自動進行gpu轉換,非常類似於使用cython。

要開始使用cupy,我們可以通過pip安裝庫:

pip install cupy

對於這些基準測試,我將使用具有以下設定的pc:

安裝cupy後,我們可以像numpy一樣匯入它:

import numpy as np

import cupy as cp

import time

對於其餘的編碼,在numpy和cupy之間切換就像用npcupy 替換numpy一樣簡單cp。下面的**為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.507,而cupy只拿了0.000710; 這是乙個714.1x的加速!

現在讓我們嘗試使用多個陣列並執行一些操作。下面的**將執行以下操作:

多個陣列乘以5

多個陣列本身

將陣列新增到自身

### 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.16x加速!

使用cupy是在gpu上多次加速numpy和矩陣操作的好方法。重要的是要注意,您將獲得的加速很大程度上取決於您正在使用的陣列的大小。下表顯示了我們更改正在處理的陣列大小時的速度差異:

一旦我們達到大約1000萬個資料點,加速就會大幅提公升,一旦我們跨越1億個點數,速度就會快得多。在那之下,numpy實際上更快。另外請記住,更多的gpu記憶體將幫助您處理更多資料,因此,重要的是要了解您的gpu是否有足夠的記憶體來容納足夠的資料,而cupy是值得的。

如何科學使用Stack Overflow

作為一名程式設計師,如果沒有聽過 stackoverflow,那麼你最好去面壁思過一下。程式設計師最需要閱讀的一本程式設計書籍 其實程式設計書留下這本就夠了!那些還沒有讀過這本書的程式設計師,是時候買一本了。如果還在猶豫,那麼先看下這篇文章,看看為什麼離不開 stackoverflow。當你丟擲乙個...

如何科學使用Stack Overflow

作為一名程式設計師,如果沒有聽過 stackoverflow,那麼你最好去面壁思過一下。程式設計師最需要閱讀的一本程式設計書籍 其實程式設計書留下這本就夠了!那些還沒有讀過這本書的程式設計師,是時候買一本了。如果還在猶豫,那麼先看下這篇文章,看看為什麼離不開 stackoverflow。當你丟擲乙個...

python使用pip python如何使用pip

python 2.7.9 或 python 3.4 以上版本都自帶 pip 工具。pip 官網 可以通過以下命令來判斷是否已安裝 pip version sudo python get pip.py 執行安裝指令碼 注意 用哪個版本的 python 執行安裝指令碼,pip 就被關聯到哪個版本,如果是...